]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
exit: move wake_up_all() pidfd waiters into __unhash_process()
authorChristian Brauner <brauner@kernel.org>
Fri, 11 Apr 2025 13:22:44 +0000 (15:22 +0200)
committerChristian Brauner <brauner@kernel.org>
Sat, 12 Apr 2025 12:04:29 +0000 (14:04 +0200)
Move the pidfd notification out of __change_pid() and into
__unhash_process(). The only valid call to __change_pid() with a NULL
argument and PIDTYPE_PID is from __unhash_process(). This is a lot more
obvious than calling it from __change_pid().

Link: https://lore.kernel.org/20250411-work-pidfs-enoent-v2-1-60b2d3bb545f@kernel.org
Reviewed-by: Oleg Nesterov <oleg@redhat.com>
Signed-off-by: Christian Brauner <brauner@kernel.org>
kernel/exit.c
kernel/pid.c

index 1b51dc099f1e05cea8185d56e80c063bad62bf21..abcd93ce4e18c20d4feac29208dea12742fd571c 100644 (file)
@@ -133,8 +133,13 @@ struct release_task_post {
 static void __unhash_process(struct release_task_post *post, struct task_struct *p,
                             bool group_dead)
 {
+       struct pid *pid = task_pid(p);
+
        nr_threads--;
+
        detach_pid(post->pids, p, PIDTYPE_PID);
+       wake_up_all(&pid->wait_pidfd);
+
        if (group_dead) {
                detach_pid(post->pids, p, PIDTYPE_TGID);
                detach_pid(post->pids, p, PIDTYPE_PGID);
index 4ac2ce46817fdefff8888681bb5ca3f2676e8add..26f1e136f01786df2e17682fdb172573f7d59328 100644 (file)
@@ -359,11 +359,6 @@ static void __change_pid(struct pid **pids, struct task_struct *task,
        hlist_del_rcu(&task->pid_links[type]);
        *pid_ptr = new;
 
-       if (type == PIDTYPE_PID) {
-               WARN_ON_ONCE(pid_has_task(pid, PIDTYPE_PID));
-               wake_up_all(&pid->wait_pidfd);
-       }
-
        for (tmp = PIDTYPE_MAX; --tmp >= 0; )
                if (pid_has_task(pid, tmp))
                        return;