summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch')
-rw-r--r--debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch60
1 files changed, 60 insertions, 0 deletions
diff --git a/debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch b/debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch
new file mode 100644
index 000000000..c3dd3b73e
--- /dev/null
+++ b/debian/patches-rt/0097-time-hrtimer-avoid-schedule_work-with-interrupts-dis.patch
@@ -0,0 +1,60 @@
+From 97abf968e205dd81621ca60a59060f3eda0c7081 Mon Sep 17 00:00:00 2001
+From: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+Date: Wed, 15 Nov 2017 17:29:51 +0100
+Subject: [PATCH 097/347] time/hrtimer: avoid schedule_work() with interrupts
+ disabled
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.246-rt110.tar.xz
+
+The NOHZ code tries to schedule a workqueue with interrupts disabled.
+Since this does not work -RT I am switching it to swork instead.
+
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ kernel/time/timer.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/kernel/time/timer.c b/kernel/time/timer.c
+index 0043bf8e2c90..3cb79167852f 100644
+--- a/kernel/time/timer.c
++++ b/kernel/time/timer.c
+@@ -218,8 +218,7 @@ static DEFINE_PER_CPU(struct timer_base, timer_bases[NR_BASES]);
+ static DEFINE_STATIC_KEY_FALSE(timers_nohz_active);
+ static DEFINE_MUTEX(timer_keys_mutex);
+
+-static void timer_update_keys(struct work_struct *work);
+-static DECLARE_WORK(timer_update_work, timer_update_keys);
++static struct swork_event timer_update_swork;
+
+ #ifdef CONFIG_SMP
+ unsigned int sysctl_timer_migration = 1;
+@@ -237,7 +236,7 @@ static void timers_update_migration(void)
+ static inline void timers_update_migration(void) { }
+ #endif /* !CONFIG_SMP */
+
+-static void timer_update_keys(struct work_struct *work)
++static void timer_update_keys(struct swork_event *event)
+ {
+ mutex_lock(&timer_keys_mutex);
+ timers_update_migration();
+@@ -247,9 +246,17 @@ static void timer_update_keys(struct work_struct *work)
+
+ void timers_update_nohz(void)
+ {
+- schedule_work(&timer_update_work);
++ swork_queue(&timer_update_swork);
+ }
+
++static __init int hrtimer_init_thread(void)
++{
++ WARN_ON(swork_get());
++ INIT_SWORK(&timer_update_swork, timer_update_keys);
++ return 0;
++}
++early_initcall(hrtimer_init_thread);
++
+ int timer_migration_handler(struct ctl_table *table, int write,
+ void __user *buffer, size_t *lenp,
+ loff_t *ppos)
+--
+2.36.1
+