* [PATCH] pid: document that do_each_pid_task() needs tasklist_lock
@ 2026-10-11 14:16 Oleg Nesterov
2026-10-12 8:40 ` Christian Brauner
2026-10-12 12:54 ` David Laight
0 siblings, 2 replies; 3+ messages in thread
From: Oleg Nesterov @ 2026-10-11 14:16 UTC (permalink / raw)
To: Andrew Morton; +Cc: Christian Brauner, David Laight, Mingyu Wang, linux-kernel
do_each_pid_task() looks "obviously rcu-safe". This confuses people
and we already have 2 buggy users: send_sigio() and send_sigurg().
The reasons why it is not are not obvious at all, add the comment.
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
---
include/linux/pid.h | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/include/linux/pid.h b/include/linux/pid.h
index ddaef0bbc8ba..f5476d7140a3 100644
--- a/include/linux/pid.h
+++ b/include/linux/pid.h
@@ -187,6 +187,15 @@ static inline pid_t pid_nr(struct pid *pid)
pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns);
pid_t pid_vnr(struct pid *pid);
+/*
+ * Needs tasklist_lock if type > PIDTYPE_TGID. A lockless reader can:
+ *
+ * - race with a change_pid() that moves the task to another hlist,
+ * and continue to scan the wrong list.
+ *
+ * - race with a copy_process() that adds a new task to the start of hlist,
+ * and miss the new child.
+ */
#define do_each_pid_task(pid, type, task) \
do { \
if ((pid) != NULL) \
--
2.55.0
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] pid: document that do_each_pid_task() needs tasklist_lock
2026-10-11 14:16 [PATCH] pid: document that do_each_pid_task() needs tasklist_lock Oleg Nesterov
@ 2026-10-12 8:40 ` Christian Brauner
2026-10-12 12:54 ` David Laight
1 sibling, 0 replies; 3+ messages in thread
From: Christian Brauner @ 2026-10-12 8:40 UTC (permalink / raw)
To: Andrew Morton, Oleg Nesterov; +Cc: David Laight, Mingyu Wang, linux-kernel
On Sun, 11 Oct 2026 16:16:51 +0200, Oleg Nesterov wrote:
> do_each_pid_task() looks "obviously rcu-safe". This confuses people
> and we already have 2 buggy users: send_sigio() and send_sigurg().
>
> The reasons why it is not are not obvious at all, add the comment.
Applied to the kernel-7.4.signal branch of the vfs/vfs.git tree.
Patches in the kernel-7.4.signal branch should appear in linux-next soon.
Please report any outstanding bugs that were missed during review in a
new review to the original patch series allowing us to drop it.
It's encouraged to provide Acked-bys and Reviewed-bys even though the
patch has now been applied. If possible patch trailers will be updated.
Note that commit hashes shown below are subject to change due to rebase,
trailer updates or similar. If in doubt, please check the listed branch.
tree: https://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs.git
branch: kernel-7.4.signal
[1/1] pid: document that do_each_pid_task() needs tasklist_lock
https://git.kernel.org/vfs/vfs/c/41e24dc80739
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] pid: document that do_each_pid_task() needs tasklist_lock
2026-10-11 14:16 [PATCH] pid: document that do_each_pid_task() needs tasklist_lock Oleg Nesterov
2026-10-12 8:40 ` Christian Brauner
@ 2026-10-12 12:54 ` David Laight
1 sibling, 0 replies; 3+ messages in thread
From: David Laight @ 2026-10-12 12:54 UTC (permalink / raw)
To: Oleg Nesterov; +Cc: Andrew Morton, Christian Brauner, Mingyu Wang, linux-kernel
On Sun, 11 Oct 2026 16:16:51 +0200
Oleg Nesterov <oleg@redhat.com> wrote:
> do_each_pid_task() looks "obviously rcu-safe". This confuses people
> and we already have 2 buggy users: send_sigio() and send_sigurg().
>
> The reasons why it is not are not obvious at all, add the comment.
>
> Signed-off-by: Oleg Nesterov <oleg@redhat.com>
> ---
> include/linux/pid.h | 9 +++++++++
> 1 file changed, 9 insertions(+)
>
> diff --git a/include/linux/pid.h b/include/linux/pid.h
> index ddaef0bbc8ba..f5476d7140a3 100644
> --- a/include/linux/pid.h
> +++ b/include/linux/pid.h
> @@ -187,6 +187,15 @@ static inline pid_t pid_nr(struct pid *pid)
> pid_t pid_nr_ns(struct pid *pid, struct pid_namespace *ns);
> pid_t pid_vnr(struct pid *pid);
>
> +/*
> + * Needs tasklist_lock if type > PIDTYPE_TGID. A lockless reader can:
Think I'd be more explicit, so:
... if type isn't PIDTYPE_PID or PIDTYPE_TGID.
David
> + *
> + * - race with a change_pid() that moves the task to another hlist,
> + * and continue to scan the wrong list.
> + *
> + * - race with a copy_process() that adds a new task to the start of hlist,
> + * and miss the new child.
> + */
> #define do_each_pid_task(pid, type, task) \
> do { \
> if ((pid) != NULL) \
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2026-10-12 12:54 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-10-11 14:16 [PATCH] pid: document that do_each_pid_task() needs tasklist_lock Oleg Nesterov
2026-10-12 8:40 ` Christian Brauner
2026-10-12 12:54 ` David Laight
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®