The patch below does not apply to the 5.4-stable tree. If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to stable@vger.kernel.org.
To reproduce the conflict and resubmit, you may use the following commands:
git fetch https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/ linux-5.4.y git checkout FETCH_HEAD git cherry-pick -x f90fff1e152dedf52b932240ebbd670d83330eca # <resolve conflicts, build, test, etc.> git commit -s git send-email --to 'stable@vger.kernel.org' --in-reply-to '2025061744-precinct-rubble-45c9@gregkh' --subject-prefix 'PATCH 5.4.y' HEAD^..
Possible dependencies:
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From f90fff1e152dedf52b932240ebbd670d83330eca Mon Sep 17 00:00:00 2001 From: Oleg Nesterov oleg@redhat.com Date: Fri, 13 Jun 2025 19:26:50 +0200 Subject: [PATCH] posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del() MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit
If an exiting non-autoreaping task has already passed exit_notify() and calls handle_posix_cpu_timers() from IRQ, it can be reaped by its parent or debugger right after unlock_task_sighand().
If a concurrent posix_cpu_timer_del() runs at that moment, it won't be able to detect timer->it.cpu.firing != 0: cpu_timer_task_rcu() and/or lock_task_sighand() will fail.
Add the tsk->exit_state check into run_posix_cpu_timers() to fix this.
This fix is not needed if CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y, because exit_task_work() is called before exit_notify(). But the check still makes sense, task_work_add(&tsk->posix_cputimers_work.work) will fail anyway in this case.
Cc: stable@vger.kernel.org Reported-by: Benoît Sevens bsevens@google.com Fixes: 0bdd2ed4138e ("sched: run_posix_cpu_timers: Don't check ->exit_state, use lock_task_sighand()") Signed-off-by: Oleg Nesterov oleg@redhat.com Signed-off-by: Linus Torvalds torvalds@linux-foundation.org
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c index 50e8d04ab661..2e5b89d7d866 100644 --- a/kernel/time/posix-cpu-timers.c +++ b/kernel/time/posix-cpu-timers.c @@ -1405,6 +1405,15 @@ void run_posix_cpu_timers(void)
lockdep_assert_irqs_disabled();
+ /* + * Ensure that release_task(tsk) can't happen while + * handle_posix_cpu_timers() is running. Otherwise, a concurrent + * posix_cpu_timer_del() may fail to lock_task_sighand(tsk) and + * miss timer->it.cpu.firing != 0. + */ + if (tsk->exit_state) + return; + /* * If the actual expiry is deferred to task work context and the * work is already scheduled there is no point to do anything here.
[ Sasha's backport helper bot ]
Hi,
✅ All tests passed successfully. No issues detected. No action required from the submitter.
The upstream commit SHA1 provided is correct: f90fff1e152dedf52b932240ebbd670d83330eca
Status in newer kernel trees: 6.15.y | Present (different SHA1: d65f6c68f7b1) 6.12.y | Present (different SHA1: 18a3e65f32ed) 6.6.y | Present (different SHA1: 8db5813e9ad7) 6.1.y | Present (different SHA1: 61fa08967f27) 5.15.y | Present (different SHA1: f6e90a3258e0) 5.10.y | Present (different SHA1: 1c179c7c3b82)
Note: The patch differs from the upstream commit: --- 1: f90fff1e152de ! 1: 933e5cbcf266c posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del() @@ Metadata Author: Oleg Nesterov oleg@redhat.com
## Commit message ## - posix-cpu-timers: fix race between handle_posix_cpu_timers() and posix_cpu_timer_del() + FAILED: patch "[PATCH] posix-cpu-timers: fix race between handle_posix_cpu_timers()" failed to apply to 5.4-stable tree + + On 06/17, gregkh@linuxfoundation.org wrote: + > + > The patch below does not apply to the 5.4-stable tree. + + Please see the attached patch for 5.4.y + + Oleg. + + From a3dbb5447bc9a8f9c04ffa5381b0a0bd77b1bdd5 Mon Sep 17 00:00:00 2001 + From: Oleg Nesterov oleg@redhat.com + Date: Tue, 17 Jun 2025 19:15:50 +0200 + Subject: [PATCH 5.4.y] posix-cpu-timers: fix race between + handle_posix_cpu_timers() and posix_cpu_timer_del() + MIME-Version: 1.0 + Content-Type: text/plain; charset=UTF-8 + Content-Transfer-Encoding: 8bit + + commit f90fff1e152dedf52b932240ebbd670d83330eca upstream.
If an exiting non-autoreaping task has already passed exit_notify() and calls handle_posix_cpu_timers() from IRQ, it can be reaped by its parent @@ kernel/time/posix-cpu-timers.c: void run_posix_cpu_timers(void) + return; + /* - * If the actual expiry is deferred to task work context and the - * work is already scheduled there is no point to do anything here. + * The fast path checks that there are no expired thread or thread + * group timers. If that's so, just return. ---
Results of testing on various branches:
| Branch | Patch Apply | Build Test | |---------------------------|-------------|------------| | stable/linux-5.4.y | Success | Success |
linux-stable-mirror@lists.linaro.org