Blame SOURCES/libvirt-virt-host-validate-rewrite-cgroup-detection-to-use-util-vircgroup.patch

Pablo Greco 40546a
From 0ede215415509022d94092b75ef075495c91a5d5 Mon Sep 17 00:00:00 2001
Pablo Greco 40546a
Message-Id: <0ede215415509022d94092b75ef075495c91a5d5@dist-git>
Pablo Greco 40546a
From: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
Date: Mon, 1 Jul 2019 17:08:03 +0200
Pablo Greco 40546a
Subject: [PATCH] virt-host-validate: rewrite cgroup detection to use
Pablo Greco 40546a
 util/vircgroup
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 removes code duplication and simplifies cgroup detection.
Pablo Greco 40546a
As a drawback we will not have separate messages to enable cgroup
Pablo Greco 40546a
controller in kernel or to mount it.  On the other side the rewrite
Pablo Greco 40546a
adds support for cgroup v2.
Pablo Greco 40546a
Pablo Greco 40546a
The kernel config support was wrong because it was parsing
Pablo Greco 40546a
'/proc/self/cgroup' instead of '/proc/cgroups/' file.
Pablo Greco 40546a
Pablo Greco 40546a
The mount suggestion is removed as well because it will not work
Pablo Greco 40546a
with cgroup v2.
Pablo Greco 40546a
Pablo Greco 40546a
Signed-off-by: Pavel Hrdina <phrdina@redhat.com>
Pablo Greco 40546a
(cherry picked from commit 0f4d7daa8cd43b62911413c2cc1614f87380e459)
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: <0a79b9dcaee25d04b993c4e6576d75ce7c45ac0f.1561993100.git.phrdina@redhat.com>
Pablo Greco 40546a
Reviewed-by: Ján Tomko <jtomko@redhat.com>
Pablo Greco 40546a
---
Pablo Greco 40546a
 tools/virt-host-validate-common.c | 164 ++++++------------------------
Pablo Greco 40546a
 tools/virt-host-validate-common.h |   7 +-
Pablo Greco 40546a
 tools/virt-host-validate-lxc.c    |  38 ++-----
Pablo Greco 40546a
 tools/virt-host-validate-qemu.c   |  38 ++-----
Pablo Greco 40546a
 4 files changed, 53 insertions(+), 194 deletions(-)
Pablo Greco 40546a
Pablo Greco 40546a
diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c
Pablo Greco 40546a
index c45dfc5d8c..73165d673a 100644
Pablo Greco 40546a
--- a/tools/virt-host-validate-common.c
Pablo Greco 40546a
+++ b/tools/virt-host-validate-common.c
Pablo Greco 40546a
@@ -26,12 +26,10 @@
Pablo Greco 40546a
 #include <stdio.h>
Pablo Greco 40546a
 #include <unistd.h>
Pablo Greco 40546a
 #include <sys/utsname.h>
Pablo Greco 40546a
-#ifdef HAVE_MNTENT_H
Pablo Greco 40546a
-# include <mntent.h>
Pablo Greco 40546a
-#endif /* HAVE_MNTENT_H */
Pablo Greco 40546a
 #include <sys/stat.h>
Pablo Greco 40546a
 
Pablo Greco 40546a
 #include "viralloc.h"
Pablo Greco 40546a
+#include "vircgroup.h"
Pablo Greco 40546a
 #include "virfile.h"
Pablo Greco 40546a
 #include "virt-host-validate-common.h"
Pablo Greco 40546a
 #include "virstring.h"
Pablo Greco 40546a
@@ -290,152 +288,50 @@ int virHostValidateLinuxKernel(const char *hvname,
Pablo Greco 40546a
     }
Pablo Greco 40546a
 }
Pablo Greco 40546a
 
Pablo Greco 40546a
-
Pablo Greco 40546a
-static int virHostValidateCGroupSupport(const char *hvname,
Pablo Greco 40546a
-                                        const char *cg_name,
Pablo Greco 40546a
-                                        virHostValidateLevel level,
Pablo Greco 40546a
-                                        const char *config_name)
Pablo Greco 40546a
+#ifdef __linux__
Pablo Greco 40546a
+int virHostValidateCGroupControllers(const char *hvname,
Pablo Greco 40546a
+                                     int controllers,
Pablo Greco 40546a
+                                     virHostValidateLevel level)
Pablo Greco 40546a
 {
Pablo Greco 40546a
-    virHostMsgCheck(hvname, "for cgroup '%s' controller support", cg_name);
Pablo Greco 40546a
-    FILE *fp = fopen("/proc/self/cgroup", "r");
Pablo Greco 40546a
-    size_t len = 0;
Pablo Greco 40546a
-    char *line = NULL;
Pablo Greco 40546a
-    ssize_t ret;
Pablo Greco 40546a
-    bool matched = false;
Pablo Greco 40546a
+    virCgroupPtr group = NULL;
Pablo Greco 40546a
+    int ret = 0;
Pablo Greco 40546a
+    size_t i;
Pablo Greco 40546a
 
Pablo Greco 40546a
-    if (!fp)
Pablo Greco 40546a
-        goto error;
Pablo Greco 40546a
+    if (virCgroupNewSelf(&group) < 0)
Pablo Greco 40546a
+        return -1;
Pablo Greco 40546a
 
Pablo Greco 40546a
-    while ((ret = getline(&line, &len, fp)) >= 0 && !matched) {
Pablo Greco 40546a
-        char **cgroups;
Pablo Greco 40546a
-        char *start;
Pablo Greco 40546a
-        char *end;
Pablo Greco 40546a
-        size_t ncgroups;
Pablo Greco 40546a
-        size_t i;
Pablo Greco 40546a
+    for (i = 0; i < VIR_CGROUP_CONTROLLER_LAST; i++) {
Pablo Greco 40546a
+        int flag = 1 << i;
Pablo Greco 40546a
+        const char *cg_name = virCgroupControllerTypeToString(i);
Pablo Greco 40546a
 
Pablo Greco 40546a
-        /* Each line in this file looks like
Pablo Greco 40546a
-         *
Pablo Greco 40546a
-         *   4:cpu,cpuacct:/machine.slice/machine-qemu\x2dtest.scope/emulator
Pablo Greco 40546a
-         *
Pablo Greco 40546a
-         * Since multiple cgroups can be part of the same line and some cgroup
Pablo Greco 40546a
-         * names can appear as part of other cgroup names (eg. 'cpu' is a
Pablo Greco 40546a
-         * prefix for both 'cpuacct' and 'cpuset'), it's not enough to simply
Pablo Greco 40546a
-         * check whether the cgroup name is present somewhere inside the file.
Pablo Greco 40546a
-         *
Pablo Greco 40546a
-         * Moreover, there's nothing stopping the cgroup name from appearing
Pablo Greco 40546a
-         * in an unrelated mount point name as well */
Pablo Greco 40546a
-
Pablo Greco 40546a
-        /* Look for the first colon.
Pablo Greco 40546a
-         * The part we're interested in starts right after it */
Pablo Greco 40546a
-        if (!(start = strchr(line, ':')))
Pablo Greco 40546a
-            continue;
Pablo Greco 40546a
-        start++;
Pablo Greco 40546a
-
Pablo Greco 40546a
-        /* Look for the second colon.
Pablo Greco 40546a
-         * The part we're interested in ends exactly there */
Pablo Greco 40546a
-        if (!(end = strchr(start, ':')))
Pablo Greco 40546a
-            continue;
Pablo Greco 40546a
-        *end = '\0';
Pablo Greco 40546a
-
Pablo Greco 40546a
-        if (!(cgroups = virStringSplitCount(start, ",", 0, &ncgroups)))
Pablo Greco 40546a
+        if (!(controllers & flag))
Pablo Greco 40546a
             continue;
Pablo Greco 40546a
 
Pablo Greco 40546a
-        /* Look for the matching cgroup */
Pablo Greco 40546a
-        for (i = 0; i < ncgroups; i++) {
Pablo Greco 40546a
-            if (STREQ(cgroups[i], cg_name))
Pablo Greco 40546a
-                matched = true;
Pablo Greco 40546a
+        virHostMsgCheck(hvname, "for cgroup '%s' controller support", cg_name);
Pablo Greco 40546a
+
Pablo Greco 40546a
+        if (!virCgroupHasController(group, i)) {
Pablo Greco 40546a
+            ret = -1;
Pablo Greco 40546a
+            virHostMsgFail(level, "Enable '%s' in kernel Kconfig file or "
Pablo Greco 40546a
+                           "mount/enable cgroup controller in your system",
Pablo Greco 40546a
+                           cg_name);
Pablo Greco 40546a
+        } else {
Pablo Greco 40546a
+            virHostMsgPass();
Pablo Greco 40546a
         }
Pablo Greco 40546a
-
Pablo Greco 40546a
-        virStringListFreeCount(cgroups, ncgroups);
Pablo Greco 40546a
     }
Pablo Greco 40546a
 
Pablo Greco 40546a
-    VIR_FREE(line);
Pablo Greco 40546a
-    VIR_FORCE_FCLOSE(fp);
Pablo Greco 40546a
-    if (!matched)
Pablo Greco 40546a
-        goto error;
Pablo Greco 40546a
+    virCgroupFree(&group);
Pablo Greco 40546a
 
Pablo Greco 40546a
-    virHostMsgPass();
Pablo Greco 40546a
-    return 0;
Pablo Greco 40546a
-
Pablo Greco 40546a
- error:
Pablo Greco 40546a
-    VIR_FREE(line);
Pablo Greco 40546a
-    virHostMsgFail(level, "Enable CONFIG_%s in kernel Kconfig file", config_name);
Pablo Greco 40546a
-    return -1;
Pablo Greco 40546a
+    return ret;
Pablo Greco 40546a
 }
Pablo Greco 40546a
-
Pablo Greco 40546a
-#ifdef HAVE_MNTENT_H
Pablo Greco 40546a
-static int virHostValidateCGroupMount(const char *hvname,
Pablo Greco 40546a
-                                      const char *cg_name,
Pablo Greco 40546a
-                                      virHostValidateLevel level)
Pablo Greco 40546a
+#else /*  !__linux__ */
Pablo Greco 40546a
+int virHostValidateCGroupControllers(const char *hvname,
Pablo Greco 40546a
+                                     int controllers,
Pablo Greco 40546a
+                                     virHostValidateLevel level)
Pablo Greco 40546a
 {
Pablo Greco 40546a
-    virHostMsgCheck(hvname, "for cgroup '%s' controller mount-point", cg_name);
Pablo Greco 40546a
-    FILE *fp = setmntent("/proc/mounts", "r");
Pablo Greco 40546a
-    struct mntent ent;
Pablo Greco 40546a
-    char mntbuf[1024];
Pablo Greco 40546a
-    bool matched = false;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (!fp)
Pablo Greco 40546a
-        goto error;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    while (getmntent_r(fp, &ent, mntbuf, sizeof(mntbuf)) && !matched) {
Pablo Greco 40546a
-        char **opts;
Pablo Greco 40546a
-        size_t nopts;
Pablo Greco 40546a
-        size_t i;
Pablo Greco 40546a
-
Pablo Greco 40546a
-        /* Ignore non-cgroup mounts */
Pablo Greco 40546a
-        if (STRNEQ(ent.mnt_type, "cgroup"))
Pablo Greco 40546a
-            continue;
Pablo Greco 40546a
-
Pablo Greco 40546a
-        if (!(opts = virStringSplitCount(ent.mnt_opts, ",", 0, &nopts)))
Pablo Greco 40546a
-            continue;
Pablo Greco 40546a
-
Pablo Greco 40546a
-        /* Look for a mount option matching the cgroup name */
Pablo Greco 40546a
-        for (i = 0; i < nopts; i++) {
Pablo Greco 40546a
-            if (STREQ(opts[i], cg_name))
Pablo Greco 40546a
-                matched = true;
Pablo Greco 40546a
-        }
Pablo Greco 40546a
-
Pablo Greco 40546a
-        virStringListFreeCount(opts, nopts);
Pablo Greco 40546a
-    }
Pablo Greco 40546a
-    endmntent(fp);
Pablo Greco 40546a
-    if (!matched)
Pablo Greco 40546a
-        goto error;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    virHostMsgPass();
Pablo Greco 40546a
-    return 0;
Pablo Greco 40546a
-
Pablo Greco 40546a
- error:
Pablo Greco 40546a
-    virHostMsgFail(level, "Mount '%s' cgroup controller (suggested at /sys/fs/cgroup/%s)",
Pablo Greco 40546a
-                   cg_name, cg_name);
Pablo Greco 40546a
-    return -1;
Pablo Greco 40546a
-}
Pablo Greco 40546a
-#else /* ! HAVE_MNTENT_H */
Pablo Greco 40546a
-static int virHostValidateCGroupMount(const char *hvname,
Pablo Greco 40546a
-                                      const char *cg_name,
Pablo Greco 40546a
-                                      virHostValidateLevel level)
Pablo Greco 40546a
-{
Pablo Greco 40546a
-    virHostMsgCheck(hvname, "for cgroup '%s' controller mount-point", cg_name);
Pablo Greco 40546a
     virHostMsgFail(level, "%s", "This platform does not support cgroups");
Pablo Greco 40546a
     return -1;
Pablo Greco 40546a
 }
Pablo Greco 40546a
-#endif /* ! HAVE_MNTENT_H */
Pablo Greco 40546a
-
Pablo Greco 40546a
-int virHostValidateCGroupController(const char *hvname,
Pablo Greco 40546a
-                                    const char *cg_name,
Pablo Greco 40546a
-                                    virHostValidateLevel level,
Pablo Greco 40546a
-                                    const char *config_name)
Pablo Greco 40546a
-{
Pablo Greco 40546a
-    if (virHostValidateCGroupSupport(hvname,
Pablo Greco 40546a
-                                     cg_name,
Pablo Greco 40546a
-                                     level,
Pablo Greco 40546a
-                                     config_name) < 0)
Pablo Greco 40546a
-        return -1;
Pablo Greco 40546a
-    if (virHostValidateCGroupMount(hvname,
Pablo Greco 40546a
-                                   cg_name,
Pablo Greco 40546a
-                                   level) < 0)
Pablo Greco 40546a
-        return -1;
Pablo Greco 40546a
-    return 0;
Pablo Greco 40546a
-}
Pablo Greco 40546a
+#endif /* !__linux__ */
Pablo Greco 40546a
 
Pablo Greco 40546a
 int virHostValidateIOMMU(const char *hvname,
Pablo Greco 40546a
                          virHostValidateLevel level)
Pablo Greco 40546a
diff --git a/tools/virt-host-validate-common.h b/tools/virt-host-validate-common.h
Pablo Greco 40546a
index b6fe17daa7..b23dd7cdbe 100644
Pablo Greco 40546a
--- a/tools/virt-host-validate-common.h
Pablo Greco 40546a
+++ b/tools/virt-host-validate-common.h
Pablo Greco 40546a
@@ -77,10 +77,9 @@ int virHostValidateNamespace(const char *hvname,
Pablo Greco 40546a
                              virHostValidateLevel level,
Pablo Greco 40546a
                              const char *hint);
Pablo Greco 40546a
 
Pablo Greco 40546a
-int virHostValidateCGroupController(const char *hvname,
Pablo Greco 40546a
-                                    const char *cg_name,
Pablo Greco 40546a
-                                    virHostValidateLevel level,
Pablo Greco 40546a
-                                    const char *config_name);
Pablo Greco 40546a
+int virHostValidateCGroupControllers(const char *hvname,
Pablo Greco 40546a
+                                     int controllers,
Pablo Greco 40546a
+                                     virHostValidateLevel level);
Pablo Greco 40546a
 
Pablo Greco 40546a
 int virHostValidateIOMMU(const char *hvname,
Pablo Greco 40546a
                          virHostValidateLevel level);
Pablo Greco 40546a
diff --git a/tools/virt-host-validate-lxc.c b/tools/virt-host-validate-lxc.c
Pablo Greco 40546a
index 64d9279c30..3c55b1b26d 100644
Pablo Greco 40546a
--- a/tools/virt-host-validate-lxc.c
Pablo Greco 40546a
+++ b/tools/virt-host-validate-lxc.c
Pablo Greco 40546a
@@ -23,6 +23,7 @@
Pablo Greco 40546a
 
Pablo Greco 40546a
 #include "virt-host-validate-lxc.h"
Pablo Greco 40546a
 #include "virt-host-validate-common.h"
Pablo Greco 40546a
+#include "vircgroup.h"
Pablo Greco 40546a
 
Pablo Greco 40546a
 int virHostValidateLXC(void)
Pablo Greco 40546a
 {
Pablo Greco 40546a
@@ -63,35 +64,16 @@ int virHostValidateLXC(void)
Pablo Greco 40546a
                                  _("User namespace support is recommended")) < 0)
Pablo Greco 40546a
         ret = -1;
Pablo Greco 40546a
 
Pablo Greco 40546a
-    if (virHostValidateCGroupController("LXC", "memory",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_FAIL,
Pablo Greco 40546a
-                                        "MEMCG") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("LXC", "cpu",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_FAIL,
Pablo Greco 40546a
-                                        "CGROUP_CPU") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("LXC", "cpuacct",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_FAIL,
Pablo Greco 40546a
-                                        "CGROUP_CPUACCT") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("LXC", "cpuset",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_FAIL,
Pablo Greco 40546a
-                                        "CPUSETS") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("LXC", "devices",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_FAIL,
Pablo Greco 40546a
-                                        "CGROUP_DEVICE") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("LXC", "blkio",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_FAIL,
Pablo Greco 40546a
-                                        "BLK_CGROUP") < 0)
Pablo Greco 40546a
+    if (virHostValidateCGroupControllers("LXC",
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_MEMORY) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_CPU) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_CPUACCT) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_CPUSET) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_DEVICES) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_BLKIO),
Pablo Greco 40546a
+                                         VIR_HOST_VALIDATE_FAIL) < 0) {
Pablo Greco 40546a
         ret = -1;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
 
Pablo Greco 40546a
 #if WITH_FUSE
Pablo Greco 40546a
     if (virHostValidateDeviceExists("LXC", "/sys/fs/fuse/connections",
Pablo Greco 40546a
diff --git a/tools/virt-host-validate-qemu.c b/tools/virt-host-validate-qemu.c
Pablo Greco 40546a
index d7573ea8b3..ff3c1f0231 100644
Pablo Greco 40546a
--- a/tools/virt-host-validate-qemu.c
Pablo Greco 40546a
+++ b/tools/virt-host-validate-qemu.c
Pablo Greco 40546a
@@ -26,6 +26,7 @@
Pablo Greco 40546a
 #include "virt-host-validate-common.h"
Pablo Greco 40546a
 #include "virarch.h"
Pablo Greco 40546a
 #include "virbitmap.h"
Pablo Greco 40546a
+#include "vircgroup.h"
Pablo Greco 40546a
 
Pablo Greco 40546a
 int virHostValidateQEMU(void)
Pablo Greco 40546a
 {
Pablo Greco 40546a
@@ -96,35 +97,16 @@ int virHostValidateQEMU(void)
Pablo Greco 40546a
                                     _("Load the 'tun' module to enable networking for QEMU guests")) < 0)
Pablo Greco 40546a
         ret = -1;
Pablo Greco 40546a
 
Pablo Greco 40546a
-    if (virHostValidateCGroupController("QEMU", "memory",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_WARN,
Pablo Greco 40546a
-                                        "MEMCG") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("QEMU", "cpu",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_WARN,
Pablo Greco 40546a
-                                        "CGROUP_CPU") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("QEMU", "cpuacct",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_WARN,
Pablo Greco 40546a
-                                        "CGROUP_CPUACCT") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("QEMU", "cpuset",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_WARN,
Pablo Greco 40546a
-                                        "CPUSETS") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("QEMU", "devices",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_WARN,
Pablo Greco 40546a
-                                        "CGROUP_DEVICES") < 0)
Pablo Greco 40546a
-        ret = -1;
Pablo Greco 40546a
-
Pablo Greco 40546a
-    if (virHostValidateCGroupController("QEMU", "blkio",
Pablo Greco 40546a
-                                        VIR_HOST_VALIDATE_WARN,
Pablo Greco 40546a
-                                        "BLK_CGROUP") < 0)
Pablo Greco 40546a
+    if (virHostValidateCGroupControllers("QEMU",
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_MEMORY) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_CPU) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_CPUACCT) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_CPUSET) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_DEVICES) |
Pablo Greco 40546a
+                                         (1 << VIR_CGROUP_CONTROLLER_BLKIO),
Pablo Greco 40546a
+                                         VIR_HOST_VALIDATE_WARN) < 0) {
Pablo Greco 40546a
         ret = -1;
Pablo Greco 40546a
+    }
Pablo Greco 40546a
 
Pablo Greco 40546a
     if (virHostValidateIOMMU("QEMU",
Pablo Greco 40546a
                              VIR_HOST_VALIDATE_WARN) < 0)
Pablo Greco 40546a
-- 
Pablo Greco 40546a
2.22.0
Pablo Greco 40546a