From: Oleg Nesterov oleg@redhat.com
stable inclusion from stable-v5.10.221 commit 82c7acf9a12c9b4e4b0aba531de82b4e39a345c8 category: bugfix bugzilla: https://gitee.com/openeuler/kernel/issues/IAOPW2
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=...
--------------------------------
[ Upstream commit 7fea700e04bd3f424c2d836e98425782f97b494e ]
kernel_wait4() doesn't sleep and returns -EINTR if there is no eligible child and signal_pending() is true.
That is why zap_pid_ns_processes() clears TIF_SIGPENDING but this is not enough, it should also clear TIF_NOTIFY_SIGNAL to make signal_pending() return false and avoid a busy-wait loop.
Link: https://lkml.kernel.org/r/20240608120616.GB7947@redhat.com Fixes: 12db8b690010 ("entry: Add support for TIF_NOTIFY_SIGNAL") Signed-off-by: Oleg Nesterov oleg@redhat.com Reported-by: Rachel Menge rachelmenge@linux.microsoft.com Closes: https://lore.kernel.org/all/1386cd49-36d0-4a5c-85e9-bc42056a5a38@linux.micro... Reviewed-by: Boqun Feng boqun.feng@gmail.com Tested-by: Wei Fu fuweid89@gmail.com Reviewed-by: Jens Axboe axboe@kernel.dk Cc: Allen Pais apais@linux.microsoft.com Cc: Christian Brauner brauner@kernel.org Cc: Frederic Weisbecker frederic@kernel.org Cc: Joel Fernandes (Google) joel@joelfernandes.org Cc: Joel Granados j.granados@samsung.com Cc: Josh Triplett josh@joshtriplett.org Cc: Lai Jiangshan jiangshanlai@gmail.com Cc: Mateusz Guzik mjguzik@gmail.com Cc: Mathieu Desnoyers mathieu.desnoyers@efficios.com Cc: Mike Christie michael.christie@oracle.com Cc: Neeraj Upadhyay neeraj.upadhyay@kernel.org Cc: Paul E. McKenney paulmck@kernel.org Cc: Steven Rostedt (Google) rostedt@goodmis.org Cc: Zqiang qiang.zhang1211@gmail.com Cc: Thomas Gleixner tglx@linutronix.de Signed-off-by: Andrew Morton akpm@linux-foundation.org Signed-off-by: Sasha Levin sashal@kernel.org Signed-off-by: Wang Hai wanghai38@huawei.com Signed-off-by: Chen Ridong chenridong@huawei.com --- kernel/pid_namespace.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index c290d21b6c24..5ce974421a83 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c @@ -222,6 +222,7 @@ void zap_pid_ns_processes(struct pid_namespace *pid_ns) */ do { clear_thread_flag(TIF_SIGPENDING); + clear_thread_flag(TIF_NOTIFY_SIGNAL); rc = kernel_wait4(-1, NULL, __WALL, NULL); } while (rc != -ECHILD);