]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core/cgroup: ignore kernel cgroup.events when thawing
authormsizanoen1 <msizanoen@qtmlabs.xyz>
Wed, 7 Dec 2022 16:09:33 +0000 (23:09 +0700)
committermsizanoen1 <msizanoen@qtmlabs.xyz>
Thu, 8 Dec 2022 11:58:00 +0000 (12:58 +0100)
The `frozen` state can be `0` while the processes are indeed frozen (see
last commit). Therefore do not respect cgroup.events when checking
whether thawing is necessary.

src/core/cgroup.c

index 9abcfe2b56bd34d84a5c2bc728b175049dd99848..ecc3cb32effa4b97481aaea4a46dd7b8d220fbb7 100644 (file)
@@ -4167,7 +4167,7 @@ int compare_job_priority(const void *a, const void *b) {
 int unit_cgroup_freezer_action(Unit *u, FreezerAction action) {
         _cleanup_free_ char *path = NULL;
         FreezerState target, kernel = _FREEZER_STATE_INVALID;
-        int r;
+        int r, ret;
 
         assert(u);
         assert(IN_SET(action, FREEZER_FREEZE, FREEZER_THAW));
@@ -4200,8 +4200,11 @@ int unit_cgroup_freezer_action(Unit *u, FreezerAction action) {
 
         if (target == kernel) {
                 u->freezer_state = target;
-                return 0;
-        }
+                if (action == FREEZER_FREEZE)
+                        return 0;
+                ret = 0;
+        } else
+                ret = 1;
 
         r = cg_get_path(SYSTEMD_CGROUP_CONTROLLER, u->cgroup_path, "cgroup.freeze", &path);
         if (r < 0)
@@ -4209,16 +4212,18 @@ int unit_cgroup_freezer_action(Unit *u, FreezerAction action) {
 
         log_unit_debug(u, "%s unit.", action == FREEZER_FREEZE ? "Freezing" : "Thawing");
 
-        if (action == FREEZER_FREEZE)
-                u->freezer_state = FREEZER_FREEZING;
-        else
-                u->freezer_state = FREEZER_THAWING;
+        if (target != kernel) {
+                if (action == FREEZER_FREEZE)
+                        u->freezer_state = FREEZER_FREEZING;
+                else
+                        u->freezer_state = FREEZER_THAWING;
+        }
 
         r = write_string_file(path, one_zero(action == FREEZER_FREEZE), WRITE_STRING_FILE_DISABLE_BUFFER);
         if (r < 0)
                 return r;
 
-        return 1;
+        return ret;
 }
 
 int unit_get_cpuset(Unit *u, CPUSet *cpus, const char *name) {