209 lines
8.5 KiB
Diff
209 lines
8.5 KiB
Diff
|
From 0387294ba41ceaf80c79621409aab9508732bda0 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
|
||
|
Date: Fri, 24 May 2019 09:41:44 +0200
|
||
|
Subject: [PATCH] pid1: when reloading configuration, forget old settings
|
||
|
|
||
|
If we had a configuration setting from a configuration file, and it was
|
||
|
removed, we'd still remember the old value, because there's was no mechanism to
|
||
|
"reset" everything, just to assign new values.
|
||
|
|
||
|
Note that the effect of this is limited. For settings that have an "ongoing" effect,
|
||
|
like systemd.confirm_spawn, the new value is simply used. But some settings can only
|
||
|
be set at start.
|
||
|
|
||
|
In particular, CPUAffinity= will be updated if set to a new value, but if
|
||
|
CPUAffinity= is fully removed, it will not be reset, simply because we don't
|
||
|
know what to reset it to. We might have inherited a setting, or we might have
|
||
|
set it ourselves. In principle we could remember the "original" value that was
|
||
|
set when we were executed, but propagate this over reloads and reexecs, but
|
||
|
that would be a lot of work for little gain. So this corner case of removal of
|
||
|
CPUAffinity= is not handled fully, and a reboot is needed to execute the
|
||
|
change. As a work-around, a full mask of CPUAffinity=0-8191 can be specified.
|
||
|
|
||
|
(cherry picked from commit fb39af4ce42d7ef9af63009f271f404038703704)
|
||
|
|
||
|
Related: #1734787
|
||
|
---
|
||
|
src/core/main.c | 139 +++++++++++++++++++++++++++++++++---------------
|
||
|
1 file changed, 95 insertions(+), 44 deletions(-)
|
||
|
|
||
|
diff --git a/src/core/main.c b/src/core/main.c
|
||
|
index 9a9f145080..c74dc641c1 100644
|
||
|
--- a/src/core/main.c
|
||
|
+++ b/src/core/main.c
|
||
|
@@ -88,46 +88,52 @@ static enum {
|
||
|
ACTION_DUMP_CONFIGURATION_ITEMS,
|
||
|
ACTION_DUMP_BUS_PROPERTIES,
|
||
|
} arg_action = ACTION_RUN;
|
||
|
-static char *arg_default_unit = NULL;
|
||
|
-static bool arg_system = false;
|
||
|
-static bool arg_dump_core = true;
|
||
|
-static int arg_crash_chvt = -1;
|
||
|
-static bool arg_crash_shell = false;
|
||
|
-static bool arg_crash_reboot = false;
|
||
|
-static char *arg_confirm_spawn = NULL;
|
||
|
-static ShowStatus arg_show_status = _SHOW_STATUS_UNSET;
|
||
|
-static bool arg_switched_root = false;
|
||
|
-static bool arg_no_pager = false;
|
||
|
-static bool arg_service_watchdogs = true;
|
||
|
+
|
||
|
+/* Those variables are initalized to 0 automatically, so we avoid uninitialized memory access.
|
||
|
+ * Real defaults are assigned in reset_arguments() below. */
|
||
|
+static char *arg_default_unit;
|
||
|
+static bool arg_system;
|
||
|
+static bool arg_dump_core;
|
||
|
+static int arg_crash_chvt;
|
||
|
+static bool arg_crash_shell;
|
||
|
+static bool arg_crash_reboot;
|
||
|
+static char *arg_confirm_spawn;
|
||
|
+static ShowStatus arg_show_status;
|
||
|
+static bool arg_switched_root;
|
||
|
+static bool arg_no_pager;
|
||
|
+static bool arg_service_watchdogs;
|
||
|
static char ***arg_join_controllers = NULL;
|
||
|
-static ExecOutput arg_default_std_output = EXEC_OUTPUT_JOURNAL;
|
||
|
-static ExecOutput arg_default_std_error = EXEC_OUTPUT_INHERIT;
|
||
|
-static usec_t arg_default_restart_usec = DEFAULT_RESTART_USEC;
|
||
|
-static usec_t arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
|
||
|
-static usec_t arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
|
||
|
-static usec_t arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
|
||
|
-static unsigned arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
|
||
|
-static usec_t arg_runtime_watchdog = 0;
|
||
|
-static usec_t arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
|
||
|
-static char *arg_watchdog_device = NULL;
|
||
|
-static char **arg_default_environment = NULL;
|
||
|
-static struct rlimit *arg_default_rlimit[_RLIMIT_MAX] = {};
|
||
|
-static uint64_t arg_capability_bounding_set = CAP_ALL;
|
||
|
-static bool arg_no_new_privs = false;
|
||
|
-static nsec_t arg_timer_slack_nsec = NSEC_INFINITY;
|
||
|
-static usec_t arg_default_timer_accuracy_usec = 1 * USEC_PER_MINUTE;
|
||
|
-static Set* arg_syscall_archs = NULL;
|
||
|
-static FILE* arg_serialization = NULL;
|
||
|
-static bool arg_default_cpu_accounting = false;
|
||
|
-static bool arg_default_io_accounting = false;
|
||
|
-static bool arg_default_ip_accounting = false;
|
||
|
-static bool arg_default_blockio_accounting = false;
|
||
|
-static bool arg_default_memory_accounting = MEMORY_ACCOUNTING_DEFAULT;
|
||
|
-static bool arg_default_tasks_accounting = true;
|
||
|
-static uint64_t arg_default_tasks_max = UINT64_MAX;
|
||
|
-static sd_id128_t arg_machine_id = {};
|
||
|
-static EmergencyAction arg_cad_burst_action = EMERGENCY_ACTION_REBOOT_FORCE;
|
||
|
-static CPUSet arg_cpu_affinity = {};
|
||
|
+static ExecOutput arg_default_std_output;
|
||
|
+static ExecOutput arg_default_std_error;
|
||
|
+static usec_t arg_default_restart_usec;
|
||
|
+static usec_t arg_default_timeout_start_usec;
|
||
|
+static usec_t arg_default_timeout_stop_usec;
|
||
|
+static usec_t arg_default_timeout_abort_usec;
|
||
|
+static bool arg_default_timeout_abort_set;
|
||
|
+static usec_t arg_default_start_limit_interval;
|
||
|
+static unsigned arg_default_start_limit_burst;
|
||
|
+static usec_t arg_runtime_watchdog;
|
||
|
+static usec_t arg_shutdown_watchdog;
|
||
|
+static char *arg_early_core_pattern;
|
||
|
+static char *arg_watchdog_device;
|
||
|
+static char **arg_default_environment;
|
||
|
+static struct rlimit *arg_default_rlimit[_RLIMIT_MAX];
|
||
|
+static uint64_t arg_capability_bounding_set;
|
||
|
+static bool arg_no_new_privs;
|
||
|
+static nsec_t arg_timer_slack_nsec;
|
||
|
+static usec_t arg_default_timer_accuracy_usec;
|
||
|
+static Set* arg_syscall_archs;
|
||
|
+static FILE* arg_serialization;
|
||
|
+static int arg_default_cpu_accounting;
|
||
|
+static bool arg_default_io_accounting;
|
||
|
+static bool arg_default_ip_accounting;
|
||
|
+static bool arg_default_blockio_accounting;
|
||
|
+static bool arg_default_memory_accounting;
|
||
|
+static bool arg_default_tasks_accounting;
|
||
|
+static uint64_t arg_default_tasks_max;
|
||
|
+static sd_id128_t arg_machine_id;
|
||
|
+static EmergencyAction arg_cad_burst_action;
|
||
|
+static CPUSet arg_cpu_affinity;
|
||
|
|
||
|
static int parse_configuration(void);
|
||
|
|
||
|
@@ -1951,17 +1957,59 @@ static int do_queue_default_job(
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
-static void free_arguments(void) {
|
||
|
-
|
||
|
- /* Frees all arg_* variables, with the exception of arg_serialization */
|
||
|
- rlimit_free_all(arg_default_rlimit);
|
||
|
+static void reset_arguments(void) {
|
||
|
+ /* Frees/resets arg_* variables, with a few exceptions commented below. */
|
||
|
|
||
|
arg_default_unit = mfree(arg_default_unit);
|
||
|
+
|
||
|
+ /* arg_system — ignore */
|
||
|
+
|
||
|
+ arg_dump_core = true;
|
||
|
+ arg_crash_chvt = -1;
|
||
|
+ arg_crash_shell = false;
|
||
|
+ arg_crash_reboot = false;
|
||
|
arg_confirm_spawn = mfree(arg_confirm_spawn);
|
||
|
arg_join_controllers = strv_free_free(arg_join_controllers);
|
||
|
+ arg_show_status = _SHOW_STATUS_UNSET;
|
||
|
+ arg_switched_root = false;
|
||
|
+ arg_no_pager = false;
|
||
|
+ arg_service_watchdogs = true;
|
||
|
+ arg_default_std_output = EXEC_OUTPUT_JOURNAL;
|
||
|
+ arg_default_std_error = EXEC_OUTPUT_INHERIT;
|
||
|
+ arg_default_restart_usec = DEFAULT_RESTART_USEC;
|
||
|
+ arg_default_timeout_start_usec = DEFAULT_TIMEOUT_USEC;
|
||
|
+ arg_default_timeout_stop_usec = DEFAULT_TIMEOUT_USEC;
|
||
|
+ arg_default_timeout_abort_usec = DEFAULT_TIMEOUT_USEC;
|
||
|
+ arg_default_timeout_abort_set = false;
|
||
|
+ arg_default_start_limit_interval = DEFAULT_START_LIMIT_INTERVAL;
|
||
|
+ arg_default_start_limit_burst = DEFAULT_START_LIMIT_BURST;
|
||
|
+ arg_runtime_watchdog = 0;
|
||
|
+ arg_shutdown_watchdog = 10 * USEC_PER_MINUTE;
|
||
|
+ arg_early_core_pattern = NULL;
|
||
|
+ arg_watchdog_device = NULL;
|
||
|
+
|
||
|
arg_default_environment = strv_free(arg_default_environment);
|
||
|
+ rlimit_free_all(arg_default_rlimit);
|
||
|
+
|
||
|
+ arg_capability_bounding_set = CAP_ALL;
|
||
|
+ arg_no_new_privs = false;
|
||
|
+ arg_timer_slack_nsec = NSEC_INFINITY;
|
||
|
+ arg_default_timer_accuracy_usec = 1 * USEC_PER_MINUTE;
|
||
|
+
|
||
|
arg_syscall_archs = set_free(arg_syscall_archs);
|
||
|
|
||
|
+ /* arg_serialization — ignore */
|
||
|
+
|
||
|
+ arg_default_cpu_accounting = -1;
|
||
|
+ arg_default_io_accounting = false;
|
||
|
+ arg_default_ip_accounting = false;
|
||
|
+ arg_default_blockio_accounting = false;
|
||
|
+ arg_default_memory_accounting = MEMORY_ACCOUNTING_DEFAULT;
|
||
|
+ arg_default_tasks_accounting = true;
|
||
|
+ arg_default_tasks_max = UINT64_MAX;
|
||
|
+ arg_machine_id = (sd_id128_t) {};
|
||
|
+ arg_cad_burst_action = EMERGENCY_ACTION_REBOOT_FORCE;
|
||
|
+
|
||
|
cpu_set_reset(&arg_cpu_affinity);
|
||
|
}
|
||
|
|
||
|
@@ -1970,6 +2018,9 @@ static int parse_configuration(void) {
|
||
|
|
||
|
arg_default_tasks_max = system_tasks_max_scale(DEFAULT_TASKS_MAX_PERCENTAGE, 100U);
|
||
|
|
||
|
+ /* Assign configuration defaults */
|
||
|
+ reset_arguments();
|
||
|
+
|
||
|
r = parse_config_file();
|
||
|
if (r < 0)
|
||
|
log_warning_errno(r, "Failed to parse config file, ignoring: %m");
|
||
|
@@ -2460,7 +2511,7 @@ finish:
|
||
|
m = manager_free(m);
|
||
|
}
|
||
|
|
||
|
- free_arguments();
|
||
|
+ reset_arguments();
|
||
|
mac_selinux_finish();
|
||
|
|
||
|
if (reexecute)
|