From: Franck Bui Date: Mon, 6 Sep 2021 06:47:08 +0000 (+0200) Subject: watchdog: make watchdog_ping() a NOP when the watchdog is disabled or closed X-Git-Tag: v250-rc1~670^2~9 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=5bbf2db1e4eeabf2a36e28cf3aced0e87c4367d1;p=thirdparty%2Fsystemd.git watchdog: make watchdog_ping() a NOP when the watchdog is disabled or closed This patch allows watchdog_ping() to be used unconditionally regardless of whether watchdog_set_timeout() or watchdog_close() has been previously called or not and in both cases watchdog_ping() does nothing. shutdown.c has been updated to cope with this change. --- diff --git a/src/shared/watchdog.c b/src/shared/watchdog.c index 361d5837dc9..e0700b60139 100644 --- a/src/shared/watchdog.c +++ b/src/shared/watchdog.c @@ -136,6 +136,9 @@ int watchdog_ping(void) { usec_t ntime; int r; + if (!timestamp_is_set(watchdog_timeout)) + return 0; + ntime = now(clock_boottime_or_monotonic()); /* Never ping earlier than watchdog_timeout/4 and try to ping @@ -186,4 +189,8 @@ void watchdog_close(bool disarm) { } watchdog_fd = safe_close(watchdog_fd); + + /* Once closed, pinging the device becomes a NOP and we request a new + * call to watchdog_set_timeout() to open the device again. */ + watchdog_timeout = USEC_INFINITY; } diff --git a/src/shutdown/shutdown.c b/src/shutdown/shutdown.c index 2ba1a21dae9..a2ba96bf7c0 100644 --- a/src/shutdown/shutdown.c +++ b/src/shutdown/shutdown.c @@ -308,9 +308,9 @@ static void bump_sysctl_printk_log_level(int min_level) { } int main(int argc, char *argv[]) { - bool need_umount, need_swapoff, need_loop_detach, need_dm_detach, need_md_detach, in_container, use_watchdog = false, can_initrd; + bool need_umount, need_swapoff, need_loop_detach, need_dm_detach, need_md_detach, in_container, can_initrd; _cleanup_free_ char *cgroup = NULL; - char *arguments[3], *watchdog_device; + char *arguments[3], *watchdog_device, *watchdog_usec; int cmd, r, umount_log_level = LOG_INFO; static const char* const dirs[] = {SYSTEM_SHUTDOWN_PATH, NULL}; @@ -370,7 +370,6 @@ int main(int argc, char *argv[]) { LOG_TARGET_KMSG)) bump_sysctl_printk_log_level(LOG_WARNING); - use_watchdog = getenv("WATCHDOG_USEC"); watchdog_device = getenv("WATCHDOG_DEVICE"); if (watchdog_device) { r = watchdog_set_device(watchdog_device); @@ -379,6 +378,18 @@ int main(int argc, char *argv[]) { watchdog_device); } + watchdog_usec = getenv("WATCHDOG_USEC"); + if (watchdog_usec) { + usec_t usec; + + r = safe_atou64(watchdog_usec, &usec); + if (r < 0) + log_warning_errno(r, "Failed to parse watchdog timeout '%s', ignoring: %m", + watchdog_usec); + else + (void) watchdog_set_timeout(&usec); + } + /* Lock us into memory */ (void) mlockall(MCL_CURRENT|MCL_FUTURE); @@ -409,8 +420,7 @@ int main(int argc, char *argv[]) { for (;;) { bool changed = false; - if (use_watchdog) - (void) watchdog_ping(); + (void) watchdog_ping(); /* Let's trim the cgroup tree on each iteration so that we leave an empty cgroup tree around, so that