85 lines
2.7 KiB
Diff
85 lines
2.7 KiB
Diff
From 52ab3b8f534eafeed86908ad38f4cd0f169e23ff Mon Sep 17 00:00:00 2001
|
|
From: Dan Streetman <ddstreet@canonical.com>
|
|
Date: Sun, 11 Jul 2021 16:59:27 -0400
|
|
Subject: [PATCH] cgroup: do 'catchup' for unit cgroup inotify watch files
|
|
|
|
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)
|
|
|
|
Conflict:NA
|
|
Reference:https://github.com/systemd/systemd/commit/52ab3b8f534eafeed86908ad38f4cd0f169e23ff
|
|
---
|
|
src/core/cgroup.c | 18 ++++++++++++++++++
|
|
src/core/cgroup.h | 2 ++
|
|
src/core/unit.c | 2 ++
|
|
3 files changed, 22 insertions(+)
|
|
|
|
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
|
|
index 3a6f768c60..5c07aa71d1 100644
|
|
--- a/src/core/cgroup.c
|
|
+++ b/src/core/cgroup.c
|
|
@@ -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;
|
|
|
|
diff --git a/src/core/cgroup.h b/src/core/cgroup.h
|
|
index ea929368cb..3f8cad899d 100644
|
|
--- a/src/core/cgroup.h
|
|
+++ b/src/core/cgroup.h
|
|
@@ -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);
|
|
diff --git a/src/core/unit.c b/src/core/unit.c
|
|
index 47966bcf0d..7e3bd7505e 100644
|
|
--- a/src/core/unit.c
|
|
+++ b/src/core/unit.c
|
|
@@ -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) {
|
|
--
|
|
2.33.0
|
|
|