render / rpms / libvirt

Forked from rpms/libvirt 5 months ago
Clone
Pablo Greco 40546a
From 079999bce280ca42a47a1521bb3b7bd06f7985f2 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <079999bce280ca42a47a1521bb3b7bd06f7985f2@dist-git>
Pablo Greco 40546a
From: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
Date: Mon, 1 Jul 2019 17:07:21 +0200
Pablo Greco 40546a
Subject: [PATCH] vircgroup: introduce virCgroupV2DetectControllers
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
Cgroup v2 has only single mount point for all controllers.  The list
Pablo Greco 40546a
of controllers is stored in cgroup.controllers file, name of controllers
Pablo Greco 40546a
are separated by space.
Pablo Greco 40546a
Pablo Greco 40546a
In cgroup v2 there is no cpuacct controller, the cpu.stat file always
Pablo Greco 40546a
exists with usage stats.
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
(cherry picked from commit e1bb7fffe2571e6a337bd87a9c5ed487ee6ee046)
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: <2186bc99cdcfc420b1aaf516fc808dfbf582a1d0.1561993100.git.phrdina@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
---
Pablo Greco 40546a
 src/util/vircgroupv2.c | 69 ++++++++++++++++++++++++++++++++++++++++++
Pablo Greco 40546a
 1 file changed, 69 insertions(+)
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
Pablo Greco 40546a
index 270a6fb305..c8f2573864 100644
Pablo Greco 40546a
--- a/src/util/vircgroupv2.c
Pablo Greco 40546a
+++ b/src/util/vircgroupv2.c
Pablo Greco 40546a
@@ -33,6 +33,7 @@
Pablo Greco 40546a
 #include "vircgroup.h"
Pablo Greco 40546a
 #include "vircgroupbackend.h"
Pablo Greco 40546a
 #include "vircgroupv2.h"
Pablo Greco 40546a
+#include "virerror.h"
Pablo Greco 40546a
 #include "virfile.h"
Pablo Greco 40546a
 #include "virlog.h"
Pablo Greco 40546a
 #include "virstring.h"
Pablo Greco 40546a
@@ -231,6 +232,73 @@ virCgroupV2StealPlacement(virCgroupPtr group)
Pablo Greco 40546a
 }
Pablo Greco 40546a
 
Pablo Greco 40546a
 
Pablo Greco 40546a
+static int
Pablo Greco 40546a
+virCgroupV2ParseControllersFile(virCgroupPtr group)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    int rc;
Pablo Greco 40546a
+    VIR_AUTOFREE(char *) contStr = NULL;
Pablo Greco 40546a
+    VIR_AUTOFREE(char *) contFile = NULL;
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
+        return -1;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    rc = virFileReadAll(contFile, 1024 * 1024, &contStr);
Pablo Greco 40546a
+    if (rc < 0) {
Pablo Greco 40546a
+        virReportSystemError(errno, _("Unable to read from '%s'"), contFile);
Pablo Greco 40546a
+        return -1;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
+    virTrimSpaces(contStr, NULL);
Pablo Greco 40546a
+
Pablo Greco 40546a
+    contList = virStringSplit(contStr, " ", 20);
Pablo Greco 40546a
+    if (!contList)
Pablo Greco 40546a
+        return -1;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    tmp = contList;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    while (*tmp) {
Pablo Greco 40546a
+        int type = virCgroupV2ControllerTypeFromString(*tmp);
Pablo Greco 40546a
+
Pablo Greco 40546a
+        if (type >= 0)
Pablo Greco 40546a
+            group->unified.controllers |= 1 << type;
Pablo Greco 40546a
+
Pablo Greco 40546a
+        tmp++;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
+    virStringListFree(contList);
Pablo Greco 40546a
+
Pablo Greco 40546a
+    return 0;
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
+
Pablo Greco 40546a
+static int
Pablo Greco 40546a
+virCgroupV2DetectControllers(virCgroupPtr group,
Pablo Greco 40546a
+                             int controllers)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    size_t i;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if (virCgroupV2ParseControllersFile(group) < 0)
Pablo Greco 40546a
+        return -1;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    /* In cgroup v2 there is no cpuacct controller, the cpu.stat file always
Pablo Greco 40546a
+     * exists with usage stats. */
Pablo Greco 40546a
+    group->unified.controllers |= 1 << VIR_CGROUP_CONTROLLER_CPUACCT;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++)
Pablo Greco 40546a
+        VIR_DEBUG("Controller '%s' present=%s",
Pablo Greco 40546a
+                  virCgroupV2ControllerTypeToString(i),
Pablo Greco 40546a
+                  (group->unified.controllers & 1 << i) ? "yes" : "no");
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if (controllers >= 0)
Pablo Greco 40546a
+        return controllers & group->unified.controllers;
Pablo Greco 40546a
+    else
Pablo Greco 40546a
+        return group->unified.controllers;
Pablo Greco 40546a
+}
Pablo Greco 40546a
+
Pablo Greco 40546a
+
Pablo Greco 40546a
 virCgroupBackend virCgroupV2Backend = {
Pablo Greco 40546a
     .type = VIR_CGROUP_BACKEND_TYPE_V2,
Pablo Greco 40546a
 
Pablo Greco 40546a
@@ -242,6 +310,7 @@ virCgroupBackend virCgroupV2Backend = {
Pablo Greco 40546a
     .detectPlacement = virCgroupV2DetectPlacement,
Pablo Greco 40546a
     .validatePlacement = virCgroupV2ValidatePlacement,
Pablo Greco 40546a
     .stealPlacement = virCgroupV2StealPlacement,
Pablo Greco 40546a
+    .detectControllers = virCgroupV2DetectControllers,
Pablo Greco 40546a
 };
Pablo Greco 40546a
 
Pablo Greco 40546a
 
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a