The kernel wdt counting down even when not pinged.
Shutdown the filehandler to /dev/watchdog with magic cookie
to prevent this.

Signed-off-by: Alexander Couzens <lyn...@fe80.eu>
---
 watchdog.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)


I'm not certainly clear, the previous behaviour was a bug or feature.
If stop=True should really only stop the pinging thread, I really would like
to shutdown the watchdog gracefully on another way. E.g. with another argument
shutdown.

Best lynxis

diff --git a/watchdog.c b/watchdog.c
index 592ae7e..025942b 100644
--- a/watchdog.c
+++ b/watchdog.c
@@ -45,11 +45,23 @@ static void watchdog_timeout_cb(struct uloop_timeout *t)
        uloop_timeout_set(t, wdt_frequency * 1000);
 }
 
+static void watchdog_stop()
+{
+       if (wdt_fd >= 0 && write(wdt_fd, "V", 1) < 0)
+               ERROR("WDT failed to write magic close sequence: %s\n"
+                     "WDT may not stopped properly.\n", strerror(errno));
+       if (close(wdt_fd) < 0)
+               ERROR("WDT failed to close watchdog fd: %s\n"
+                     "WDT may not stopped properly.\n", strerror(errno));
+       wdt_fd = -1;
+}
+
 void watchdog_set_stopped(bool val)
 {
-       if (val)
+       if (val) {
                uloop_timeout_cancel(&wdt_timeout);
-       else
+               watchdog_stop();
+       } else
                watchdog_timeout_cb(&wdt_timeout);
 }
 
@@ -125,7 +137,6 @@ void watchdog_init(int preinit)
        DEBUG(4, "Opened watchdog with timeout %ds\n", watchdog_timeout(0));
 }
 
-
 void watchdog_no_cloexec(void)
 {
        if (wdt_fd < 0)
-- 
2.5.3
_______________________________________________
openwrt-devel mailing list
openwrt-devel@lists.openwrt.org
https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Reply via email to