From: Oleg Nesterov <oleg@redhat.com>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: linux-kernel@vger.kernel.org, Eric Dumazet <edumazet@google.com>,
Frederic Weisbecker <frederic@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
Waiman Long <longman@redhat.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH] task_work: Consume only item at a time while invoking the callbacks.
Date: Sun, 23 Feb 2025 23:40:15 +0100 [thread overview]
Message-ID: <20250223224014.GC23282@redhat.com> (raw)
In-Reply-To: <20250221170530.L3yMvO0i@linutronix.de>
Well... I won't really argue because I can't suggest a better fix at
least right now. Most probably never.
However, let me say that this patch doesn't make me happy ;) See below.
On 02/21, Sebastian Andrzej Siewior wrote:
>
> Oleg pointed out that this might be problematic if one closes 2.000.000
> files at once. While testing this scenario by opening that many files
> following by exit() to ensure that all files are closed at once, I did
> not observe anything outside of noise.
and this probably means that we can revert c82199061009 ("task_work: remove
fifo ordering guarantee") and restore the fifo ordering which IMO makes much
more sense.
But:
> Fixes: c5d93d23a2601 ("perf: Enqueue SIGTRAP always via task_work.")
Yes. So, to fix this specific problem in perf this patch changes task_work.c
And after this change we can never enforce a "clear" ordering, fifo or even lifo.
The ordering is simply "unpredictable/random".
I'll try to find and read the previous discussions tomorrow, but iirc Frederic
had another solution?
Oleg.
> --- a/kernel/task_work.c
> +++ b/kernel/task_work.c
> @@ -194,7 +194,7 @@ bool task_work_cancel(struct task_struct *task, struct callback_head *cb)
> void task_work_run(void)
> {
> struct task_struct *task = current;
> - struct callback_head *work, *head, *next;
> + struct callback_head *work, *head;
>
> for (;;) {
> /*
> @@ -202,17 +202,7 @@ void task_work_run(void)
> * work_exited unless the list is empty.
> */
> work = READ_ONCE(task->task_works);
> - do {
> - head = NULL;
> - if (!work) {
> - if (task->flags & PF_EXITING)
> - head = &work_exited;
> - else
> - break;
> - }
> - } while (!try_cmpxchg(&task->task_works, &work, head));
> -
> - if (!work)
> + if (!work && !(task->flags & PF_EXITING))
> break;
> /*
> * Synchronize with task_work_cancel_match(). It can not remove
> @@ -220,13 +210,24 @@ void task_work_run(void)
> * But it can remove another entry from the ->next list.
> */
> raw_spin_lock_irq(&task->pi_lock);
> + do {
> + head = NULL;
> + if (work) {
> + head = READ_ONCE(work->next);
> + } else {
> + if (task->flags & PF_EXITING)
> + head = &work_exited;
> + else
> + break;
> + }
> + } while (!try_cmpxchg(&task->task_works, &work, head));
> raw_spin_unlock_irq(&task->pi_lock);
>
> - do {
> - next = work->next;
> - work->func(work);
> - work = next;
> + if (!work)
> + break;
> + work->func(work);
> +
> + if (head)
> cond_resched();
> - } while (work);
> }
> }
> --
> 2.47.2
>
next prev parent reply other threads:[~2025-02-23 22:40 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-21 17:05 [PATCH] task_work: Consume only item at a time while invoking the callbacks Sebastian Andrzej Siewior
2025-02-23 22:40 ` Oleg Nesterov [this message]
2025-02-25 14:28 ` Frederic Weisbecker
2025-02-25 16:35 ` Oleg Nesterov
2025-02-25 22:20 ` Frederic Weisbecker
2025-02-26 13:13 ` Oleg Nesterov
2025-02-26 14:01 ` Oleg Nesterov
2025-02-26 14:42 ` Frederic Weisbecker
2025-02-26 18:36 ` Oleg Nesterov
2025-02-26 14:16 ` Sebastian Andrzej Siewior
2025-02-26 14:29 ` Oleg Nesterov
2025-02-26 14:32 ` Sebastian Andrzej Siewior
2025-02-26 12:50 ` Oleg Nesterov
2025-02-26 13:08 ` Frederic Weisbecker
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250223224014.GC23282@redhat.com \
--to=oleg@redhat.com \
--cc=bigeasy@linutronix.de \
--cc=edumazet@google.com \
--cc=frederic@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=longman@redhat.com \
--cc=peterz@infradead.org \
--cc=tglx@linutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.