cgroup: do 'catchup' for unit cgroup inotify watch files
authorDan Streetman <ddstreet@canonical.com>
Sun, 11 Jul 2021 20:59:27 +0000 (16:59 -0400)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 24 Aug 2021 10:51:57 +0000 (12:51 +0200)
While reexec/reload, we drop the inotify watch on cgroup file(s), so
we need to re-check them in case they changed and we missed the event.

Fixes: #20198
(cherry picked from commit 869f52f21831b611160c4937bef822ca94c802ba)

src/core/cgroup.c
src/core/cgroup.h
src/core/unit.c

index 3a6f768c608b109077a151c466869b440b3104e9..5c07aa71d14720adf26c84831d897f90226a63d6 100644 (file)
@@ -3039,6 +3039,9 @@ static int unit_check_cgroup_events(Unit *u) {
 
         assert(u);
 
+        if (!u->cgroup_path)
+                return 0;
+
         r = cg_get_keyed_attribute_graceful(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, "cgroup.events",
                                             STRV_MAKE("populated", "frozen"), values);
         if (r < 0)
@@ -3871,6 +3874,21 @@ void unit_invalidate_cgroup_bpf(Unit *u) {
         }
 }
 
+void unit_cgroup_catchup(Unit *u) {
+        assert(u);
+
+        if (!UNIT_HAS_CGROUP_CONTEXT(u))
+                return;
+
+        /* We dropped the inotify watch during reexec/reload, so we need to
+         * check these as they may have changed.
+         * Note that (currently) the kernel doesn't actually update cgroup
+         * file modification times, so we can't just serialize and then check
+         * the mtime for file(s) we are interested in. */
+        (void) unit_check_cgroup_events(u);
+        unit_add_to_cgroup_oom_queue(u);
+}
+
 bool unit_cgroup_delegate(Unit *u) {
         CGroupContext *c;
 
index ea929368cbd4d409a6dae3136ddc8d5d5d612a6c..3f8cad899de56ff398a2684c4e3952a21778793d 100644 (file)
@@ -313,6 +313,8 @@ void manager_invalidate_startup_units(Manager *m);
 const char* cgroup_device_policy_to_string(CGroupDevicePolicy i) _const_;
 CGroupDevicePolicy cgroup_device_policy_from_string(const char *s) _pure_;
 
+void unit_cgroup_catchup(Unit *u);
+
 bool unit_cgroup_delegate(Unit *u);
 
 int compare_job_priority(const void *a, const void *b);
index 47966bcf0de042aa993b59f4ffe8e987273c9e84..7e3bd7505eb72731b818d3ce7655534cc62978a1 100644 (file)
@@ -3616,6 +3616,8 @@ void unit_catchup(Unit *u) {
 
         if (UNIT_VTABLE(u)->catchup)
                 UNIT_VTABLE(u)->catchup(u);
+
+        unit_cgroup_catchup(u);
 }
 
 static bool fragment_mtime_newer(const char *path, usec_t mtime, bool path_masked) {