From acf253bd3b176f711cefb4b53fff29b89a18c7cd Mon Sep 17 00:00:00 2001 From: Sven Eden Date: Thu, 27 Jul 2017 10:18:44 +0200 Subject: [PATCH] Prep v234: Eventually fix the cgroup stuff. elogind is not init. --- src/basic/cgroup-util.c | 12 +++++---- src/basic/cgroup-util.h | 2 +- src/core/cgroup.c | 21 ++++++++++----- src/core/mount-setup.c | 4 +-- src/login/elogind.c | 58 +---------------------------------------- src/login/elogind.h | 1 - src/login/logind.c | 1 - 7 files changed, 25 insertions(+), 74 deletions(-) diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index 315c44965..323c637fe 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -1088,6 +1088,7 @@ int cg_pid_get_path(const char *controller, pid_t pid, char **path) { return -ENODATA; } +#if 0 /// UNNEEDED by elogind int cg_install_release_agent(const char *controller, const char *agent) { _cleanup_free_ char *fs = NULL, *contents = NULL; const char *sc; @@ -1110,6 +1111,7 @@ int cg_install_release_agent(const char *controller, const char *agent) { return r; sc = strstrip(contents); + if (isempty(sc)) { r = write_string_file(fs, agent, 0); if (r < 0) @@ -1172,6 +1174,7 @@ int cg_uninstall_release_agent(const char *controller) { return 0; } +#endif // 0 int cg_is_empty(const char *controller, const char *path) { _cleanup_fclose_ FILE *f = NULL; @@ -1360,7 +1363,6 @@ int cg_mangle_path(const char *path, char **result) { } int cg_get_root_path(char **path) { -#if 0 /// elogind does not support systemd scopes and slices char *p, *e; int r; @@ -1370,20 +1372,20 @@ int cg_get_root_path(char **path) { if (r < 0) return r; +#if 0 /// elogind does not support systemd scopes and slices e = endswith(p, "/" SPECIAL_INIT_SCOPE); if (!e) e = endswith(p, "/" SPECIAL_SYSTEM_SLICE); /* legacy */ if (!e) e = endswith(p, "/system"); /* even more legacy */ +#else + e = endswith(p, "/elogind"); +#endif // 0 if (e) *e = 0; *path = p; return 0; -#else - assert(path); - return cg_pid_get_path(SYSTEMD_CGROUP_CONTROLLER, 1, path); -#endif // 0 } int cg_shift_path(const char *cgroup, const char *root, const char **shifted) { diff --git a/src/basic/cgroup-util.h b/src/basic/cgroup-util.h index 1ea4d3d08..4c6ab1137 100644 --- a/src/basic/cgroup-util.h +++ b/src/basic/cgroup-util.h @@ -192,10 +192,10 @@ int cg_set_task_access(const char *controller, const char *path, mode_t mode, ui int cg_set_xattr(const char *controller, const char *path, const char *name, const void *value, size_t size, int flags); int cg_get_xattr(const char *controller, const char *path, const char *name, void *value, size_t size); -#endif // 0 int cg_install_release_agent(const char *controller, const char *agent); int cg_uninstall_release_agent(const char *controller); +#endif // 0 int cg_is_empty(const char *controller, const char *path); int cg_is_empty_recursive(const char *controller, const char *path); diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 9fa81eaaa..4776380b8 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -1769,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"); @@ -1825,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_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); @@ -1851,11 +1855,7 @@ 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 * notifications via cgroup agents. (Which * isn't really reliable, since it does not @@ -1871,12 +1871,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")) @@ -1891,11 +1896,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); diff --git a/src/core/mount-setup.c b/src/core/mount-setup.c index d056a9f2e..5a5bc7fda 100644 --- a/src/core/mount-setup.c +++ b/src/core/mount-setup.c @@ -118,9 +118,9 @@ static const MountPoint mount_table[] = { is_efi_boot, MNT_NONE }, #endif #else - { "cgroup", "/sys/fs/cgroup/elogind", "cgroup", "none,name=elogind,xattr", MS_NOSUID|MS_NOEXEC|MS_NODEV, + { "cgroup", "/sys/fs/cgroup/elogind", "cgroup", "none,name=elogind,release_agent="SYSTEMD_CGROUP_AGENT_PATH",xattr", MS_NOSUID|MS_NOEXEC|MS_NODEV, cg_is_legacy_wanted, MNT_IN_CONTAINER }, - { "cgroup", "/sys/fs/cgroup/elogind", "cgroup", "none,name=elogind", MS_NOSUID|MS_NOEXEC|MS_NODEV, + { "cgroup", "/sys/fs/cgroup/elogind", "cgroup", "none,name=elogind,release_agent="SYSTEMD_CGROUP_AGENT_PATH, MS_NOSUID|MS_NOEXEC|MS_NODEV, cg_is_legacy_wanted, MNT_FATAL|MNT_IN_CONTAINER }, #endif // 0 }; diff --git a/src/login/elogind.c b/src/login/elogind.c index 57d6fe433..30cab4949 100644 --- a/src/login/elogind.c +++ b/src/login/elogind.c @@ -32,62 +32,6 @@ #define CGROUPS_AGENT_RCVBUF_SIZE (8*1024*1024) -static int signal_agent_released(sd_bus_message *message, void *userdata, sd_bus_error *error) { - _cleanup_(sd_bus_creds_unrefp) sd_bus_creds *creds = NULL; - Manager *m = userdata; - const char *cgroup; - uid_t sender_uid; - int r; - - assert(message); - assert(m); - - /* only accept org.freedesktop.login1.Agent from UID=0 */ - r = sd_bus_query_sender_creds(message, SD_BUS_CREDS_EUID, &creds); - if (r < 0) - return r; - - r = sd_bus_creds_get_euid(creds, &sender_uid); - if (r < 0 || sender_uid != 0) - return 0; - - /* parse 'cgroup-empty' notification */ - r = sd_bus_message_read(message, "s", &cgroup); - if (r < 0) { - bus_log_parse_error(r); - return 0; - } - - manager_notify_cgroup_empty(m, cgroup); - - return 0; -} - -/// Add-On for manager_connect_bus() -/// Original: src/core/dbus.c:bus_setup_system() -void elogind_bus_setup_system(Manager* m) { - int r; - - assert(m); - assert(m->bus); - - /* if we are a user instance we get the Released message via the system bus */ - if (MANAGER_IS_USER(m)) { - r = sd_bus_add_match( - m->bus, - NULL, - "type='signal'," - "interface='org.freedesktop.login1.Agent'," - "member='Released'," - "path='/org/freedesktop.login1/agent'", - signal_agent_released, m); - if (r < 0) - log_warning_errno(r, "Failed to register Released match on system bus: %m"); - } - - log_debug("Successfully connected to system bus."); -} - static int manager_dispatch_cgroups_agent_fd(sd_event_source *source, int fd, uint32_t revents, void *userdata) { Manager *m = userdata; char buf[PATH_MAX+1]; @@ -228,7 +172,7 @@ int elogind_manager_new(Manager* m) { m->hybrid_sleep_state = NULL; /* If elogind should be its own controller, mount its cgroup */ - if (streq(SYSTEMD_CGROUP_CONTROLLER, "name=elogind")) { + if (streq(SYSTEMD_CGROUP_CONTROLLER, "_elogind")) { m->is_system = true; r = mount_setup(true); } else diff --git a/src/login/elogind.h b/src/login/elogind.h index 155654b04..3a6b89b74 100644 --- a/src/login/elogind.h +++ b/src/login/elogind.h @@ -27,7 +27,6 @@ /// Add-Ons for manager_connect_bus() -void elogind_bus_setup_system(Manager* m); int elogind_setup_cgroups_agent(Manager *m); /// Add-On for manager_free() diff --git a/src/login/logind.c b/src/login/logind.c index d46358e31..b09ecf611 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -795,7 +795,6 @@ static int manager_connect_bus(Manager *m) { #if 0 /// elogind has to setup its release agent return 0; #else - elogind_bus_setup_system(m); r = elogind_setup_cgroups_agent(m); return r; -- 2.30.2