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.

Reply via email to