richardphibel / rpms / systemd

Forked from rpms/systemd 2 years ago
Clone
0b4d5a
From 45d093a37b6f8c2ceae9bfd090c5265f35413b46 Mon Sep 17 00:00:00 2001
0b4d5a
From: =?UTF-8?q?Michal=20Sekleta=CC=81r?= <msekleta@redhat.com>
0b4d5a
Date: Tue, 8 Sep 2020 14:51:39 +0200
0b4d5a
Subject: [PATCH] cgroup: freezer action must be NOP when cgroup v2 freezer is
0b4d5a
 not available
0b4d5a
0b4d5a
Low-level cgroup freezer state manipulation is invoked directly from the
0b4d5a
job engine when we are about to execute the job in order to make sure
0b4d5a
the unit is not frozen and job execution is not blocked because of
0b4d5a
that.
0b4d5a
0b4d5a
Currently with cgroup v1 we would needlessly do a bunch of work in the
0b4d5a
function and even falsely update the freezer state. Don't do any of this
0b4d5a
and skip the function silently when v2 freezer is not available.
0b4d5a
0b4d5a
Following bug is fixed by this commit,
0b4d5a
0b4d5a
$ systemd-run --unit foo.service /bin/sleep infinity
0b4d5a
$ systemctl restart foo.service
0b4d5a
$ systemctl show -p FreezerState foo.service
0b4d5a
0b4d5a
Before (cgroup v1, i.e. full "legacy" mode):
0b4d5a
FreezerState=thawing
0b4d5a
0b4d5a
After:
0b4d5a
FreezerState=running
0b4d5a
0b4d5a
(cherry picked from commit 9a1e90aee556b7a30d87553a891a4175ae77ed68)
0b4d5a
0b4d5a
Resolves: #1868831
0b4d5a
---
0b4d5a
 src/core/cgroup.c | 3 +++
0b4d5a
 1 file changed, 3 insertions(+)
0b4d5a
0b4d5a
diff --git a/src/core/cgroup.c b/src/core/cgroup.c
0b4d5a
index e0eb184fd2..f1ce070f9a 100644
0b4d5a
--- a/src/core/cgroup.c
0b4d5a
+++ b/src/core/cgroup.c
0b4d5a
@@ -2936,6 +2936,9 @@ int unit_cgroup_freezer_action(Unit *u, FreezerAction action) {
0b4d5a
         assert(u);
0b4d5a
         assert(IN_SET(action, FREEZER_FREEZE, FREEZER_THAW));
0b4d5a
 
0b4d5a
+        if (!cg_freezer_supported())
0b4d5a
+                return 0;
0b4d5a
+
0b4d5a
         if (!u->cgroup_realized)
0b4d5a
                 return -EBUSY;
0b4d5a