[PATCH] pid: document that do_each_pid_task() needs tasklist_lock

From: Oleg Nesterov

Date: Sun Oct 11 2026 - 12:33:03 EST


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@xxxxxxxxxx>
---
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