aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAidan Harris <me@aidanharr.is>2021-09-15 07:11:01 +0000
committerWilliam Hubbs <w.d.hubbs@gmail.com>2021-10-15 22:10:37 -0500
commiteaa42da9a62b55a26c7b866d4082c554a764b95f (patch)
treecbf514532174d1d9add4f5e3067057c4a30872b9
parentcd4bbdcd62be460dabc232f6bd52e3b2c347408a (diff)
Use cgroup.kill in cgroup_cleanup when possible
The old code is moved to a cgroup_fallback_cleanup function and only called if cgroup2_kill fails. This fixes #454.
-rw-r--r--etc/rc.conf4
-rw-r--r--sh/rc-cgroup.sh25
2 files changed, 24 insertions, 5 deletions
diff --git a/etc/rc.conf b/etc/rc.conf
index 895641db..11e8449a 100644
--- a/etc/rc.conf
+++ b/etc/rc.conf
@@ -288,7 +288,9 @@ rc_tty_number=12
# To perform this cleanup manually for a stopped service, you can
# execute cgroup_cleanup with /etc/init.d/<service> cgroup_cleanup or
# rc-service <service> cgroup_cleanup.
-# The process followed in this cleanup is the following:
+# If the kernel includes support for cgroup2's cgroup.kill, this is used
+# to reliably teardown the cgroup.
+# If this fails, the process followed in this cleanup is the following:
# 1. send stopsig (sigterm if it isn't set) to all processes left in the
# cgroup immediately followed by sigcont.
# 2. Send sighup to all processes in the cgroup if rc_send_sighup is
diff --git a/sh/rc-cgroup.sh b/sh/rc-cgroup.sh
index 2abe659f..fd61ebd2 100644
--- a/sh/rc-cgroup.sh
+++ b/sh/rc-cgroup.sh
@@ -206,10 +206,19 @@ cgroup2_set_limits()
return 0
}
-cgroup_cleanup()
-{
- cgroup_running || return 0
- ebegin "Starting cgroups cleanup"
+cgroup2_kill_cgroup() {
+ local cgroup_path
+ cgroup_path="$(cgroup2_find_path)"
+ [ -z "${cgroup_path}" ] && return 1
+ rc_cgroup_path="${cgroup_path}/${RC_SVCNAME}"
+ if [ -f "${rc_cgroup_path}"/cgroup.kill ]; then
+ printf "%d" 1 > "${rc_cgroup_path}"/cgroup.kill
+ fi
+ return
+}
+
+cgroup_fallback_cleanup() {
+ ebegin "Starting fallback cgroups cleanup"
local loops=0
cgroup_get_pids
if [ -n "${cgroup_pids}" ]; then
@@ -229,6 +238,14 @@ cgroup_cleanup()
kill -s KILL ${cgroup_pids} 2> /dev/null
fi
fi
+ eend $?
+}
+
+cgroup_cleanup()
+{
+ cgroup_running || return 0
+ ebegin "Starting cgroups cleanup"
+ cgroup2_kill_cgroup || cgroup_fallback_cleanup
cgroup2_remove
cgroup_get_pids
[ -z "${cgroup_pids}" ]