summaryrefslogtreecommitdiffstats
path: root/kernel/time
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2024-11-05 09:14:29 +0100
committerThomas Gleixner <tglx@linutronix.de>2024-11-07 02:14:43 +0100
commit15cbfb92efee5c7f09e531a331e19759dbe0ac3c (patch)
tree946ee7c64cab11e472d69df24b761d1c39437dd4 /kernel/time
parenttimekeeping: Always check for negative motion (diff)
downloadlinux-15cbfb92efee5c7f09e531a331e19759dbe0ac3c.tar.xz
linux-15cbfb92efee5c7f09e531a331e19759dbe0ac3c.zip
posix-cpu-timers: Correctly update timer status in posix_cpu_timer_del()
If posix_cpu_timer_del() exits early due to task not found or sighand invalid, it fails to clear the state of the timer. That's harmless but inconsistent. These early exits are accounted as successful delete. Move the update of the timer state into the success return path, so all "successful" deletions are handled. Reported-by: Frederic Weisbecker <frederic@kernel.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Frederic Weisbecker <frederic@kernel.org> Link: https://lore.kernel.org/all/20241105064212.974053438@linutronix.de
Diffstat (limited to 'kernel/time')
-rw-r--r--kernel/time/posix-cpu-timers.c12
1 files changed, 6 insertions, 6 deletions
diff --git a/kernel/time/posix-cpu-timers.c b/kernel/time/posix-cpu-timers.c
index 12f828d704b1..5f444e372464 100644
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -493,20 +493,20 @@ static int posix_cpu_timer_del(struct k_itimer *timer)
*/
WARN_ON_ONCE(ctmr->head || timerqueue_node_queued(&ctmr->node));
} else {
- if (timer->it.cpu.firing) {
+ if (timer->it.cpu.firing)
ret = TIMER_RETRY;
- } else {
+ else
disarm_timer(timer, p);
- timer->it_status = POSIX_TIMER_DISARMED;
- }
unlock_task_sighand(p, &flags);
}
out:
rcu_read_unlock();
- if (!ret)
- put_pid(ctmr->pid);
+ if (!ret) {
+ put_pid(ctmr->pid);
+ timer->it_status = POSIX_TIMER_DISARMED;
+ }
return ret;
}