c313de
From b220fdba77897f65f3e7e963868f22d7ace58724 Mon Sep 17 00:00:00 2001
c313de
Message-Id: <b220fdba77897f65f3e7e963868f22d7ace58724@dist-git>
c313de
From: Pavel Hrdina <phrdina@redhat.com>
c313de
Date: Thu, 25 Jul 2019 13:37:01 +0200
c313de
Subject: [PATCH] vircgroup: fix cgroups v2 controllers detection
c313de
MIME-Version: 1.0
c313de
Content-Type: text/plain; charset=UTF-8
c313de
Content-Transfer-Encoding: 8bit
c313de
c313de
When creating new group for cgroups v2 the we cannot check
c313de
cgroups.controllers for that cgroup because the directory is created
c313de
later.  In that case we should check cgroups.subtree_control of parent
c313de
group to get list of controllers enabled for child cgroups.
c313de
c313de
In order to achieve that we will prefer the parent group if it exists,
c313de
the current group will be used only for root group.
c313de
c313de
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
c313de
Acked-by: Peter Krempa <pkrempa@redhat.com>
c313de
(cherry picked from commit 7b77f3a11e9ae3e3cf0ccb71bd72d4a865b7c71e)
c313de
c313de
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1689297
c313de
c313de
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
c313de
Message-Id: <ff6427994e0904f5649b70206f8f73129d1b8452.1564054553.git.phrdina@redhat.com>
c313de
Reviewed-by: Ján Tomko <jtomko@redhat.com>
c313de
---
c313de
 src/util/vircgroup.c        |  2 +-
c313de
 src/util/vircgroupbackend.h |  3 ++-
c313de
 src/util/vircgroupv1.c      |  3 ++-
c313de
 src/util/vircgroupv2.c      | 23 ++++++++++++++++-------
c313de
 4 files changed, 21 insertions(+), 10 deletions(-)
c313de
c313de
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
c313de
index 37f6def08d..2c067edc5c 100644
c313de
--- a/src/util/vircgroup.c
c313de
+++ b/src/util/vircgroup.c
c313de
@@ -412,7 +412,7 @@ virCgroupDetect(virCgroupPtr group,
c313de
 
c313de
     for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) {
c313de
         if (group->backends[i]) {
c313de
-            int rc = group->backends[i]->detectControllers(group, controllers);
c313de
+            int rc = group->backends[i]->detectControllers(group, controllers, parent);
c313de
             if (rc < 0)
c313de
                 return -1;
c313de
             controllersAvailable |= rc;
c313de
diff --git a/src/util/vircgroupbackend.h b/src/util/vircgroupbackend.h
c313de
index 2b5be21a76..b97f686368 100644
c313de
--- a/src/util/vircgroupbackend.h
c313de
+++ b/src/util/vircgroupbackend.h
c313de
@@ -99,7 +99,8 @@ typedef char *
c313de
 
c313de
 typedef int
c313de
 (*virCgroupDetectControllersCB)(virCgroupPtr group,
c313de
-                                int controllers);
c313de
+                                int controllers,
c313de
+                                virCgroupPtr parent);
c313de
 
c313de
 typedef bool
c313de
 (*virCgroupHasControllerCB)(virCgroupPtr cgroup,
c313de
diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c
c313de
index a7d6c92e4c..925e8ee1c1 100644
c313de
--- a/src/util/vircgroupv1.c
c313de
+++ b/src/util/vircgroupv1.c
c313de
@@ -419,7 +419,8 @@ virCgroupV1StealPlacement(virCgroupPtr group)
c313de
 
c313de
 static int
c313de
 virCgroupV1DetectControllers(virCgroupPtr group,
c313de
-                             int controllers)
c313de
+                             int controllers,
c313de
+                             virCgroupPtr parent ATTRIBUTE_UNUSED)
c313de
 {
c313de
     size_t i;
c313de
     size_t j;
c313de
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
c313de
index b4e90ed46d..7b3cd64cc5 100644
c313de
--- a/src/util/vircgroupv2.c
c313de
+++ b/src/util/vircgroupv2.c
c313de
@@ -241,7 +241,8 @@ virCgroupV2StealPlacement(virCgroupPtr group)
c313de
 
c313de
 
c313de
 static int
c313de
-virCgroupV2ParseControllersFile(virCgroupPtr group)
c313de
+virCgroupV2ParseControllersFile(virCgroupPtr group,
c313de
+                                virCgroupPtr parent)
c313de
 {
c313de
     int rc;
c313de
     VIR_AUTOFREE(char *) contStr = NULL;
c313de
@@ -249,10 +250,17 @@ virCgroupV2ParseControllersFile(virCgroupPtr group)
c313de
     char **contList = NULL;
c313de
     char **tmp;
c313de
 
c313de
-    if (virAsprintf(&contFile, "%s%s/cgroup.controllers",
c313de
-                    group->unified.mountPoint,
c313de
-                    NULLSTR_EMPTY(group->unified.placement)) < 0)
c313de
-        return -1;
c313de
+    if (parent) {
c313de
+        if (virAsprintf(&contFile, "%s%s/cgroup.subtree_control",
c313de
+                        parent->unified.mountPoint,
c313de
+                        NULLSTR_EMPTY(parent->unified.placement)) < 0)
c313de
+            return -1;
c313de
+    } else {
c313de
+        if (virAsprintf(&contFile, "%s%s/cgroup.controllers",
c313de
+                        group->unified.mountPoint,
c313de
+                        NULLSTR_EMPTY(group->unified.placement)) < 0)
c313de
+            return -1;
c313de
+    }
c313de
 
c313de
     rc = virFileReadAll(contFile, 1024 * 1024, &contStr);
c313de
     if (rc < 0) {
c313de
@@ -285,11 +293,12 @@ virCgroupV2ParseControllersFile(virCgroupPtr group)
c313de
 
c313de
 static int
c313de
 virCgroupV2DetectControllers(virCgroupPtr group,
c313de
-                             int controllers)
c313de
+                             int controllers,
c313de
+                             virCgroupPtr parent)
c313de
 {
c313de
     size_t i;
c313de
 
c313de
-    if (virCgroupV2ParseControllersFile(group) < 0)
c313de
+    if (virCgroupV2ParseControllersFile(group, parent) < 0)
c313de
         return -1;
c313de
 
c313de
     /* In cgroup v2 there is no cpuacct controller, the cpu.stat file always
c313de
-- 
c313de
2.22.0
c313de