From 89e750e26ce052aec7d38306328a0f52c90c5489 Mon Sep 17 00:00:00 2001 From: Sven Eden Date: Mon, 20 Feb 2017 05:57:50 +0100 Subject: [PATCH] Add --enable-debug=elogind configure option and fix cgroup path 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 | 11 +++++++++-- src/basic/cgroup-util.c | 9 +++++++++ src/basic/log.h | 6 ++++++ src/core/cgroup.c | 19 ++++++++++++++----- src/libelogind/sd-bus/bus-creds.c | 3 +++ src/login/logind-core.c | 3 +++ src/login/logind.c | 4 ++++ 7 files changed, 48 insertions(+), 7 deletions(-) diff --git a/configure.ac b/configure.ac index 5da0e12ca..dc889a7f0 100644 --- a/configure.ac +++ b/configure.ac @@ -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" diff --git a/src/basic/cgroup-util.c b/src/basic/cgroup-util.c index 92d09f0b5..98a353ddb 100644 --- a/src/basic/cgroup-util.c +++ b/src/basic/cgroup-util.c @@ -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; diff --git a/src/basic/log.h b/src/basic/log.h index 3ed6a0e8d..cedf88130 100644 --- a/src/basic/log.h +++ b/src/basic/log.h @@ -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__) diff --git a/src/core/cgroup.c b/src/core/cgroup.c index b517415ce..139178ec0 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -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); diff --git a/src/libelogind/sd-bus/bus-creds.c b/src/libelogind/sd-bus/bus-creds.c index 58436d630..7c763a2e7 100644 --- a/src/libelogind/sd-bus/bus-creds.c +++ b/src/libelogind/sd-bus/bus-creds.c @@ -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; diff --git a/src/login/logind-core.c b/src/login/logind-core.c index 06ca3c1c8..f8b2d4355 100644 --- a/src/login/logind-core.c +++ b/src/login/logind-core.c @@ -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; diff --git a/src/login/logind.c b/src/login/logind.c index 86208c7d4..be3274b18 100644 --- a/src/login/logind.c +++ b/src/login/logind.c @@ -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) { -- 2.30.2