We're moving towards unified cgroup hierarchy where this is not necessary.
This makes main.c a bit simpler.
/* 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);