From: Thomas Gleixner <tglx@linutronix.de>
To: Frederic Weisbecker <frederic@kernel.org>
Cc: LKML <linux-kernel@vger.kernel.org>,
Anna-Maria Behnsen <anna-maria@linutronix.de>,
Peter Zijlstra <peterz@infradead.org>,
Sebastian Siewior <bigeasy@linutronix.de>,
syzbot+5c54bd3eb218bb595aa9@syzkaller.appspotmail.com,
Dmitry Vyukov <dvyukov@google.com>,
Michael Kerrisk <mtk.manpages@gmail.com>
Subject: [patch v2 01/20] posix-timers: Prevent RT livelock in itimer_delete()
Date: Thu, 01 Jun 2023 21:00:06 +0200 [thread overview]
Message-ID: <877csndn49.ffs@tglx> (raw)
In-Reply-To: <875y9743dt.ffs@tglx>
itimer_delete() has a retry loop when the timer is concurrently expired. On
non-RT kernels this just spin-waits until the timer callback has completed.
On RT kernels this is a potential livelock when the exiting task preempted
the hrtimer soft interrupt.
Replace spin_unlock() with an invocation of timer_wait_running() to handle
it the same way as the other retry loops in the posix timer code.
Fixes: ec8f954a40da ("posix-timers: Use a callback for cancel synchronization on PREEMPT_RT")
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
V2: Remove the bogus claims about posix CPU timers - Frederic
---
kernel/time/posix-timers.c | 50 +++++++++++++++++++++++++++++++++++++--------
1 file changed, 42 insertions(+), 8 deletions(-)
--- a/kernel/time/posix-timers.c
+++ b/kernel/time/posix-timers.c
@@ -1037,27 +1037,59 @@ SYSCALL_DEFINE1(timer_delete, timer_t, t
}
/*
- * return timer owned by the process, used by exit_itimers
+ * Delete a timer if it is armed, remove it from the hash and schedule it
+ * for RCU freeing.
*/
static void itimer_delete(struct k_itimer *timer)
{
-retry_delete:
- spin_lock_irq(&timer->it_lock);
+ unsigned long flags;
+retry_delete:
+ /*
+ * irqsave is required to make timer_wait_running() work.
+ */
+ spin_lock_irqsave(&timer->it_lock, flags);
+
+ /*
+ * Even if the timer is not longer accessible from other tasks
+ * it still might be armed and queued in the underlying timer
+ * mechanism. Worse, that timer mechanism might run the expiry
+ * function concurrently.
+ */
if (timer_delete_hook(timer) == TIMER_RETRY) {
- spin_unlock_irq(&timer->it_lock);
+ /*
+ * Timer is expired concurrently, prevent livelocks
+ * and pointless spinning on RT.
+ *
+ * The CONFIG_POSIX_CPU_TIMERS_TASK_WORK=y case is
+ * irrelevant here because obviously the exiting task
+ * cannot be expiring timer in task work concurrently.
+ * Ditto for CONFIG_POSIX_CPU_TIMERS_TASK_WORK=n as the
+ * tick interrupt cannot run on this CPU because the above
+ * spin_lock disabled interrupts.
+ *
+ * timer_wait_running() drops timer::it_lock, which opens
+ * the possibility for another task to delete the timer.
+ *
+ * That's not possible here because this is invoked from
+ * do_exit() only for the last thread of the thread group.
+ * So no other task can access that timer.
+ */
+ if (WARN_ON_ONCE(timer_wait_running(timer, &flags) != timer))
+ return;
+
goto retry_delete;
}
list_del(&timer->list);
- spin_unlock_irq(&timer->it_lock);
+ spin_unlock_irqrestore(&timer->it_lock, flags);
release_posix_timer(timer, IT_ID_SET);
}
/*
- * This is called by do_exit or de_thread, only when nobody else can
- * modify the signal->posix_timers list. Yet we need sighand->siglock
- * to prevent the race with /proc/pid/timers.
+ * Invoked from do_exit() when the last thread of a thread group exits.
+ * At that point no other task can access the timers of the dying
+ * task anymore.
*/
void exit_itimers(struct task_struct *tsk)
{
@@ -1067,10 +1099,12 @@ void exit_itimers(struct task_struct *ts
if (list_empty(&tsk->signal->posix_timers))
return;
+ /* Protect against concurrent read via /proc/$PID/timers */
spin_lock_irq(&tsk->sighand->siglock);
list_replace_init(&tsk->signal->posix_timers, &timers);
spin_unlock_irq(&tsk->sighand->siglock);
+ /* The timers are not longer accessible via tsk::signal */
while (!list_empty(&timers)) {
tmr = list_first_entry(&timers, struct k_itimer, list);
itimer_delete(tmr);
next prev parent reply other threads:[~2023-06-01 19:00 UTC|newest]
Thread overview: 122+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-25 18:48 [patch 00/20] posix-timers: Fixes and cleanups Thomas Gleixner
2023-04-25 18:48 ` [patch 01/20] posix-timers: Prevent RT livelock in itimer_delete() Thomas Gleixner
2023-05-04 17:06 ` Frederic Weisbecker
2023-05-04 18:20 ` Thomas Gleixner
2023-05-05 7:57 ` Thomas Gleixner
2023-06-01 19:00 ` Thomas Gleixner [this message]
2023-06-01 20:16 ` [patch v2a " Thomas Gleixner
2023-06-05 10:59 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:48 ` [patch 02/20] posix-timers: Ensure timer ID search-loop limit is valid Thomas Gleixner
2023-05-05 14:50 ` Frederic Weisbecker
2023-05-05 22:58 ` Thomas Gleixner
2023-05-05 23:36 ` Thomas Gleixner
2023-05-08 21:57 ` Thomas Gleixner
2023-05-09 9:30 ` Thomas Gleixner
2023-05-09 12:50 ` Thomas Gleixner
2023-05-09 21:42 ` [RFD] posix-timers: CRIU woes Thomas Gleixner
2023-05-10 4:36 ` Pavel Tikhomirov
2023-05-10 8:30 ` Thomas Gleixner
2023-05-11 4:12 ` Pavel Tikhomirov
2023-05-11 7:56 ` Peter Zijlstra
2023-05-11 9:32 ` Thomas Gleixner
2023-05-11 10:13 ` David Laight
2023-05-10 8:16 ` Andrey Vagin
2023-05-11 3:17 ` Pavel Tikhomirov
2023-05-11 9:36 ` Thomas Gleixner
2023-05-11 9:52 ` Pavel Tikhomirov
2023-05-11 13:42 ` Thomas Gleixner
2023-05-11 14:54 ` Pavel Tikhomirov
2023-05-11 15:25 ` Pavel Tikhomirov
2023-05-12 1:21 ` Andrey Vagin
2023-05-31 17:38 ` Thomas Gleixner
2023-05-11 7:49 ` Cyrill Gorcunov
2023-05-10 0:42 ` [patch 02/20] posix-timers: Ensure timer ID search-loop limit is valid Andrey Vagin
2023-05-09 9:42 ` Frederic Weisbecker
2023-05-09 12:04 ` Thomas Gleixner
2023-05-09 12:38 ` Thomas Gleixner
2023-05-09 14:18 ` Frederic Weisbecker
2023-06-01 18:58 ` [patch v2 " Thomas Gleixner
2023-06-05 14:17 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 03/20] posix-timers: Clarify timer_wait_running() comment Thomas Gleixner
2023-05-09 9:50 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 04/20] posix-timers: Cleanup comments about timer ID tracking Thomas Gleixner
2023-05-09 9:58 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 05/20] posix-timers: Add comments about timer lookup Thomas Gleixner
2023-05-09 10:58 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 06/20] posix-timers: Annotate concurrent access to k_itimer::it_signal Thomas Gleixner
2023-05-09 11:04 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] posix-timers: Annotate concurrent access to k_itimer:: It_signal tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 07/20] posix-timers: Set k_itimer::it_signal to NULL on exit() Thomas Gleixner
2023-06-01 10:09 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] posix-timers: Set k_itimer:: It_signal " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 08/20] posix-timers: Remove pointless irqsafe from hash_lock Thomas Gleixner
2023-06-01 10:12 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 09/20] posix-timers: Split release_posix_timers() Thomas Gleixner
2023-06-01 10:25 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 10/20] posix-timers: Document sys_clock_getres() correctly Thomas Gleixner
2023-06-01 10:44 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 11/20] posix-timers: Document common_clock_get() correctly Thomas Gleixner
2023-06-01 11:00 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 12/20] posix-timers: Document sys_clock_getoverrun() Thomas Gleixner
2023-06-01 11:06 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 13/20] posix-timers: Document sys_clock_settime() permissions in place Thomas Gleixner
2023-06-01 11:22 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:50 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 14/20] posix-timers: Document nanosleep() details Thomas Gleixner
2023-06-01 12:30 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:49 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 15/20] posix-timers: Add proper comments in do_timer_create() Thomas Gleixner
2023-06-01 12:43 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:49 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 16/20] posix-timers: Comment SIGEV_THREAD_ID properly Thomas Gleixner
2023-06-01 12:47 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:49 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 17/20] posix-timers: Clarify posix_timer_rearm() comment Thomas Gleixner
2023-06-01 12:52 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-18 20:49 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 18/20] posix-timers: Clarify posix_timer_fn() comments Thomas Gleixner
2023-06-01 13:21 ` Frederic Weisbecker
2023-06-01 18:43 ` Thomas Gleixner
2023-06-01 19:07 ` Thomas Gleixner
2023-06-05 14:26 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-05 22:17 ` tip-bot2 for Thomas Gleixner
2023-06-18 20:49 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 19/20] posix-timers: Remove pointless comments Thomas Gleixner
2023-06-01 13:48 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-05 22:17 ` tip-bot2 for Thomas Gleixner
2023-06-18 20:49 ` tip-bot2 for Thomas Gleixner
2023-04-25 18:49 ` [patch 20/20] posix-timers: Polish coding style in a few places Thomas Gleixner
2023-06-01 13:50 ` Frederic Weisbecker
2023-06-05 15:08 ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2023-06-05 22:17 ` tip-bot2 for Thomas Gleixner
2023-06-18 20:49 ` tip-bot2 for Thomas Gleixner
2023-06-05 14:32 ` [patch 00/20] posix-timers: Fixes and cleanups Frederic Weisbecker
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=877csndn49.ffs@tglx \
--to=tglx@linutronix.de \
--cc=anna-maria@linutronix.de \
--cc=bigeasy@linutronix.de \
--cc=dvyukov@google.com \
--cc=frederic@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=mtk.manpages@gmail.com \
--cc=peterz@infradead.org \
--cc=syzbot+5c54bd3eb218bb595aa9@syzkaller.appspotmail.com \
/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