Merge pull request #20787 from fbuihuu/watchdog-more-rework
Watchdog more rework
This commit is contained in:
@@ -6334,3 +6334,32 @@ int config_parse_swap_priority(
|
||||
s->parameters_fragment.priority_set = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int config_parse_watchdog_sec(
|
||||
const char *unit,
|
||||
const char *filename,
|
||||
unsigned line,
|
||||
const char *section,
|
||||
unsigned section_line,
|
||||
const char *lvalue,
|
||||
int ltype,
|
||||
const char *rvalue,
|
||||
void *data,
|
||||
void *userdata) {
|
||||
|
||||
assert(filename);
|
||||
assert(lvalue);
|
||||
assert(rvalue);
|
||||
|
||||
/* This is called for {Runtime,Reboot,KExec}WatchdogSec= where "default" maps to
|
||||
* USEC_INFINITY internally. */
|
||||
|
||||
if (streq(rvalue, "default")) {
|
||||
usec_t *usec = data;
|
||||
|
||||
*usec = USEC_INFINITY;
|
||||
return 0;
|
||||
}
|
||||
|
||||
return config_parse_sec(unit, filename, line, section, section_line, lvalue, ltype, rvalue, data, userdata);
|
||||
}
|
||||
|
||||
@@ -143,6 +143,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_extension_images);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_bpf_foreign_program);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_cgroup_socket_bind);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_restrict_network_interfaces);
|
||||
CONFIG_PARSER_PROTOTYPE(config_parse_watchdog_sec);
|
||||
|
||||
/* gperf prototypes */
|
||||
const struct ConfigPerfItem* load_fragment_gperf_lookup(const char *key, GPERF_LEN_TYPE length);
|
||||
|
||||
+30
-16
@@ -537,6 +537,23 @@ static int parse_proc_cmdline_item(const char *key, const char *value, void *dat
|
||||
|
||||
(void) parse_path_argument(value, false, &arg_watchdog_device);
|
||||
|
||||
} else if (proc_cmdline_key_streq(key, "systemd.watchdog_sec")) {
|
||||
|
||||
if (proc_cmdline_value_missing(key, value))
|
||||
return 0;
|
||||
|
||||
if (streq(value, "default"))
|
||||
arg_runtime_watchdog = USEC_INFINITY;
|
||||
else {
|
||||
r = parse_sec(value, &arg_runtime_watchdog);
|
||||
if (r < 0) {
|
||||
log_warning_errno(r, "Failed to parse systemd.watchdog_sec= argument '%s', ignoring: %m", value);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
arg_kexec_watchdog = arg_reboot_watchdog = arg_runtime_watchdog;
|
||||
|
||||
} else if (proc_cmdline_key_streq(key, "systemd.clock_usec")) {
|
||||
|
||||
if (proc_cmdline_value_missing(key, value))
|
||||
@@ -688,10 +705,10 @@ static int parse_config_file(void) {
|
||||
{ "Manager", "NUMAPolicy", config_parse_numa_policy, 0, &arg_numa_policy.type },
|
||||
{ "Manager", "NUMAMask", config_parse_numa_mask, 0, &arg_numa_policy },
|
||||
{ "Manager", "JoinControllers", config_parse_warn_compat, DISABLED_CONFIGURATION, NULL },
|
||||
{ "Manager", "RuntimeWatchdogSec", config_parse_sec, 0, &arg_runtime_watchdog },
|
||||
{ "Manager", "RebootWatchdogSec", config_parse_sec, 0, &arg_reboot_watchdog },
|
||||
{ "Manager", "ShutdownWatchdogSec", config_parse_sec, 0, &arg_reboot_watchdog }, /* obsolete alias */
|
||||
{ "Manager", "KExecWatchdogSec", config_parse_sec, 0, &arg_kexec_watchdog },
|
||||
{ "Manager", "RuntimeWatchdogSec", config_parse_watchdog_sec, 0, &arg_runtime_watchdog },
|
||||
{ "Manager", "RebootWatchdogSec", config_parse_watchdog_sec, 0, &arg_reboot_watchdog },
|
||||
{ "Manager", "ShutdownWatchdogSec", config_parse_watchdog_sec, 0, &arg_reboot_watchdog }, /* obsolete alias */
|
||||
{ "Manager", "KExecWatchdogSec", config_parse_watchdog_sec, 0, &arg_kexec_watchdog },
|
||||
{ "Manager", "WatchdogDevice", config_parse_path, 0, &arg_watchdog_device },
|
||||
{ "Manager", "CapabilityBoundingSet", config_parse_capability_set, 0, &arg_capability_bounding_set },
|
||||
{ "Manager", "NoNewPrivileges", config_parse_bool, 0, &arg_no_new_privs },
|
||||
@@ -1523,9 +1540,9 @@ static int become_shutdown(
|
||||
};
|
||||
|
||||
_cleanup_strv_free_ char **env_block = NULL;
|
||||
usec_t watchdog_timer = 0;
|
||||
size_t pos = 7;
|
||||
int r;
|
||||
usec_t watchdog_timer = 0;
|
||||
|
||||
assert(shutdown_verb);
|
||||
assert(!command_line[pos]);
|
||||
@@ -1574,19 +1591,16 @@ static int become_shutdown(
|
||||
else if (streq(shutdown_verb, "kexec"))
|
||||
watchdog_timer = arg_kexec_watchdog;
|
||||
|
||||
if (timestamp_is_set(watchdog_timer)) {
|
||||
/* If we reboot or kexec let's set the shutdown watchdog and tell the shutdown binary to
|
||||
* repeatedly ping it */
|
||||
r = watchdog_setup(watchdog_timer);
|
||||
watchdog_close(r < 0);
|
||||
/* If we reboot or kexec let's set the shutdown watchdog and tell the
|
||||
* shutdown binary to repeatedly ping it */
|
||||
r = watchdog_setup(watchdog_timer);
|
||||
watchdog_close(r < 0);
|
||||
|
||||
/* Tell the binary how often to ping, ignore failure */
|
||||
(void) strv_extendf(&env_block, "WATCHDOG_USEC="USEC_FMT, watchdog_timer);
|
||||
/* Tell the binary how often to ping, ignore failure */
|
||||
(void) strv_extendf(&env_block, "WATCHDOG_USEC="USEC_FMT, watchdog_timer);
|
||||
|
||||
if (arg_watchdog_device)
|
||||
(void) strv_extendf(&env_block, "WATCHDOG_DEVICE=%s", arg_watchdog_device);
|
||||
} else
|
||||
watchdog_close(true);
|
||||
if (arg_watchdog_device)
|
||||
(void) strv_extendf(&env_block, "WATCHDOG_DEVICE=%s", arg_watchdog_device);
|
||||
|
||||
/* Avoid the creation of new processes forked by the kernel; at this
|
||||
* point, we will not listen to the signals anyway */
|
||||
|
||||
+3
-10
@@ -3215,12 +3215,8 @@ void manager_set_watchdog(Manager *m, WatchdogType t, usec_t timeout) {
|
||||
return;
|
||||
|
||||
if (t == WATCHDOG_RUNTIME)
|
||||
if (!timestamp_is_set(m->watchdog_overridden[WATCHDOG_RUNTIME])) {
|
||||
if (timestamp_is_set(timeout))
|
||||
(void) watchdog_setup(timeout);
|
||||
else
|
||||
watchdog_close(true);
|
||||
}
|
||||
if (!timestamp_is_set(m->watchdog_overridden[WATCHDOG_RUNTIME]))
|
||||
(void) watchdog_setup(timeout);
|
||||
|
||||
m->watchdog[t] = timeout;
|
||||
}
|
||||
@@ -3238,10 +3234,7 @@ int manager_override_watchdog(Manager *m, WatchdogType t, usec_t timeout) {
|
||||
if (t == WATCHDOG_RUNTIME) {
|
||||
usec_t usec = timestamp_is_set(timeout) ? timeout : m->watchdog[t];
|
||||
|
||||
if (timestamp_is_set(usec))
|
||||
(void) watchdog_setup(usec);
|
||||
else
|
||||
watchdog_close(true);
|
||||
(void) watchdog_setup(usec);
|
||||
}
|
||||
|
||||
m->watchdog_overridden[t] = timeout;
|
||||
|
||||
Reference in New Issue
Block a user