[PATCH v1 procd] watchdog: Add an info message if the watchdog reset the system

Martin Blumenstingl martin.blumenstingl at googlemail.com
Sun Jul 18 14:51:12 PDT 2021


Investigating why a device has rebooted can be difficult, especially if
there's no output (for example during a kernel crash) on the serial
console. Some watchdog drivers can tell us if the watchdog has caused
the system to reboot. The corresponding WDIOF_CARDRESET flag is
documented as: "Card previously reset the CPU".

Add an info message if the watchdog supports the WDIOF_CARDRESET flag
and if the boot status indicates that the watchdog has previously reset
the system.

Signed-off-by: Martin Blumenstingl <martin.blumenstingl at googlemail.com>
---
 watchdog.c | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)

diff --git a/watchdog.c b/watchdog.c
index 9d770b4..39ae9ff 100644
--- a/watchdog.c
+++ b/watchdog.c
@@ -93,6 +93,35 @@ static int watchdog_set_drv_timeout(void)
 	return ioctl(wdt_fd, WDIOC_SETTIMEOUT, &wdt_drv_timeout);
 }
 
+static void watchdog_print_status(void)
+{
+	struct watchdog_info wdt_info;
+	int bootstatus;
+
+	if (wdt_fd < 0)
+		return;
+
+	if (ioctl(wdt_fd, WDIOC_GETSUPPORT, &wdt_info)) {
+		DEBUG(2, "Watchdog GETSUPPORT failed\n");
+		return;
+	}
+
+	if (!(wdt_info.options & WDIOF_CARDRESET)) {
+		DEBUG(2, "Watchdog does not have CARDRESET support\n");
+		return;
+	}
+
+	if (ioctl(wdt_fd, WDIOC_GETBOOTSTATUS, &bootstatus)) {
+		DEBUG(2, "Watchdog GETBOOTSTATUS failed\n");
+		return;
+	}
+
+	if (bootstatus & WDIOF_CARDRESET)
+		LOG("Watchdog has previously reset the system\n");
+	else
+		DEBUG(2, "Watchdog did not previously reset the system\n");
+}
+
 void watchdog_set_magicclose(bool val)
 {
 	wdt_magicclose = val;
@@ -170,6 +199,8 @@ void watchdog_init(int preinit)
 	watchdog_timeout_cb(&wdt_timeout);
 
 	DEBUG(4, "Opened watchdog with timeout %ds\n", watchdog_timeout(0));
+
+	watchdog_print_status();
 }
 
 
-- 
2.32.0




More information about the openwrt-devel mailing list