diff options
author | Doug Anderson <[email protected]> | 2015-05-07 21:27:45 -0700 |
---|---|---|
committer | Wim Van Sebroeck <[email protected]> | 2015-06-22 15:54:31 +0200 |
commit | 04b1a62e6bb9b217847be874fe37a6b85ddff67e (patch) | |
tree | 7ab56d96da573300c4368c4e16eee13f39ae12e4 | |
parent | 7fb466a7a7362de19b8f2aa07cffa79e527cf070 (diff) |
watchdog: dw_wdt: keepalive the watchdog at write time
If you've got code that does this in a tight loop
1. Open watchdog
2. Send 'expect close'
3. Close watchdog
...you'll eventually trigger a watchdog reset. You can reproduce this
by using daisydog (1) and running:
while true; do daisydog -c > /dev/null; done
The problem is that each time you write to the watchdog for 'expect
close' it moves the timer .5 seconds out. The timer thus never fires
and never pats the watchdog for you.
1: http://git.chromium.org/gitweb/?p=chromiumos/third_party/daisydog.git
Signed-off-by: Doug Anderson <[email protected]>
Tested-by: Jisheng Zhang <[email protected]>
Reviewed-by: Dmitry Torokhov <[email protected]>
Reviewed-by: Guenter Roeck <[email protected]>
Signed-off-by: Wim Van Sebroeck <[email protected]>
-rw-r--r-- | drivers/watchdog/dw_wdt.c | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/watchdog/dw_wdt.c b/drivers/watchdog/dw_wdt.c index a284abdb4fb6..6ea0634345e9 100644 --- a/drivers/watchdog/dw_wdt.c +++ b/drivers/watchdog/dw_wdt.c @@ -215,6 +215,7 @@ static ssize_t dw_wdt_write(struct file *filp, const char __user *buf, } dw_wdt_set_next_heartbeat(); + dw_wdt_keepalive(); mod_timer(&dw_wdt.timer, jiffies + WDT_TIMEOUT); return len; |