public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Thomas Gleixner <tglx@linutronix.de>
To: LKML <linux-kernel@vger.kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@kernel.org>,
	Sebastian Siewior <bigeasy@linutronix.de>,
	Anna-Maria Gleixner <anna-maria@linutronix.de>,
	Steven Rostedt <rostedt@goodmis.org>,
	Julia Cartwright <julia@ni.com>
Subject: [patch 7/7] posix-timers: Prepare for PREEMPT_RT
Date: Wed, 31 Jul 2019 00:33:55 +0200	[thread overview]
Message-ID: <20190730223829.058247862@linutronix.de> (raw)
In-Reply-To: 20190730223348.409366334@linutronix.de

Posix timer delete retry loops are affected by the same priority inversion
and live lock issues as the other timers.

Provide a RT specific synchronization function which keeps a reference to
the timer by holding rcu read lock to prevent the timer from being freed,
dropping the timer lock and invoking the timer specific wait function.

This does not yet cover posix CPU timers because they need more special
treatment on PREEMPT_RT.

Originally-by: Anna-Maria Gleixenr <anna-maria@linutronix.de>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
---
 kernel/time/posix-timers.c |   22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)

--- a/kernel/time/posix-timers.c
+++ b/kernel/time/posix-timers.c
@@ -805,6 +805,27 @@ static int common_hrtimer_try_to_cancel(
 	return hrtimer_try_to_cancel(&timr->it.real.timer);
 }
 
+#ifdef CONFIG_PREEMPT_RT
+static struct k_itimer *timer_wait_running(struct k_itimer *timer,
+					   unsigned long *flags)
+{
+	const struct k_clock *kc = READ_ONCE(timer->kclock);
+	timer_t timer_id = READ_ONCE(timer->it_id);
+
+	/* Prevent kfree(timer) after dropping the lock */
+	rcu_read_lock();
+	unlock_timer(timer, *flags);
+
+	if (kc->timer_arm == common_hrtimer_arm)
+		hrtimer_cancel_wait_running(&timer->it.real.timer);
+	else if (kc == &alarm_clock)
+		hrtimer_cancel_wait_running(&timer->it.alarm.alarmtimer.timer);
+	rcu_read_unlock();
+
+	/* Relock the timer. It might be not longer hashed. */
+	return lock_timer(timer_id, flags);
+}
+#else
 static struct k_itimer *timer_wait_running(struct k_itimer *timer,
 					   unsigned long *flags)
 {
@@ -815,6 +836,7 @@ static struct k_itimer *timer_wait_runni
 	/* Relock the timer. It might be not longer hashed. */
 	return lock_timer(timer_id, flags);
 }
+#endif
 
 /* Set a POSIX.1b interval timer. */
 int common_timer_set(struct k_itimer *timr, int flags,



  parent reply	other threads:[~2019-07-30 22:41 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-07-30 22:33 [patch 0/7] posix-timers: Prepare for PREEMPT_RT - part 1 Thomas Gleixner
2019-07-30 22:33 ` [patch 1/7] alarmtimer: Prepare for PREEMPT_RT Thomas Gleixner
2019-08-01 16:04   ` [tip:timers/core] " tip-bot for Anna-Maria Gleixner
2019-08-01 19:06   ` tip-bot for Anna-Maria Gleixner
2019-07-30 22:33 ` [patch 2/7] timerfd: " Thomas Gleixner
2019-08-01 16:04   ` [tip:timers/core] " tip-bot for Anna-Maria Gleixner
2019-08-01 19:07   ` tip-bot for Anna-Maria Gleixner
2019-07-30 22:33 ` [patch 3/7] itimers: " Thomas Gleixner
2019-08-01 16:05   ` [tip:timers/core] " tip-bot for Anna-Maria Gleixner
2019-08-01 19:07   ` tip-bot for Anna-Maria Gleixner
2019-07-30 22:33 ` [patch 4/7] posix-timers: Cleanup the flag/flags confusion Thomas Gleixner
2019-08-01 16:06   ` [tip:timers/core] " tip-bot for Anna-Maria Gleixner
2019-08-01 19:08   ` tip-bot for Thomas Gleixner
2019-07-30 22:33 ` [patch 5/7] posix-timers: Rework cancel retry loops Thomas Gleixner
2019-08-01 16:07   ` [tip:timers/core] " tip-bot for Thomas Gleixner
2019-08-01 19:09   ` tip-bot for Thomas Gleixner
2019-07-30 22:33 ` [patch 6/7] posix-timers: Move rcu_head out of it union Thomas Gleixner
2019-08-01 16:08   ` [tip:timers/core] " tip-bot for Sebastian Andrzej Siewior
2019-08-01 19:09   ` tip-bot for Sebastian Andrzej Siewior
2019-07-30 22:33 ` Thomas Gleixner [this message]
2019-07-31  9:49   ` [patch 7/7] posix-timers: Prepare for PREEMPT_RT Peter Zijlstra
2019-07-31 11:03     ` Thomas Gleixner
2019-08-01 16:08   ` [tip:timers/core] " tip-bot for Thomas Gleixner
2019-08-01 19:10   ` tip-bot for Thomas Gleixner
2019-07-31  9:49 ` [patch 0/7] posix-timers: Prepare for PREEMPT_RT - part 1 Peter Zijlstra

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=20190730223829.058247862@linutronix.de \
    --to=tglx@linutronix.de \
    --cc=anna-maria@linutronix.de \
    --cc=bigeasy@linutronix.de \
    --cc=julia@ni.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=peterz@infradead.org \
    --cc=rostedt@goodmis.org \
    /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