summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2017-10-14 17:09:54 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2017-10-19 08:49:01 +0200
commit8cb83266062b383cdd4a57301ef559d64b491c51 (patch)
tree4158bd3215b5c1d3bfdbc2d5d9d5c9a2a8383611 /src
parent7cd0f0f844a0af629c85e4295904a4374bd076dd (diff)
downloadsystemd-8cb83266062b383cdd4a57301ef559d64b491c51.tar.gz
logind: fix killing of scopes
scope_abandon() called unit_watch_all_pids() to check if there are any pids in the cgroup, but unit_watch_all_pids() does nothing (and returns an empty set of pids) when cg_unified_controller(SYSTEMD) returns true. On hybrid or unified, cg_unified_controller(SYSTEMD) returns 1, so scope_abandon() thinks the scope is empty, even though it's not, and marks the scope dead prematurely. Example output after the scope is marked dead with processes still being present: ● session-24.scope - Session 24 of user guest Loaded: loaded (/run/systemd/transient/session-24.scope; transient; vendor preset: disabled) Transient: yes Active: inactive (dead) since Sat 2017-10-14 15:36:22 CEST; 5min ago Tasks: 1 CGroup: /user.slice/user-1001.slice/session-24.scope └─17309 sleep infinity Subsequent calls to stop the scope unit do nothing, because systemd thinks the scope is already dead. https://bugzilla.redhat.com/show_bug.cgi?id=1486859 This is easily reproducible on both F26 and F27: > ssh guest@localhost $ pulseaudio & sleep infinity & disown; exit $ systemctl status $$ > systemctl status session-NN.scope Tested with unified, hybrid, and legacy layouts, seems to work.
Diffstat (limited to 'src')
-rw-r--r--src/core/scope.c7
1 files changed, 1 insertions, 6 deletions
diff --git a/src/core/scope.c b/src/core/scope.c
index 4cd5e3dd2a..7e789ed147 100644
--- a/src/core/scope.c
+++ b/src/core/scope.c
@@ -522,6 +522,7 @@ int scope_abandon(Scope *s) {
s->was_abandoned = true;
s->controller = mfree(s->controller);
+ scope_set_state(s, SCOPE_ABANDONED);
/* The client is no longer watching the remaining processes,
* so let's step in here, under the assumption that the
@@ -531,12 +532,6 @@ int scope_abandon(Scope *s) {
unit_tidy_watch_pids(UNIT(s), 0, 0);
unit_watch_all_pids(UNIT(s));
- /* If the PID set is empty now, then let's finish this off */
- if (set_isempty(UNIT(s)->pids))
- scope_notify_cgroup_empty_event(UNIT(s));
- else
- scope_set_state(s, SCOPE_ABANDONED);
-
return 0;
}