summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSven Eden <yamakuzure@gmx.net>2017-02-20 05:57:50 +0100
committerSven Eden <yamakuzure@gmx.net>2017-03-14 10:23:13 +0100
commit89e750e26ce052aec7d38306328a0f52c90c5489 (patch)
tree74d3e4276e7b1c69e85ddb193f4d003c2403f09a /src
parent0bf638bafb228d8eaf429e55c0609a3802c37c5b (diff)
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".
Diffstat (limited to 'src')
-rw-r--r--src/basic/cgroup-util.c9
-rw-r--r--src/basic/log.h6
-rw-r--r--src/core/cgroup.c19
-rw-r--r--src/libelogind/sd-bus/bus-creds.c3
-rw-r--r--src/login/logind-core.c3
-rw-r--r--src/login/logind.c4
6 files changed, 39 insertions, 5 deletions
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) {