From: Lennart Poettering Date: Tue, 27 Oct 2020 08:57:28 +0000 (+0100) Subject: pid1: various minor watchdog modernizations X-Git-Tag: v247-rc2~38 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bfeb927a55450be0a528d04051751478bc02572e;p=thirdparty%2Fsystemd.git pid1: various minor watchdog modernizations Just some clean-ups. --- diff --git a/src/core/manager.c b/src/core/manager.c index bf3a3c64f09..eed3ab75414 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -2938,7 +2938,7 @@ int manager_loop(Manager *m) { watchdog_usec = manager_get_watchdog(m, WATCHDOG_RUNTIME); if (timestamp_is_set(watchdog_usec)) - watchdog_ping(); + (void) watchdog_ping(); if (!ratelimit_below(&rl)) { /* Yay, something is going seriously wrong, pause a little */ diff --git a/src/shared/watchdog.c b/src/shared/watchdog.c index 4d3d8828f57..8c8fef6ca0e 100644 --- a/src/shared/watchdog.c +++ b/src/shared/watchdog.c @@ -7,6 +7,7 @@ #include #include +#include "errno-util.h" #include "fd-util.h" #include "log.h" #include "string-util.h" @@ -19,44 +20,40 @@ static usec_t watchdog_timeout = USEC_INFINITY; static usec_t watchdog_last_ping = USEC_INFINITY; static int update_timeout(void) { - int r; - if (watchdog_fd < 0) return 0; - if (watchdog_timeout == USEC_INFINITY) return 0; - else if (watchdog_timeout == 0) { + + if (watchdog_timeout == 0) { int flags; flags = WDIOS_DISABLECARD; - r = ioctl(watchdog_fd, WDIOC_SETOPTIONS, &flags); - if (r < 0) + if (ioctl(watchdog_fd, WDIOC_SETOPTIONS, &flags) < 0) return log_warning_errno(errno, "Failed to disable hardware watchdog: %m"); } else { - int sec, flags; char buf[FORMAT_TIMESPAN_MAX]; + int sec, flags; + usec_t t; - sec = (int) DIV_ROUND_UP(watchdog_timeout, USEC_PER_SEC); - r = ioctl(watchdog_fd, WDIOC_SETTIMEOUT, &sec); - if (r < 0) + t = DIV_ROUND_UP(watchdog_timeout, USEC_PER_SEC); + sec = (int) t >= INT_MAX ? INT_MAX : t; /* Saturate */ + if (ioctl(watchdog_fd, WDIOC_SETTIMEOUT, &sec) < 0) return log_warning_errno(errno, "Failed to set timeout to %is: %m", sec); watchdog_timeout = (usec_t) sec * USEC_PER_SEC; log_info("Set hardware watchdog to %s.", format_timespan(buf, sizeof(buf), watchdog_timeout, 0)); flags = WDIOS_ENABLECARD; - r = ioctl(watchdog_fd, WDIOC_SETOPTIONS, &flags); - if (r < 0) { + if (ioctl(watchdog_fd, WDIOC_SETOPTIONS, &flags) < 0) { /* ENOTTY means the watchdog is always enabled so we're fine */ - log_full(errno == ENOTTY ? LOG_DEBUG : LOG_WARNING, + log_full(ERRNO_IS_NOT_SUPPORTED(errno) ? LOG_DEBUG : LOG_WARNING, "Failed to enable hardware watchdog: %m"); - if (errno != ENOTTY) + if (!ERRNO_IS_NOT_SUPPORTED(errno)) return -errno; } - r = ioctl(watchdog_fd, WDIOC_KEEPALIVE, 0); - if (r < 0) + if (ioctl(watchdog_fd, WDIOC_KEEPALIVE, 0) < 0) return log_warning_errno(errno, "Failed to ping hardware watchdog: %m"); watchdog_last_ping = now(clock_boottime_or_monotonic()); @@ -67,19 +64,23 @@ static int update_timeout(void) { static int open_watchdog(void) { struct watchdog_info ident; + const char *fn; if (watchdog_fd >= 0) return 0; - watchdog_fd = open(watchdog_device ?: "/dev/watchdog", - O_WRONLY|O_CLOEXEC); + fn = watchdog_device ?: "/dev/watchdog"; + watchdog_fd = open(fn, O_WRONLY|O_CLOEXEC); if (watchdog_fd < 0) - return -errno; + return log_debug_errno(errno, "Failed to open watchdog device %s: %m", fn); - if (ioctl(watchdog_fd, WDIOC_GETSUPPORT, &ident) >= 0) - log_info("Hardware watchdog '%s', version %x", + if (ioctl(watchdog_fd, WDIOC_GETSUPPORT, &ident) < 0) + log_debug_errno(errno, "Hardware watchdog %s does not support WDIOC_GETSUPPORT ioctl: %m", fn); + else + log_info("Using hardware watchdog '%s', version %x, device %s", ident.identity, - ident.firmware_version); + ident.firmware_version, + fn); return update_timeout(); } @@ -102,8 +103,8 @@ int watchdog_set_timeout(usec_t *usec) { watchdog_timeout = *usec; - /* If we didn't open the watchdog yet and didn't get any - * explicit timeout value set, don't do anything */ + /* If we didn't open the watchdog yet and didn't get any explicit timeout value set, don't do + * anything */ if (watchdog_fd < 0 && watchdog_timeout == USEC_INFINITY) return 0; @@ -113,13 +114,11 @@ int watchdog_set_timeout(usec_t *usec) { r = update_timeout(); *usec = watchdog_timeout; - return r; } usec_t watchdog_runtime_wait(void) { - usec_t rtwait; - usec_t ntime; + usec_t rtwait, ntime; if (!timestamp_is_set(watchdog_timeout)) return USEC_INFINITY; @@ -155,18 +154,14 @@ int watchdog_ping(void) { return r; } - r = ioctl(watchdog_fd, WDIOC_KEEPALIVE, 0); - if (r < 0) + if (ioctl(watchdog_fd, WDIOC_KEEPALIVE, 0) < 0) return log_warning_errno(errno, "Failed to ping hardware watchdog: %m"); watchdog_last_ping = ntime; - return 0; } void watchdog_close(bool disarm) { - int r; - if (watchdog_fd < 0) return; @@ -175,8 +170,7 @@ void watchdog_close(bool disarm) { /* Explicitly disarm it */ flags = WDIOS_DISABLECARD; - r = ioctl(watchdog_fd, WDIOC_SETOPTIONS, &flags); - if (r < 0) + if (ioctl(watchdog_fd, WDIOC_SETOPTIONS, &flags) < 0) log_warning_errno(errno, "Failed to disable hardware watchdog: %m"); /* To be sure, use magic close logic, too */