X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fcore%2Fcgroup.c;h=04816239cc39ddfad6ca2590919be34e94b3ef5c;hp=bc5ff23a10c704e249a396e47c9051b7bad2e632;hb=HEAD;hpb=37199e725d1f2bb3ec1cdb582172401697bd4b7c diff --git a/src/core/cgroup.c b/src/core/cgroup.c index bc5ff23a1..04816239c 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -399,8 +399,7 @@ static int whitelist_major(const char *path, const char *name, char type, const return 0; fail: - log_warning_errno(errno, "Failed to read /proc/devices: %m"); - return -errno; + return log_warning_errno(errno, "Failed to read /proc/devices: %m"); } static bool cgroup_context_has_cpu_weight(CGroupContext *c) { @@ -1261,7 +1260,7 @@ int unit_watch_cgroup(Unit *u) { return 0; /* Only applies to the unified hierarchy */ - r = cg_unified(SYSTEMD_CGROUP_CONTROLLER); + r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER); if (r < 0) return log_error_errno(r, "Failed to determine whether the name=systemd hierarchy is unified: %m"); if (r == 0) @@ -1686,7 +1685,7 @@ int unit_watch_all_pids(Unit *u) { if (!u->cgroup_path) return -ENOENT; - r = cg_unified(SYSTEMD_CGROUP_CONTROLLER); + r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER); if (r < 0) return r; if (r > 0) /* On unified we can use proper notifications */ @@ -1770,7 +1769,11 @@ int manager_setup_cgroup(Manager *m) { /* 1. Determine hierarchy */ m->cgroup_root = mfree(m->cgroup_root); +#if 0 /// elogind is not init and must therefore search for PID 1 instead of self. r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 0, &m->cgroup_root); +#else + r = cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 1, &m->cgroup_root); +#endif // 0 if (r < 0) return log_error_errno(r, "Cannot determine cgroup we are running in: %m"); @@ -1814,7 +1817,7 @@ int manager_setup_cgroup(Manager *m) { if (r > 0) log_debug("Unified cgroup hierarchy is located at %s.", path); else { - r = cg_unified(SYSTEMD_CGROUP_CONTROLLER); + r = cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER); if (r < 0) return log_error_errno(r, "Failed to determine whether systemd's own controller is in unified mode: %m"); if (r > 0) @@ -1826,13 +1829,13 @@ int manager_setup_cgroup(Manager *m) { if (!m->test_run) { const char *scope_path; +#if 0 /// elogind is not init, and does not install the agent here. /* 3. Install agent */ - if (cg_unified(SYSTEMD_CGROUP_CONTROLLER) > 0) { + if (cg_unified_controller(SYSTEMD_CGROUP_CONTROLLER) > 0) { /* In the unified hierarchy we can get * cgroup empty notifications via inotify. */ -#if 0 /// elogind does not support the unified hierarchy, yet. m->cgroup_inotify_event_source = sd_event_source_unref(m->cgroup_inotify_event_source); safe_close(m->cgroup_inotify_fd); @@ -1852,9 +1855,6 @@ int manager_setup_cgroup(Manager *m) { (void) sd_event_source_set_description(m->cgroup_inotify_event_source, "cgroup-inotify"); -#else - return log_error_errno(EOPNOTSUPP, "Unified cgroup hierarchy not supported: %m"); -#endif // 0 } else if (MANAGER_IS_SYSTEM(m)) { /* On the legacy hierarchy we only get @@ -1872,12 +1872,17 @@ int manager_setup_cgroup(Manager *m) { log_debug("Release agent already installed."); } -#if 0 /// elogind is not meant to run in systemd init scope /* 4. Make sure we are in the special "init.scope" unit in the root slice. */ scope_path = strjoina(m->cgroup_root, "/" SPECIAL_INIT_SCOPE); r = cg_create_and_attach(SYSTEMD_CGROUP_CONTROLLER, scope_path, 0); #else - if (streq(SYSTEMD_CGROUP_CONTROLLER, "name=elogind")) + /* Note: + * This method is in core, and normally called by systemd + * being init. As elogind is never init, we can not install + * our agent here. We do so when mounting our cgroup file + * system, so only if elogind is its own tiny controller. + * Further, elogind is not meant to run in systemd init scope. */ + if (MANAGER_IS_SYSTEM(m)) // we are our own cgroup controller scope_path = strjoina(""); else if (streq(m->cgroup_root, "/elogind")) @@ -1892,11 +1897,13 @@ int manager_setup_cgroup(Manager *m) { return log_error_errno(r, "Failed to create %s control group: %m", scope_path); log_debug_elogind("Created control group \"%s\"", scope_path); +#if 0 /// elogind is not a "sub-controller" like systemd, so migration is not needed. /* also, move all other userspace processes remaining * in the root cgroup into that scope. */ r = cg_migrate(SYSTEMD_CGROUP_CONTROLLER, m->cgroup_root, SYSTEMD_CGROUP_CONTROLLER, scope_path, 0); if (r < 0) log_warning_errno(r, "Couldn't move remaining userspace processes, ignoring: %m"); +#endif // 0 /* 5. And pin it, so that it cannot be unmounted */ safe_close(m->pin_cgroupfs_fd);