lkml.org 
[lkml]   [2005]   [Sep]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
/
Date
From
SubjectRe: [PATCH] fix TASK_STOPPED vs TASK_NONINTERACTIVE interaction


On Fri, 30 Sep 2005, Oleg Nesterov wrote:
>
> Roland, could you please explain this code in wait_task_stopped()
>
> if (!exit_code || p->state > TASK_STOPPED)
> goto bail_ref;

Regardless of any other explanations, it turns out that "p->state" can be
something like "TASK_RUNNING | TASK_NONINTERACTIVE", and then this would
trigger totally incorrectly.

> It looks like "WSTOPPED | WNOWAIT is illegal for TASK_TRACED child"
> to me. Is this correct? I think no.

No, I think it's correct. If you have a traced child, you can't just wait
for it. You need to use ptrace to release it first.

> Actually, I don't understand why we are checking p->state at all, we
> already dropped tasklist_lock, the state can change at any monent.

If it's TASK_TRACED, and it's our child, then it shouldn't be changing.

Besides, even if it does, we had a perfectly fine race, and we'll have
been woken up again and we'll just go through the do_wait() loop once
more.

So I think the code is mostly correct. But that ">" is definitely
incorrect.

Maybe it should just be

if (!exit_code || (p->state & TASK_TRACED))

instead?

Roland?

Linus
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2009-11-18 23:46    [W:0.069 / U:1.792 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site