On 08/11, Roland McGrath wrote: > > @@ -1298,14 +1305,14 @@ static void finish_report(struct utrace_ > { > bool clean = (report->takers && !report->detaches); > > - if (report->action <= UTRACE_REPORT && !utrace->report) { > - spin_lock(&utrace->lock); > - utrace->report = 1; > - set_tsk_thread_flag(task, TIF_NOTIFY_RESUME); > - } else if (report->action == UTRACE_INTERRUPT && !utrace->interrupt) { > + if (report->action == UTRACE_INTERRUPT && !utrace->interrupt) { > spin_lock(&utrace->lock); > utrace->interrupt = 1; > set_tsk_thread_flag(task, TIF_SIGPENDING); > + } else if (report->action <= UTRACE_REPORT && !utrace->report) { > + spin_lock(&utrace->lock); > + utrace->report = 1;
Hmm. I think this is not exacly right. Suppose that report->action == UTRACE_INTERRUPT but utrace->interrupt is already set. In that case, since UTRACE_INTERRUPT <= UTRACE_REPORT, we set ->report. Not really bad, but not right anyway. Oleg.