From: Thomas Gleixner <tglx@kernel.org>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Hyunwoo Kim <imv4bel@gmail.com>, Oleg Nesterov <oleg@redhat.com>,
Frederic Weisbecker <frederic@kernel.org>,
Christian Brauner <brauner@kernel.org>,
Peter Zijlstra <peterz@infradead.org>,
John Stultz <jstultz@google.com>, Ingo Molnar <mingo@kernel.org>,
Alexander Viro <viro@zeniv.linux.org.uk>,
"Eric W. Biederman" <ebiederm@xmission.com>
Subject: [patch 7/8] posix-cpu-timers: Prevent enqueueing when PF_EXITING is set
Date: Fri, 04 Sep 2026 13:22:49 +0200 [thread overview]
Message-ID: <20260904112202.400768514@kernel.org> (raw)
In-Reply-To: <20260904112100.683893401@kernel.org>
To prepare for cleaning up POSIX CPU timers in do_exit(), prevent
enqueueing POSIX CPU timers on a task which has PF_EXITING set.
Queueing a timer on such a task is pointless because the task won't expire
the timer anymore.
Pretending that the timer is armed allows to keep the POSIX timer mechanism
"working" so that the timer stays accessible up to the point where a task
is unhashed.
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
---
kernel/time/posix-cpu-timers.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
--- a/kernel/time/posix-cpu-timers.c
+++ b/kernel/time/posix-cpu-timers.c
@@ -628,6 +628,7 @@ static int posix_cpu_timer_del(struct k_
}
if (!ret) {
+ WARN_ON_ONCE(cpu_timer_queued(&timer->it.cpu));
put_pid(timer->it.cpu.pid);
timer->it_status = POSIX_TIMER_DISARMED;
}
@@ -674,6 +675,15 @@ void posix_cpu_timers_exit_group(struct
cleanup_timers(&tsk->signal->posix_cputimers);
}
+static inline bool task_can_enqueue(struct k_itimer *timer, struct task_struct *p)
+{
+ if (likely(!(p->flags & PF_EXITING)))
+ return true;
+
+ /* Allow TGID type unless the last thread is on the way out. */
+ return clock_pid_type(timer->it_clock) == PIDTYPE_TGID && atomic_read(&p->signal->live);
+}
+
/*
* Insert the timer on the appropriate list before any timers that
* expire later. This must be called with the sighand lock held.
@@ -684,7 +694,24 @@ static void arm_timer(struct k_itimer *t
struct cpu_timer *ctmr = &timer->it.cpu;
u64 newexp = cpu_timer_getexpires(ctmr);
+ lockdep_assert_held(&p->sighand->siglock);
+
timer->it_status = POSIX_TIMER_ARMED;
+
+ /*
+ * Don't enqueue timers when the task or the group is exiting. That
+ * ensures that timer operations are still succeeding as long as the
+ * tasks are visible, but won't enqueue the timers on the task or
+ * process. They won't expire anyway because run_posix_cpu_timers()
+ * exits early when PF_EXITING is set.
+ *
+ * Enqueue is skipped if PF_EXITING is set when the timer is per task
+ * and when the last thread decremented p::signal::live to zero also for
+ * per process timers.
+ */
+ if (unlikely(!task_can_enqueue(timer, p)))
+ return;
+
if (!cpu_timer_enqueue(&base->tqhead, ctmr))
return;
next prev parent reply other threads:[~2026-09-04 11:22 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-04 11:22 [patch 0/8] exec/exit: POSIX timer related bugfixes and related cleanups Thomas Gleixner
2026-09-04 11:22 ` [patch 1/8] signal: Prevent exec() race Thomas Gleixner
2026-09-04 11:35 ` Oleg Nesterov
2026-09-05 7:34 ` Thomas Gleixner
2026-09-05 7:50 ` Frederic Weisbecker
2026-09-05 11:22 ` Thomas Gleixner
2026-09-04 11:22 ` [patch 2/8] exec: Cleanup POSIX timers right after de_thread() Thomas Gleixner
2026-09-04 11:22 ` [patch 3/8] posix-timers: Move posixtimer_exec_cleanup() out of exec.c Thomas Gleixner
2026-09-04 11:22 ` [patch 4/8] posix-timers: Move POSIX timer group exit related code out of do_exit() Thomas Gleixner
2026-09-04 11:22 ` [patch 5/8] posix-cpu-timers: Move inlines out of public header Thomas Gleixner
2026-09-04 11:22 ` [patch 6/8] posix-cpu-timers: Use PF_EXITING to indicate exit Thomas Gleixner
2026-09-04 11:22 ` Thomas Gleixner [this message]
2026-09-04 12:06 ` [patch 7/8] posix-cpu-timers: Prevent enqueueing when PF_EXITING is set Eric W. Biederman
2026-09-04 15:47 ` Eric W. Biederman
2026-09-05 7:50 ` Thomas Gleixner
2026-09-04 11:22 ` [patch 8/8] posix-timers: Handle exit in do_exit() completely Thomas Gleixner
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20260904112202.400768514@kernel.org \
--to=tglx@kernel.org \
--cc=brauner@kernel.org \
--cc=ebiederm@xmission.com \
--cc=frederic@kernel.org \
--cc=imv4bel@gmail.com \
--cc=jstultz@google.com \
--cc=linux-kernel@vger.kernel.org \
--cc=mingo@kernel.org \
--cc=oleg@redhat.com \
--cc=peterz@infradead.org \
--cc=viro@zeniv.linux.org.uk \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®