summaryrefslogtreecommitdiffstats
path: root/debian/patches-rt/0250-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch
diff options
context:
space:
mode:
Diffstat (limited to 'debian/patches-rt/0250-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch')
-rw-r--r--debian/patches-rt/0250-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch81
1 files changed, 81 insertions, 0 deletions
diff --git a/debian/patches-rt/0250-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch b/debian/patches-rt/0250-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch
new file mode 100644
index 000000000..c9d461226
--- /dev/null
+++ b/debian/patches-rt/0250-watchdog-prevent-deferral-of-watchdogd-wakeup-on-RT.patch
@@ -0,0 +1,81 @@
+From 2536bb24992f08158455b5ad1434f439f6543db5 Mon Sep 17 00:00:00 2001
+From: Julia Cartwright <julia@ni.com>
+Date: Fri, 28 Sep 2018 21:03:51 +0000
+Subject: [PATCH 250/347] watchdog: prevent deferral of watchdogd wakeup on RT
+Origin: https://www.kernel.org/pub/linux/kernel/projects/rt/4.19/older/patches-4.19.246-rt110.tar.xz
+
+When PREEMPT_RT_FULL is enabled, all hrtimer expiry functions are
+deferred for execution into the context of ktimersoftd unless otherwise
+annotated.
+
+Deferring the expiry of the hrtimer used by the watchdog core, however,
+is a waste, as the callback does nothing but queue a kthread work item
+and wakeup watchdogd.
+
+It's worst then that, too: the deferral through ktimersoftd also means
+that for correct behavior a user must adjust the scheduling parameters
+of both watchdogd _and_ ktimersoftd, which is unnecessary and has other
+side effects (like causing unrelated expiry functions to execute at
+potentially elevated priority).
+
+Instead, mark the hrtimer used by the watchdog core as being _HARD to
+allow it's execution directly from hardirq context. The work done in
+this expiry function is well-bounded and minimal.
+
+A user still must adjust the scheduling parameters of the watchdogd
+to be correct w.r.t. their application needs.
+
+Cc: Guenter Roeck <linux@roeck-us.net>
+Reported-and-tested-by: Steffen Trumtrar <s.trumtrar@pengutronix.de>
+Reported-by: Tim Sander <tim@krieglstein.org>
+Signed-off-by: Julia Cartwright <julia@ni.com>
+Acked-by: Guenter Roeck <linux@roeck-us.net>
+[bigeasy: use only HRTIMER_MODE_REL_HARD]
+Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+---
+ drivers/watchdog/watchdog_dev.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
+index 8fe59b7d8eec..516782cff8d2 100644
+--- a/drivers/watchdog/watchdog_dev.c
++++ b/drivers/watchdog/watchdog_dev.c
+@@ -145,7 +145,7 @@ static inline void watchdog_update_worker(struct watchdog_device *wdd)
+ ktime_t t = watchdog_next_keepalive(wdd);
+
+ if (t > 0)
+- hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL);
++ hrtimer_start(&wd_data->timer, t, HRTIMER_MODE_REL_HARD);
+ } else {
+ hrtimer_cancel(&wd_data->timer);
+ }
+@@ -164,7 +164,7 @@ static int __watchdog_ping(struct watchdog_device *wdd)
+ if (ktime_after(earliest_keepalive, now)) {
+ hrtimer_start(&wd_data->timer,
+ ktime_sub(earliest_keepalive, now),
+- HRTIMER_MODE_REL);
++ HRTIMER_MODE_REL_HARD);
+ return 0;
+ }
+
+@@ -959,7 +959,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd)
+ dev_set_name(&wd_data->dev, "watchdog%d", wdd->id);
+
+ kthread_init_work(&wd_data->work, watchdog_ping_work);
+- hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);
++ hrtimer_init(&wd_data->timer, CLOCK_MONOTONIC, HRTIMER_MODE_REL_HARD);
+ wd_data->timer.function = watchdog_timer_expired;
+
+ if (wdd->id == 0) {
+@@ -1007,7 +1007,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd)
+ __module_get(wdd->ops->owner);
+ get_device(&wd_data->dev);
+ if (handle_boot_enabled)
+- hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL);
++ hrtimer_start(&wd_data->timer, 0, HRTIMER_MODE_REL_HARD);
+ else
+ pr_info("watchdog%d running and kernel based pre-userspace handler disabled\n",
+ wdd->id);
+--
+2.36.1
+