watchdog: dw_wdt: keepalive the watchdog at write time
authorDoug Anderson <dianders@chromium.org>
Fri, 8 May 2015 04:27:45 +0000 (21:27 -0700)
committerWim Van Sebroeck <wim@iguana.be>
Mon, 22 Jun 2015 13:54:31 +0000 (15:54 +0200)
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 <dianders@chromium.org>
Tested-by: Jisheng Zhang <jszhang@marvell.com>
Reviewed-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Reviewed-by: Guenter Roeck <linux@roeck-us.net>
Signed-off-by: Wim Van Sebroeck <wim@iguana.be>
drivers/watchdog/dw_wdt.c

index a284abdb4fb61a82a743f8a0d192636f94dbee83..6ea0634345e99512eefec4f82ebcd8ee348bac82 100644 (file)
@@ -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;