From: Guenter Roeck <linux@roeck-us.net>
To: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Cc: linux-watchdog@vger.kernel.org,
Wim Van Sebroeck <wim@linux-watchdog.org>,
Steffen Trumtrar <s.trumtrar@pengutronix.de>,
Tim Sander <tim@krieglstein.org>, Julia Cartwright <julia@ni.com>,
Thomas Gleixner <tglx@linutronix.de>
Subject: Re: [PATCH] watchdog: prevent deferral of watchdogd wakeup on RT
Date: Tue, 5 Nov 2019 08:02:50 -0800 [thread overview]
Message-ID: <20191105160250.GA16663@roeck-us.net> (raw)
In-Reply-To: <20191105144506.clyadjbvnn7b7b2m@linutronix.de>
On Tue, Nov 05, 2019 at 03:45:06PM +0100, Sebastian Andrzej Siewior wrote:
> From: Julia Cartwright <julia@ni.com>
>
> When PREEMPT_RT is enabled, all hrtimer expiry functions are
> deferred for execution into the context of ksoftirqd 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 ksoftirqd also means
> that for correct behavior a user must adjust the scheduling parameters
> of both watchdogd _and_ ksoftirqd, 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.
>
> Link: https://lkml.kernel.org/r/0e02d8327aeca344096c246713033887bc490dd7.1538089180.git.julia@ni.com
> 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>
Looks ok for mainline.
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
> ---
> drivers/watchdog/watchdog_dev.c | 10 ++++++----
> 1 file changed, 6 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/watchdog/watchdog_dev.c b/drivers/watchdog/watchdog_dev.c
> index dbd2ad4c92948..d3acc0a7256ca 100644
> --- a/drivers/watchdog/watchdog_dev.c
> +++ b/drivers/watchdog/watchdog_dev.c
> @@ -158,7 +158,8 @@ 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);
> }
> @@ -177,7 +178,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;
> }
>
> @@ -971,7 +972,7 @@ static int watchdog_cdev_register(struct watchdog_device *wdd, dev_t devno)
> return -ENODEV;
>
> 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) {
> @@ -1019,7 +1020,8 @@ static int watchdog_cdev_register(struct watchdog_device *wdd, dev_t devno)
> __module_get(wdd->ops->owner);
> kref_get(&wd_data->kref);
> 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.24.0
>
next prev parent reply other threads:[~2019-11-05 16:02 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-11-05 14:45 [PATCH] watchdog: prevent deferral of watchdogd wakeup on RT Sebastian Andrzej Siewior
2019-11-05 16:02 ` Guenter Roeck [this message]
2019-11-05 16:19 ` Sebastian Andrzej Siewior
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=20191105160250.GA16663@roeck-us.net \
--to=linux@roeck-us.net \
--cc=bigeasy@linutronix.de \
--cc=julia@ni.com \
--cc=linux-watchdog@vger.kernel.org \
--cc=s.trumtrar@pengutronix.de \
--cc=tglx@linutronix.de \
--cc=tim@krieglstein.org \
--cc=wim@linux-watchdog.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