(on top of "[PATCH v2] utrace: fix utrace_stop()->utrace_reset() path")

The callers of utrace_reset() should be careful with action argument,
it affects the wakeup logic. Imho this is a bit fragile and uncler.
Change utrace_reset to use ->stopped instead.

This way "if (wake)" is always right, regardless of action != NULL,
and very understandable. It can't provoke a false wakeup, and it
can't miss the wakeup if it is needed.

If ->stopped == F, obviously wakeup is not needed, even if the tracee
is TASK_STOPPED.

IF ->stopped == T, we must not leave the tracee without ENGINE_STOP
in TASK_TRACED once we drop utrace->lock.

Signed-off-by: Oleg Nesterov <o...@redhat.com>

--- __UTRACE/kernel/utrace.c~3_RESUME_WAKE      2009-08-26 14:19:01.000000000 
+0200
+++ __UTRACE/kernel/utrace.c    2009-08-26 14:22:58.000000000 +0200
@@ -730,7 +730,7 @@ static void utrace_reset(struct task_str
        struct utrace_engine *engine, *next;
        unsigned long flags = 0;
        LIST_HEAD(detached);
-       bool wake = !action;
+       bool wake = utrace->stopped;
 
        splice_attaching(utrace);
 

Reply via email to