On 08/20, Peter Zijlstra wrote:
>
> +static void __task_work_run(struct callback_head *tail)
>  {
> -     struct task_struct *task = current;
> -     struct callback_head *p, *q;
> -
> -     while (1) {
> -             raw_spin_lock_irq(&task->pi_lock);
> -             p = task->task_works;
> -             task->task_works = NULL;
> -             raw_spin_unlock_irq(&task->pi_lock);
> -
> -             if (unlikely(!p))
> -                     return;
> -
> -             q = p->next; /* head */
> -             p->next = NULL; /* cut it */
> -             while (q) {
> -                     p = q->next;
> -                     q->func(q);
> -                     q = p;
> +     struct callback_head **head = &current->task_works;
> +
> +     do {
> +             struct callback_head *work = xchg(head, NULL);
> +             while (work) {
> +                     struct callback_head *next = ACCESS_ONCE(work->next);
> +
> +                     WARN_ON_ONCE(work == &dead);
> +
> +                     work->func(work);
> +                     work = next;
>               }
> -     }
> +     } while (cmpxchg(head, NULL, tail) != NULL);

Yes, we can add the explicit argument to __task_work_run(), but it can
check PF_EXITING instead, this looks simpler to me.

Note also your patch breaks fifo, but this is fixable.

Oleg.

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

Reply via email to