When utrace_get_signal() is called with interrupt || report || signal_handler,
it sets event = 0 and, unless UTRACE_SIGNAL_IGN, does the reporting. However
this is meaningless without QUIESCE in ->utrace_flags, list_for_each_entry()
will check "want & QUIESCE" anyway.

I noticed this during the testing, sometimes utrace_get_signal() returns
signr != 0 even if there are no engines with ->flag != 0. Correct, but imho
is not very clear.

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

--- __UTRACE/kernel/utrace.c~8_UGS_CK_QUIESCE   2009-08-26 19:22:02.000000000 
+0200
+++ __UTRACE/kernel/utrace.c    2009-08-30 20:45:41.000000000 +0200
@@ -1939,7 +1939,8 @@ int utrace_get_signal(struct task_struct
 
                spin_unlock(&utrace->lock);
 
-               if (unlikely(report.result == UTRACE_SIGNAL_IGN))
+               if (!(task->utrace_flags & UTRACE_EVENT(QUIESCE)) ||
+                   unlikely(report.result == UTRACE_SIGNAL_IGN))
                        /*
                         * We only got here to clear utrace->signal_handler.
                         */

Reply via email to