39 lines
1.3 KiB
Diff
39 lines
1.3 KiB
Diff
From b0a07e7ba071603ff37b264505027bc7adfaa9e4 Mon Sep 17 00:00:00 2001
|
|
From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
Date: Fri, 18 Aug 2017 10:09:09 +0200
|
|
Subject: [PATCH 334/365] kernel/hrtimer: migrate deferred timer on CPU down
|
|
|
|
hrtimers, which were deferred to the softirq context, and expire between
|
|
softirq shutdown and hrtimer migration are dangling around. If the CPU
|
|
goes back up the list head will be initialized and this corrupts the
|
|
timer's list. It will remain unnoticed until a hrtimer_cancel().
|
|
This moves those timers so they will expire.
|
|
|
|
Cc: stable-rt@vger.kernel.org
|
|
Reported-by: Mike Galbraith <efault@gmx.de>
|
|
Tested-by: Mike Galbraith <efault@gmx.de>
|
|
Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
---
|
|
kernel/time/hrtimer.c | 5 +++++
|
|
1 file changed, 5 insertions(+)
|
|
|
|
diff --git a/kernel/time/hrtimer.c b/kernel/time/hrtimer.c
|
|
index d2fb17faae9f..0860d60957cd 100644
|
|
--- a/kernel/time/hrtimer.c
|
|
+++ b/kernel/time/hrtimer.c
|
|
@@ -1871,6 +1871,11 @@ static void migrate_hrtimer_list(struct hrtimer_clock_base *old_base,
|
|
*/
|
|
enqueue_hrtimer(timer, new_base);
|
|
}
|
|
+#ifdef CONFIG_PREEMPT_RT_BASE
|
|
+ list_splice_tail(&old_base->expired, &new_base->expired);
|
|
+ if (!list_empty(&new_base->expired))
|
|
+ raise_softirq_irqoff(HRTIMER_SOFTIRQ);
|
|
+#endif
|
|
}
|
|
|
|
int hrtimers_dead_cpu(unsigned int scpu)
|
|
--
|
|
2.28.0
|
|
|