[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