We're moving towards unified cgroup hierarchy where this is not necessary.
This makes main.c a bit simpler.
"Consult http://freedesktop.org/wiki/Software/systemd/separate-usr-is-broken for more information.");
}
-static int initialize_join_controllers(void) {
- /* By default, mount "cpu" + "cpuacct" together, and "net_cls"
- * + "net_prio". We'd like to add "cpuset" to the mix, but
- * "cpuset" doesn't really work for groups with no initialized
- * attributes. */
-
- arg_join_controllers = new(char**, 3);
- if (!arg_join_controllers)
- return -ENOMEM;
-
- arg_join_controllers[0] = strv_new("cpu", "cpuacct", NULL);
- if (!arg_join_controllers[0])
- goto oom;
-
- arg_join_controllers[1] = strv_new("net_cls", "net_prio", NULL);
- if (!arg_join_controllers[1])
- goto oom;
-
- arg_join_controllers[2] = NULL;
- return 0;
-
-oom:
- arg_join_controllers = strv_free_free(arg_join_controllers);
- return -ENOMEM;
-}
-
static int enforce_syscall_archs(Set *archs) {
#if HAVE_SECCOMP
int r;
assert(ret_error_message);
- r = initialize_join_controllers();
- if (r < 0) {
- *ret_error_message = "Failed to initialize cgroup controller joining table";
- return r;
- }
-
arg_default_tasks_max = system_tasks_max_scale(DEFAULT_TASKS_MAX_PERCENTAGE, 100U);
r = parse_config_file();
/* Mount all available cgroup controllers that are built into the kernel. */
+ if (!join_controllers)
+ /* The defaults:
+ * mount "cpu" + "cpuacct" together, and "net_cls" + "net_prio".
+ *
+ * We'd like to add "cpuset" to the mix, but "cpuset" doesn't really
+ * work for groups with no initialized attributes.
+ */
+ join_controllers = (char**[]) {
+ STRV_MAKE("cpu", "cpuacct"),
+ STRV_MAKE("net_cls", "net_prio"),
+ NULL,
+ };
+
r = cg_kernel_controllers(&controllers);
if (r < 0)
return log_error_errno(r, "Failed to enumerate cgroup controllers: %m");
if (!controller)
break;
- if (join_controllers)
- for (k = join_controllers; *k; k++)
- if (strv_find(*k, controller))
- break;
+ for (k = join_controllers; *k; k++)
+ if (strv_find(*k, controller))
+ break;
if (k && *k) {
char **i, **j;
if (!isempty(rvalue))
log_syntax(unit, LOG_ERR, filename, line, 0, "Trailing garbage, ignoring.");
+ /* As a special case, return a single empty strv, to override the default */
+ if (!controllers) {
+ controllers = new(char**, 2);
+ if (!controllers)
+ return log_oom();
+ controllers[0] = strv_new(NULL, NULL);
+ if (!controllers[0])
+ return log_oom();
+ controllers[1] = NULL;
+ }
+
strv_free_free(*ret);
*ret = controllers;
controllers = NULL;
/* Test special case of no mounted controllers */
r = config_parse_join_controllers(NULL, "example.conf", 12, "Section", 10, "JoinControllers", 0, "", &c, NULL);
assert_se(r == 0);
- assert_se(c == NULL);
+ assert_se(c);
+ assert_se(strv_equal(c[0], STRV_MAKE_EMPTY));
+ assert_se(c[1] == NULL);
/* Test merging of overlapping lists */
r = config_parse_join_controllers(NULL, "example.conf", 13, "Section", 10, "JoinControllers", 0, "a,b b,c", &c, NULL);