Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

cgroup: Don't expose dead tasks in cgroup

Once a task exits it has its state set to TASK_DEAD and then it is
removed from the cgroup it belonged to. The last step happens on the task
gets out of its last schedule() invocation and is delayed on PREEMPT_RT
due to locking constraints.

As a result it is possible to receive a pid via waitpid() of a task
which is still listed in cgroup.procs for the cgroup it belonged
to. This is something that systemd does not expect and as a result it
waits for its exit until a time out occurs.
This can also be reproduced on !PREEMPT_RT kernel with a significant
delay in do_exit() after exit_notify().

Hide the task from the output which have PF_EXITING set which is done
before the parent is notified. Keeping zombies with live threads
shouldn't break anything (suggested by Tejun).

Reported-by: Bert Karwatzki <spasswolf@web.de>
Closes: https://lore.kernel.org/all/20260219164648.3014-1-spasswolf@web.de/
Tested-by: Bert Karwatzki <spasswolf@web.de>
Fixes: 9311e6c29b34 ("cgroup: Fix sleeping from invalid context warning on PREEMPT_RT")
Cc: stable@vger.kernel.org # v6.19+
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Signed-off-by: Tejun Heo <tj@kernel.org>

authored by

Sebastian Andrzej Siewior and committed by
Tejun Heo
a72f73c4 ca174c70

+6
+6
kernel/cgroup/cgroup.c
··· 5109 5109 return; 5110 5110 5111 5111 task = list_entry(it->task_pos, struct task_struct, cg_list); 5112 + /* 5113 + * Hide tasks that are exiting but not yet removed. Keep zombie 5114 + * leaders with live threads visible. 5115 + */ 5116 + if ((task->flags & PF_EXITING) && !atomic_read(&task->signal->live)) 5117 + goto repeat; 5112 5118 5113 5119 if (it->flags & CSS_TASK_ITER_PROCS) { 5114 5120 /* if PROCS, skip over tasks which aren't group leaders */