51 lines
1.4 KiB
Diff
51 lines
1.4 KiB
Diff
From d6af602c1a87abbfc8c7a01600f97ad75f358f10 Mon Sep 17 00:00:00 2001
|
|
From: Ingo Molnar <mingo@elte.hu>
|
|
Date: Fri, 3 Jul 2009 08:30:20 -0500
|
|
Subject: [PATCH 126/267] timers: preempt-rt support
|
|
|
|
Signed-off-by: Ingo Molnar <mingo@elte.hu>
|
|
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
|
|
---
|
|
kernel/timer.c | 18 +++++++++++++++++-
|
|
1 file changed, 17 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/kernel/timer.c b/kernel/timer.c
|
|
index e4b2373..2aa1215 100644
|
|
--- a/kernel/timer.c
|
|
+++ b/kernel/timer.c
|
|
@@ -1294,6 +1294,22 @@ unsigned long get_next_timer_interrupt(unsigned long now)
|
|
*/
|
|
if (cpu_is_offline(smp_processor_id()))
|
|
return now + NEXT_TIMER_MAX_DELTA;
|
|
+
|
|
+#ifdef CONFIG_PREEMPT_RT_FULL
|
|
+ /*
|
|
+ * On PREEMPT_RT we cannot sleep here. If the trylock does not
|
|
+ * succeed then we return the worst-case 'expires in 1 tick'
|
|
+ * value:
|
|
+ */
|
|
+ if (spin_trylock(&base->lock)) {
|
|
+ if (time_before_eq(base->next_timer, base->timer_jiffies))
|
|
+ base->next_timer = __next_timer_interrupt(base);
|
|
+ expires = base->next_timer;
|
|
+ spin_unlock(&base->lock);
|
|
+ } else {
|
|
+ expires = now + 1;
|
|
+ }
|
|
+#else
|
|
spin_lock(&base->lock);
|
|
if (time_before_eq(base->next_timer, base->timer_jiffies))
|
|
base->next_timer = __next_timer_interrupt(base);
|
|
@@ -1302,7 +1318,7 @@ unsigned long get_next_timer_interrupt(unsigned long now)
|
|
|
|
if (time_before_eq(expires, now))
|
|
return now;
|
|
-
|
|
+#endif
|
|
return cmp_next_hrtimer_event(now, expires);
|
|
}
|
|
#endif
|
|
--
|
|
1.7.10
|
|
|