chiark / gitweb /
Add --enable-debug=elogind configure option and fix cgroup path
authorSven Eden <yamakuzure@gmx.net>
Mon, 20 Feb 2017 04:57:50 +0000 (05:57 +0100)
committerSven Eden <yamakuzure@gmx.net>
Tue, 14 Mar 2017 09:23:13 +0000 (10:23 +0100)
a) Add some debugging messages to track what's going on with eloginds
   cgroup handling.
b) Do not create a cgroup path "/elogind" if our cgroup root is
   already "/elogind".

configure.ac
src/basic/cgroup-util.c
src/basic/log.h
src/core/cgroup.c
src/libelogind/sd-bus/bus-creds.c
src/login/logind-core.c
src/login/logind.c

index 5da0e12..dc889a7 100644 (file)
@@ -664,14 +664,17 @@ AC_ARG_ENABLE(tests,
 AM_CONDITIONAL(ENABLE_TESTS, [test x$enable_tests = xyes])
 
 AC_ARG_ENABLE(debug,
-        [AC_HELP_STRING([--enable-debug@<:@=LIST@:>@], [enable extra debugging (hashmap,mmap-cache)])],
+        [AC_HELP_STRING([--enable-debug@<:@=LIST@:>@], [enable extra debugging (elogind,hashmap,mmap-cache)])],
         [if test "x$enableval" = "xyes"; then
-                enableval="hashmap,mmap-cache"
+                enableval="elogind,hashmap,mmap-cache"
         fi
         saved_ifs="$IFS"
         IFS="$IFS$PATH_SEPARATOR,"
         for name in $enableval; do
                 case $name in
+                elogind)
+                        enable_debug_elogind=yes
+                        ;;
                 hashmap)
                         enable_debug_hashmap=yes
                         ;;
@@ -683,6 +686,10 @@ AC_ARG_ENABLE(debug,
         IFS="$saved_ifs"],[])
 
 enable_debug=""
+AS_IF([test x$enable_debug_elogind = xyes], [
+        AC_DEFINE(ENABLE_DEBUG_ELOGIND, 1, [Define if elogind debugging is to be enabled])
+        enable_debug="elogind $enable_debug"
+])
 AS_IF([test x$enable_debug_hashmap = xyes], [
         AC_DEFINE(ENABLE_DEBUG_HASHMAP, 1, [Define if hashmap debugging is to be enabled])
         enable_debug="hashmap $enable_debug"
index 92d09f0..98a353d 100644 (file)
@@ -297,6 +297,10 @@ int cg_migrate(const char *cfrom, const char *pfrom, const char *cto, const char
 
         my_pid = getpid();
 
+        log_debug_elogind("Migrating \"%s\"/\"%s\" to \"%s\"/\"%s\" (%s)",
+                          cfrom, pfrom, cto, pto,
+                          ignore_self ? "ignoring self" : "watching self");
+
         do {
                 _cleanup_fclose_ FILE *f = NULL;
                 pid_t pid = 0;
@@ -1222,6 +1226,8 @@ int cg_pid_get_path_shifted(pid_t pid, const char *root, char **cgroup) {
         if (r < 0)
                 return r;
 
+        log_debug_elogind("Shifting path: \"%s\" (PID %u, root: \"%s\")",
+                          raw, pid, root ? root : "NULL");
         r = cg_shift_path(raw, root, &c);
         if (r < 0)
                 return r;
@@ -1238,6 +1244,7 @@ int cg_pid_get_path_shifted(pid_t pid, const char *root, char **cgroup) {
 
                 *cgroup = n;
         }
+        log_debug_elogind("Resulting cgroup:\"%s\"", *cgroup);
 
         return 0;
 }
@@ -1522,6 +1529,7 @@ int cg_path_get_session(const char *path, char **session) {
         const char *e, *n, *start;
 
         assert(path);
+        log_debug_elogind("path is \"%s\"", path);
         assert(path[0] == '/');
 
         e = path + 1;
@@ -1539,6 +1547,7 @@ int cg_path_get_session(const char *path, char **session) {
         if (session) {
                 char *rr;
 
+                log_debug_elogind("found session: \"%s\"", start);
                 rr = strdup(start);
                 if (!rr)
                         return -ENOMEM;
index 3ed6a0e..cedf881 100644 (file)
@@ -187,6 +187,12 @@ void log_assert_failed_return(
 #  define log_trace(...) do {} while(0)
 #endif
 
+#ifdef ENABLE_DEBUG_ELOGIND
+#  define log_debug_elogind(...) log_debug(__VA_ARGS__);usleep(25*USEC_PER_MSEC)
+#else
+#  define log_debug_elogind(...) do {} while(0)
+#endif // ENABLE_DEBUG_ELOGIND
+
 /* Structured logging */
 #define log_struct(level, ...) log_struct_internal(level, 0, __FILE__, __LINE__, __func__, __VA_ARGS__)
 #define log_struct_errno(level, error, ...) log_struct_internal(level, error, __FILE__, __LINE__, __func__, __VA_ARGS__)
index b517415..139178e 100644 (file)
@@ -1232,7 +1232,6 @@ int manager_setup_cgroup(Manager *m) {
         r = cg_pid_get_path(ELOGIND_CGROUP_CONTROLLER, 0, &m->cgroup_root);
         if (r < 0)
                 return log_error_errno(r, "Cannot determine cgroup we are running in: %m");
-
 /// elogind does not support systemd scopes and slices
 #if 0
         /* Chop off the init scope, if we are already located in it */
@@ -1256,6 +1255,8 @@ int manager_setup_cgroup(Manager *m) {
          * it everywhere. */
         while ((e = endswith(m->cgroup_root, "/")))
                 *e = 0;
+        log_debug_elogind("Cgroup Controller \"%s\" -> root \"%s\"",
+                          ELOGIND_CGROUP_CONTROLLER, m->cgroup_root);
 
         /* 2. Show data */
         r = cg_get_path(ELOGIND_CGROUP_CONTROLLER, m->cgroup_root, NULL, &path);
@@ -1322,17 +1323,25 @@ int manager_setup_cgroup(Manager *m) {
                 scope_path = strjoina(m->cgroup_root, "/" SPECIAL_INIT_SCOPE);
                 r = cg_create_and_attach(ELOGIND_CGROUP_CONTROLLER, scope_path, 0);
 #else
-                scope_path = strjoina(m->cgroup_root, "/elogind");
+                if (streq(m->cgroup_root, "/elogind"))
+                        // root already is our cgroup
+                        scope_path = strjoina(m->cgroup_root);
+                else
+                        // we have to create our own group
+                        scope_path = strjoina(m->cgroup_root, "/elogind");
                 r = cg_create_and_attach(ELOGIND_CGROUP_CONTROLLER, scope_path, 0);
 #endif // 0
                 if (r < 0)
                         return log_error_errno(r, "Failed to create %s control group: %m", scope_path);
+                log_debug_elogind("Created control group \"%s\"", scope_path);
 
                 /* also, move all other userspace processes remaining
                  * in the root cgroup into that scope. */
-                r = cg_migrate(ELOGIND_CGROUP_CONTROLLER, m->cgroup_root, ELOGIND_CGROUP_CONTROLLER, scope_path, false);
-                if (r < 0)
-                        log_warning_errno(r, "Couldn't move remaining userspace processes, ignoring: %m");
+                if (!streq(m->cgroup_root, scope_path)) {
+                        r = cg_migrate(ELOGIND_CGROUP_CONTROLLER, m->cgroup_root, ELOGIND_CGROUP_CONTROLLER, scope_path, false);
+                        if (r < 0)
+                                log_warning_errno(r, "Couldn't move remaining userspace processes, ignoring: %m");
+                }
 
                 /* 5. And pin it, so that it cannot be unmounted */
                 safe_close(m->pin_cgroupfs_fd);
index 58436d6..7c763a2 100644 (file)
@@ -526,10 +526,13 @@ _public_ int sd_bus_creds_get_session(sd_bus_creds *c, const char **ret) {
         if (!c->session) {
                 const char *shifted;
 
+                log_debug_elogind("Shifting cgroup \"%s\", root \"%s\"",
+                                  c->cgroup, c->cgroup_root ? c->cgroup_root : "NULL");
                 r = cg_shift_path(c->cgroup, c->cgroup_root, &shifted);
                 if (r < 0)
                         return r;
 
+                log_debug_elogind("Shifted: \"%s\"", shifted);
                 r = cg_path_get_session(shifted, (char**) &c->session);
                 if (r < 0)
                         return r;
index 06ca3c1..f8b2d43 100644 (file)
@@ -296,11 +296,14 @@ int manager_get_session_by_pid(Manager *m, pid_t pid, Session **session) {
 
         s = hashmap_get(m->session_units, unit);
 #else
+        log_debug_elogind("Searching session for PID %u", pid);
         r = cg_pid_get_session(pid, &session_name);
         if (r < 0)
                 return 0;
 
         s = hashmap_get(m->sessions, session_name);
+        log_debug_elogind("Session Name \"%s\" -> Session \"%s\"",
+                          session_name, s && s->id ? s->id : "NULL");
 #endif
         if (!s)
                 return 0;
index 86208c7..be3274b 100644 (file)
@@ -1235,6 +1235,10 @@ int main(int argc, char *argv[]) {
         log_parse_environment();
         log_open();
 
+#ifdef ENABLE_DEBUG_ELOGIND
+        log_set_max_level(LOG_DEBUG);
+#endif // ENABLE_DEBUG_ELOGIND
+
         umask(0022);
 
         if (argc != 1) {