render / rpms / libvirt

Forked from rpms/libvirt 5 months ago
Clone
Pablo Greco 40546a
From 4551f704f56b289735ed17f3b9ee0f9663183d09 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <4551f704f56b289735ed17f3b9ee0f9663183d09@dist-git>
Pablo Greco 40546a
From: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
Date: Mon, 1 Jul 2019 17:07:13 +0200
Pablo Greco 40546a
Subject: [PATCH] vircgroup: introduce virCgroupV2Available
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
We cannot detect only mount points to figure out whether cgroup v2
Pablo Greco 40546a
is available because systemd uses cgroup v2 for process tracking and
Pablo Greco 40546a
all controllers are mounted as cgroup v1 controllers.
Pablo Greco 40546a
Pablo Greco 40546a
To make sure that this is no the situation we need to check
Pablo Greco 40546a
'cgroup.controllers' file if it's not empty to make sure that cgroup
Pablo Greco 40546a
v2 is not mounted only for process tracking.
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
(cherry picked from commit 034ef217d73aa240340dd22590402bb9636648b5)
Pablo Greco 40546a
Pablo Greco 40546a
Conflicts:
Pablo Greco 40546a
    src/util/vircgroupv2.c: missing commit c0abcca417
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: <46bcb2f86e4ca5f029f67be5385770d725ef5c42.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 | 51 ++++++++++++++++++++++++++++++++++++++++++
Pablo Greco 40546a
 1 file changed, 51 insertions(+)
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
Pablo Greco 40546a
index 23bf81dae2..4ab9f2b792 100644
Pablo Greco 40546a
--- a/src/util/vircgroupv2.c
Pablo Greco 40546a
+++ b/src/util/vircgroupv2.c
Pablo Greco 40546a
@@ -19,16 +19,23 @@
Pablo Greco 40546a
  */
Pablo Greco 40546a
 #include <config.h>
Pablo Greco 40546a
 
Pablo Greco 40546a
+#ifdef __linux__
Pablo Greco 40546a
+# include <mntent.h>
Pablo Greco 40546a
+#endif /* __linux__ */
Pablo Greco 40546a
+
Pablo Greco 40546a
 #include "internal.h"
Pablo Greco 40546a
 
Pablo Greco 40546a
 #define __VIR_CGROUP_ALLOW_INCLUDE_PRIV_H__
Pablo Greco 40546a
 #include "vircgrouppriv.h"
Pablo Greco 40546a
 #undef __VIR_CGROUP_ALLOW_INCLUDE_PRIV_H__
Pablo Greco 40546a
 
Pablo Greco 40546a
+#include "viralloc.h"
Pablo Greco 40546a
 #include "vircgroup.h"
Pablo Greco 40546a
 #include "vircgroupbackend.h"
Pablo Greco 40546a
 #include "vircgroupv2.h"
Pablo Greco 40546a
+#include "virfile.h"
Pablo Greco 40546a
 #include "virlog.h"
Pablo Greco 40546a
+#include "virstring.h"
Pablo Greco 40546a
 
Pablo Greco 40546a
 VIR_LOG_INIT("util.cgroup");
Pablo Greco 40546a
 
Pablo Greco 40546a
@@ -41,8 +48,52 @@ VIR_ENUM_IMPL(virCgroupV2Controller, VIR_CGROUP_CONTROLLER_LAST,
Pablo Greco 40546a
 
Pablo Greco 40546a
 #ifdef __linux__
Pablo Greco 40546a
 
Pablo Greco 40546a
+/* We're looking for one 'cgroup2' fs mount which has some
Pablo Greco 40546a
+ * controllers enabled. */
Pablo Greco 40546a
+static bool
Pablo Greco 40546a
+virCgroupV2Available(void)
Pablo Greco 40546a
+{
Pablo Greco 40546a
+    bool ret = false;
Pablo Greco 40546a
+    FILE *mounts = NULL;
Pablo Greco 40546a
+    struct mntent entry;
Pablo Greco 40546a
+    char buf[CGROUP_MAX_VAL];
Pablo Greco 40546a
+
Pablo Greco 40546a
+    if (!(mounts = fopen("/proc/mounts", "r")))
Pablo Greco 40546a
+        return false;
Pablo Greco 40546a
+
Pablo Greco 40546a
+    while (getmntent_r(mounts, &entry, buf, sizeof(buf)) != NULL) {
Pablo Greco 40546a
+        VIR_AUTOFREE(char *) contFile = NULL;
Pablo Greco 40546a
+        VIR_AUTOFREE(char *) contStr = NULL;
Pablo Greco 40546a
+
Pablo Greco 40546a
+        if (STRNEQ(entry.mnt_type, "cgroup2"))
Pablo Greco 40546a
+            continue;
Pablo Greco 40546a
+
Pablo Greco 40546a
+        /* Systemd uses cgroup v2 for process tracking but no controller is
Pablo Greco 40546a
+         * available. We should consider this configuration as cgroup v2 is
Pablo Greco 40546a
+         * not available. */
Pablo Greco 40546a
+        if (virAsprintf(&contFile, "%s/cgroup.controllers", entry.mnt_dir) < 0)
Pablo Greco 40546a
+            goto cleanup;
Pablo Greco 40546a
+
Pablo Greco 40546a
+        if (virFileReadAll(contFile, 1024 * 1024, &contStr) < 0)
Pablo Greco 40546a
+            goto cleanup;
Pablo Greco 40546a
+
Pablo Greco 40546a
+        if (STREQ(contStr, ""))
Pablo Greco 40546a
+            continue;
Pablo Greco 40546a
+
Pablo Greco 40546a
+        ret = true;
Pablo Greco 40546a
+        break;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
+
Pablo Greco 40546a
+ cleanup:
Pablo Greco 40546a
+    VIR_FORCE_FCLOSE(mounts);
Pablo Greco 40546a
+    return ret;
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
+    .available = virCgroupV2Available,
Pablo Greco 40546a
 };
Pablo Greco 40546a
 
Pablo Greco 40546a
 
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a