6.9-stable review patch. If anyone has any objections, please let me know.
------------------
From: Oleg Nesterov oleg@redhat.com
[ 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 --- kernel/pid_namespace.c | 1 + 1 file changed, 1 insertion(+)
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c index 7ade20e952321..415201ca0c7e4 100644 --- a/kernel/pid_namespace.c +++ b/kernel/pid_namespace.c @@ -218,6 +218,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);