From: Oleg Nesterov <oleg@redhat.com>
To: w15303746062@163.com, David Laight <david.laight.linux@gmail.com>
Cc: jlayton@kernel.org, chuck.lever@oracle.com,
viro@zeniv.linux.org.uk, brauner@kernel.org,
alex.aring@gmail.com, jack@suse.cz,
linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org,
Mingyu Wang <25181214217@stu.xidian.edu.cn>
Subject: Re: [PATCH v2] fs/fcntl: fix SOFTIRQ-unsafe lock order in fasync signaling
Date: Sun, 11 Oct 2026 17:57:03 +0200 [thread overview]
Message-ID: <asuxzwl4iWjjEjRD@redhat.com> (raw)
In-Reply-To: <asI5Fn87_SoEd4G5@redhat.com>
Nobody replied ;)
In case it was not clear, I believe the commit 00633c4683828
("fs/fcntl: fix SOFTIRQ-unsafe lock order in fasync signaling")
backported to stable trees is wrong.
Right now the fix is not clear to me, I don't even fully understand
the changelog:
The deadlock is caused by the rwlock writer fairness mechanism:
1. CPU 0 (process context) holds read_lock(&tasklist_lock) in do_wait().
2. CPU 1 (process context) attempts write_lock(&tasklist_lock) in
fork() or exit() and spins, which blocks all new readers.
see below ...
3. CPU 0 is interrupted by a softirq (e.g., TCP URG packet reception).
4. The softirq calls send_sigurg() and attempts to acquire
read_lock(&tasklist_lock), deadlocking because CPU 1 is waiting.
but queued_read_lock_slowpath() does not block the reader if
in_interrupt() == T ?
Mingyu, could you provide more details? How was this problem reported?
So far I only sent the doc patch to explain that we can't simply avoid tasklist:
[PATCH] pid: document that do_each_pid_task() needs tasklist_lock
https://lore.kernel.org/all/asuaU8H_5MbO3-cW@redhat.com/
Oleg.
On 10/04, Oleg Nesterov wrote:
>
> Hi,
>
> On 05/23, w15303746062@163.com wrote:
> >
> > Since PID hashing and do_each_pid_task() traversals are already
> > RCU-protected, the read_lock on tasklist_lock is no longer strictly
> > required for safe traversal. Fix this by replacing tasklist_lock with
> > rcu_read_lock(),
>
> I don't think we can simply avoid tasklist_lock. Let me quote my old email,
>
> do_each_pid_task(PIDTYPE_PGID) can race with change_pid(PIDTYPE_PGID)
> which moves the task from one hlist to another. Yes, it is safe in
> that task_struct can't go away. But still this is not right because
> do_each_pid_task() can scan the wrong (2nd) hlist.
>
> And... I need to recheck, but perhaps signal_struct->multiprocess logic
> is another reason why the lockless do_each_pid_task() is wrong...
>
> See also the recent discussion
> https://lore.kernel.org/all/20261003182224.2171b574@pumpkin/
>
> Oleg.
>
> > --- a/fs/fcntl.c
> > +++ b/fs/fcntl.c
> > @@ -929,11 +929,11 @@ void send_sigio(struct fown_struct *fown, int fd, int band)
> > send_sigio_to_task(p, fown, fd, band, type);
> > rcu_read_unlock();
> > } else {
> > - read_lock(&tasklist_lock);
> > + rcu_read_lock();
> > do_each_pid_task(pid, type, p) {
> > send_sigio_to_task(p, fown, fd, band, type);
> > } while_each_pid_task(pid, type, p);
> > - read_unlock(&tasklist_lock);
> > + rcu_read_unlock();
> > }
> > out_unlock_fown:
> > read_unlock_irqrestore(&fown->lock, flags);
> > @@ -975,11 +975,11 @@ int send_sigurg(struct file *file)
> > send_sigurg_to_task(p, fown, type);
> > rcu_read_unlock();
> > } else {
> > - read_lock(&tasklist_lock);
> > + rcu_read_lock();
> > do_each_pid_task(pid, type, p) {
> > send_sigurg_to_task(p, fown, type);
> > } while_each_pid_task(pid, type, p);
> > - read_unlock(&tasklist_lock);
> > + rcu_read_unlock();
> > }
> > out_unlock_fown:
> > read_unlock_irqrestore(&fown->lock, flags);
> > --
> > 2.34.1
> >
next prev parent reply other threads:[~2026-10-11 15:57 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-05-23 8:02 [PATCH] fs/fcntl: fix SOFTIRQ-unsafe lock order in send_sigio() w15303746062
2026-05-23 11:08 ` Jeff Layton
2026-05-23 13:52 ` [PATCH v2] fs/fcntl: fix SOFTIRQ-unsafe lock order in fasync signaling w15303746062
2026-05-28 12:40 ` Christian Brauner
2026-10-04 11:31 ` Oleg Nesterov
2026-10-11 15:57 ` Oleg Nesterov [this message]
2026-10-12 1:42 ` Mingyu Wang
2026-10-12 15:39 ` Oleg Nesterov
2026-10-12 16:00 ` Mingyu Wang
2026-10-12 16:29 ` Oleg Nesterov
2026-10-12 17:33 ` Oleg Nesterov
2026-10-13 1:36 ` Mingyu Wang
2026-10-12 11:59 ` Jeff Layton
2026-10-12 15:15 ` Oleg Nesterov
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=asuxzwl4iWjjEjRD@redhat.com \
--to=oleg@redhat.com \
--cc=25181214217@stu.xidian.edu.cn \
--cc=alex.aring@gmail.com \
--cc=brauner@kernel.org \
--cc=chuck.lever@oracle.com \
--cc=david.laight.linux@gmail.com \
--cc=jack@suse.cz \
--cc=jlayton@kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=viro@zeniv.linux.org.uk \
--cc=w15303746062@163.com \
/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.