Pablo Greco 40546a
From 8c784cd15bbac88334271f95d14a9770c1b2d864 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <8c784cd15bbac88334271f95d14a9770c1b2d864@dist-git>
Pablo Greco 40546a
From: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
Date: Mon, 1 Jul 2019 17:08:17 +0200
Pablo Greco 40546a
Subject: [PATCH] util: vircgroup: improve controller detection
Pablo Greco 40546a
MIME-Version: 1.0
Pablo Greco 40546a
Content-Type: text/plain; charset=UTF-8
Pablo Greco 40546a
Content-Transfer-Encoding: 8bit
Pablo Greco 40546a
Pablo Greco 40546a
This affects only cgroups v2 where enabled controllers are not based on
Pablo Greco 40546a
available mount points but on the list provided in cgroup.controllers
Pablo Greco 40546a
file.  However, moving it will fill in placement as well, so it needs
Pablo Greco 40546a
to be freed together with mount point if we don't need that controller.
Pablo Greco 40546a
Pablo Greco 40546a
Before this patch we were assuming that all controllers available in
Pablo Greco 40546a
root cgroup where available in all other sub-cgroups which was wrong.
Pablo Greco 40546a
Pablo Greco 40546a
In order to fix it we need to move the cgroup controllers detection
Pablo Greco 40546a
after cgroup placement was prepared in order to build correct path for
Pablo Greco 40546a
cgroup.controllers file.
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
Reviewed-by: Peter Krempa <pkrempa@redhat.com>
Pablo Greco 40546a
(cherry picked from commit d3007c844d8aa0caa0328ab18275be375f597704)
Pablo Greco 40546a
Pablo Greco 40546a
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1689297
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
Message-Id: <cec99e4c53912c3ee6f45012fc4fd760f6e8445b.1561993100.git.phrdina@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
---
Pablo Greco 40546a
 src/util/vircgroup.c   | 32 ++++++++++++++++----------------
Pablo Greco 40546a
 src/util/vircgroupv1.c |  1 +
Pablo Greco 40546a
 src/util/vircgroupv2.c |  5 +++--
Pablo Greco 40546a
 3 files changed, 20 insertions(+), 18 deletions(-)
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/src/util/vircgroup.c b/src/util/vircgroup.c
Pablo Greco 40546a
index 4f71a1d197..ff2a0b75b5 100644
Pablo Greco 40546a
--- a/src/util/vircgroup.c
Pablo Greco 40546a
+++ b/src/util/vircgroup.c
Pablo Greco 40546a
@@ -386,22 +386,6 @@ virCgroupDetect(virCgroupPtr group,
Pablo Greco 40546a
             return -1;
Pablo Greco 40546a
     }
Pablo Greco 40546a
 
Pablo Greco 40546a
-    for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) {
Pablo Greco 40546a
-        if (group->backends[i]) {
Pablo Greco 40546a
-            int rc = group->backends[i]->detectControllers(group, controllers, parent);
Pablo Greco 40546a
-            if (rc < 0)
Pablo Greco 40546a
-                return -1;
Pablo Greco 40546a
-            controllersAvailable |= rc;
Pablo Greco 40546a
-        }
Pablo Greco 40546a
-    }
Pablo Greco 40546a
-
Pablo Greco 40546a
-    /* Check that at least 1 controller is available */
Pablo Greco 40546a
-    if (controllersAvailable == 0) {
Pablo Greco 40546a
-        virReportSystemError(ENXIO, "%s",
Pablo Greco 40546a
-                             _("At least one cgroup controller is required"));
Pablo Greco 40546a
-        return -1;
Pablo Greco 40546a
-    }
Pablo Greco 40546a
-
Pablo Greco 40546a
     /* In some cases we can copy part of the placement info
Pablo Greco 40546a
      * based on the parent cgroup...
Pablo Greco 40546a
      */
Pablo Greco 40546a
@@ -426,6 +410,22 @@ virCgroupDetect(virCgroupPtr group,
Pablo Greco 40546a
         }
Pablo Greco 40546a
     }
Pablo Greco 40546a
 
Pablo Greco 40546a
+    for (i = 0; i < VIR_CGROUP_BACKEND_TYPE_LAST; i++) {
Pablo Greco 40546a
+        if (group->backends[i]) {
Pablo Greco 40546a
+            int rc = group->backends[i]->detectControllers(group, controllers, parent);
Pablo Greco 40546a
+            if (rc < 0)
Pablo Greco 40546a
+                return -1;
Pablo Greco 40546a
+            controllersAvailable |= rc;
Pablo Greco 40546a
+        }
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
+    /* Check that at least 1 controller is available */
Pablo Greco 40546a
+    if (controllersAvailable == 0) {
Pablo Greco 40546a
+        virReportSystemError(ENXIO, "%s",
Pablo Greco 40546a
+                             _("At least one cgroup controller is required"));
Pablo Greco 40546a
+        return -1;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
     return 0;
Pablo Greco 40546a
 }
Pablo Greco 40546a
 
Pablo Greco 40546a
diff --git a/src/util/vircgroupv1.c b/src/util/vircgroupv1.c
Pablo Greco 40546a
index 784a963b79..5b218c7f78 100644
Pablo Greco 40546a
--- a/src/util/vircgroupv1.c
Pablo Greco 40546a
+++ b/src/util/vircgroupv1.c
Pablo Greco 40546a
@@ -463,6 +463,7 @@ virCgroupV1DetectControllers(virCgroupPtr group,
Pablo Greco 40546a
                     }
Pablo Greco 40546a
                 }
Pablo Greco 40546a
                 VIR_FREE(group->legacy[i].mountPoint);
Pablo Greco 40546a
+                VIR_FREE(group->legacy[i].placement);
Pablo Greco 40546a
             }
Pablo Greco 40546a
         }
Pablo Greco 40546a
     } else {
Pablo Greco 40546a
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
Pablo Greco 40546a
index 60598712c8..10f8a9bbdf 100644
Pablo Greco 40546a
--- a/src/util/vircgroupv2.c
Pablo Greco 40546a
+++ b/src/util/vircgroupv2.c
Pablo Greco 40546a
@@ -249,8 +249,9 @@ virCgroupV2ParseControllersFile(virCgroupPtr group)
Pablo Greco 40546a
     char **contList = NULL;
Pablo Greco 40546a
     char **tmp;
Pablo Greco 40546a
 
Pablo Greco 40546a
-    if (virAsprintf(&contFile, "%s/cgroup.controllers",
Pablo Greco 40546a
-                    group->unified.mountPoint) < 0)
Pablo Greco 40546a
+    if (virAsprintf(&contFile, "%s%s/cgroup.controllers",
Pablo Greco 40546a
+                    group->unified.mountPoint,
Pablo Greco 40546a
+                    NULLSTR_EMPTY(group->unified.placement)) < 0)
Pablo Greco 40546a
         return -1;
Pablo Greco 40546a
 
Pablo Greco 40546a
     rc = virFileReadAll(contFile, 1024 * 1024, &contStr);
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a