chiark / gitweb /
Prep v234: Eventually fix the cgroup stuff. elogind is not init.
authorSven Eden <yamakuzure@gmx.net>
Thu, 27 Jul 2017 08:18:44 +0000 (10:18 +0200)
committerSven Eden <yamakuzure@gmx.net>
Thu, 27 Jul 2017 08:18:44 +0000 (10:18 +0200)
src/basic/cgroup-util.c
src/basic/cgroup-util.h
src/core/cgroup.c
src/core/mount-setup.c
src/login/elogind.c
src/login/elogind.h
src/login/logind.c

index 315c449..323c637 100644 (file)
@@ -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) {
index 1ea4d3d..4c6ab11 100644 (file)
@@ -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);
index 9fa81ea..4776380 100644 (file)
@@ -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);
index d056a9f..5a5bc7f 100644 (file)
@@ -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
 };
index 57d6fe4..30cab49 100644 (file)
 #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
index 155654b..3a6b89b 100644 (file)
@@ -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()
index d46358e..b09ecf6 100644 (file)
@@ -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;