From 41e24dc80739b07d592566ceeaf0bb5e3620cc5c Mon Sep 17 00:00:00 2001 From: Oleg Nesterov Date: Sun, 11 Oct 2026 16:16:51 +0200 Subject: pid: document that do_each_pid_task() needs tasklist_lock 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 Link: https://patch.msgid.link/asuaU8H_5MbO3-cW@redhat.com Signed-off-by: Christian Brauner (Amutable) --- include/linux/pid.h | 9 +++++++++ 1 file changed, 9 insertions(+) (limited to 'include/linux') 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) \ -- cgit v1.2.3