Blob Blame History Raw
From 079999bce280ca42a47a1521bb3b7bd06f7985f2 Mon Sep 17 00:00:00 2001
Message-Id: <079999bce280ca42a47a1521bb3b7bd06f7985f2@dist-git>
From: Pavel Hrdina <phrdina@redhat.com>
Date: Mon, 1 Jul 2019 17:07:21 +0200
Subject: [PATCH] vircgroup: introduce virCgroupV2DetectControllers
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Cgroup v2 has only single mount point for all controllers.  The list
of controllers is stored in cgroup.controllers file, name of controllers
are separated by space.

In cgroup v2 there is no cpuacct controller, the cpu.stat file always
exists with usage stats.

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
(cherry picked from commit e1bb7fffe2571e6a337bd87a9c5ed487ee6ee046)

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1689297

Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Message-Id: <2186bc99cdcfc420b1aaf516fc808dfbf582a1d0.1561993100.git.phrdina@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
---
 src/util/vircgroupv2.c | 69 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 69 insertions(+)

diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
index 270a6fb305..c8f2573864 100644
--- a/src/util/vircgroupv2.c
+++ b/src/util/vircgroupv2.c
@@ -33,6 +33,7 @@
 #include "vircgroup.h"
 #include "vircgroupbackend.h"
 #include "vircgroupv2.h"
+#include "virerror.h"
 #include "virfile.h"
 #include "virlog.h"
 #include "virstring.h"
@@ -231,6 +232,73 @@ virCgroupV2StealPlacement(virCgroupPtr group)
 }
 
 
+static int
+virCgroupV2ParseControllersFile(virCgroupPtr group)
+{
+    int rc;
+    VIR_AUTOFREE(char *) contStr = NULL;
+    VIR_AUTOFREE(char *) contFile = NULL;
+    char **contList = NULL;
+    char **tmp;
+
+    if (virAsprintf(&contFile, "%s/cgroup.controllers",
+                    group->unified.mountPoint) < 0)
+        return -1;
+
+    rc = virFileReadAll(contFile, 1024 * 1024, &contStr);
+    if (rc < 0) {
+        virReportSystemError(errno, _("Unable to read from '%s'"), contFile);
+        return -1;
+    }
+
+    virTrimSpaces(contStr, NULL);
+
+    contList = virStringSplit(contStr, " ", 20);
+    if (!contList)
+        return -1;
+
+    tmp = contList;
+
+    while (*tmp) {
+        int type = virCgroupV2ControllerTypeFromString(*tmp);
+
+        if (type >= 0)
+            group->unified.controllers |= 1 << type;
+
+        tmp++;
+    }
+
+    virStringListFree(contList);
+
+    return 0;
+}
+
+
+static int
+virCgroupV2DetectControllers(virCgroupPtr group,
+                             int controllers)
+{
+    size_t i;
+
+    if (virCgroupV2ParseControllersFile(group) < 0)
+        return -1;
+
+    /* In cgroup v2 there is no cpuacct controller, the cpu.stat file always
+     * exists with usage stats. */
+    group->unified.controllers |= 1 << VIR_CGROUP_CONTROLLER_CPUACCT;
+
+    for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++)
+        VIR_DEBUG("Controller '%s' present=%s",
+                  virCgroupV2ControllerTypeToString(i),
+                  (group->unified.controllers & 1 << i) ? "yes" : "no");
+
+    if (controllers >= 0)
+        return controllers & group->unified.controllers;
+    else
+        return group->unified.controllers;
+}
+
+
 virCgroupBackend virCgroupV2Backend = {
     .type = VIR_CGROUP_BACKEND_TYPE_V2,
 
@@ -242,6 +310,7 @@ virCgroupBackend virCgroupV2Backend = {
     .detectPlacement = virCgroupV2DetectPlacement,
     .validatePlacement = virCgroupV2ValidatePlacement,
     .stealPlacement = virCgroupV2StealPlacement,
+    .detectControllers = virCgroupV2DetectControllers,
 };
 
 
-- 
2.22.0