[PATCH 4/4] virt-host-validate: check for intel_iommu=on cmdline flag

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This looks for existance of /sys/firmware/acpi/tables/DMAR
as a reasonable hint that the BIOS support an Intel IOMMU.

This file is only present if enabled in the BIOS, so the
check only does something if the BIOS is enabled but the
kernel has it disabled.

TBD figure out a check for AMD too, which doesn't involve
grepping dmesg which might have already been purged.

Signed-off-by: Daniel P. Berrange <berrange@xxxxxxxxxx>
---
 tools/virt-host-validate-common.c | 36 ++++++++++++++++++++++++++++++++++++
 tools/virt-host-validate-common.h |  5 +++++
 tools/virt-host-validate-qemu.c   | 10 ++++++++++
 3 files changed, 51 insertions(+)

diff --git a/tools/virt-host-validate-common.c b/tools/virt-host-validate-common.c
index 7e8d619..093acf6 100644
--- a/tools/virt-host-validate-common.c
+++ b/tools/virt-host-validate-common.c
@@ -340,3 +340,39 @@ extern int virHostValidateCGroupController(const char *hvname,
         return -1;
     return 0;
 }
+
+extern int virHostValidateKernelCmdline(const char *hvname,
+                                        const char *arg,
+                                        virHostValidateLevel level,
+                                        const char *hint)
+{
+    FILE *fp = fopen("/proc/cmdline", "r");
+    char *line = NULL;
+    size_t len = 0;
+    char *tmp;
+
+    virHostMsgCheck(hvname, "/proc/cmdline for '%s'", arg);
+
+    if (!fp)
+        goto error;
+
+    if (getline(&line, &len, fp) < 0)
+        goto error;
+
+    tmp = strstr(line, arg);
+    if (!tmp)
+        goto error;
+    tmp += strlen(arg);
+    if (*tmp != '\0' &&
+        *tmp != ' ')
+        goto error;
+
+    fclose(fp);
+    virHostMsgPass();
+    return 0;
+
+ error:
+    fclose(fp);
+    virHostMsgFail(level, "%s", hint);
+    return -1;
+}
diff --git a/tools/virt-host-validate-common.h b/tools/virt-host-validate-common.h
index 1547e22..a01e47b 100644
--- a/tools/virt-host-validate-common.h
+++ b/tools/virt-host-validate-common.h
@@ -60,6 +60,11 @@ extern int virHostValidateLinuxKernel(const char *hvname,
                                       virHostValidateLevel level,
                                       const char *hint);
 
+extern int virHostValidateKernelCmdline(const char *hvname,
+                                        const char *arg,
+                                        virHostValidateLevel level,
+                                        const char *hint);
+
 extern int virHostValidateNamespace(const char *hvname,
                                     const char *ns_name,
                                     virHostValidateLevel level,
diff --git a/tools/virt-host-validate-qemu.c b/tools/virt-host-validate-qemu.c
index b0ae293..1917962 100644
--- a/tools/virt-host-validate-qemu.c
+++ b/tools/virt-host-validate-qemu.c
@@ -20,6 +20,8 @@
  */
 
 #include <config.h>
+#include <unistd.h>
+
 #include "virt-host-validate-qemu.h"
 #include "virt-host-validate-common.h"
 
@@ -87,5 +89,13 @@ int virHostValidateQEMU(void)
                                         "BLK_CGROUP") < 0)
         ret = -1;
 
+    if (access("/sys/firmware/acpi/tables/DMAR", F_OK) == 0 &&
+        virHostValidateHasCPUFlag("vmx") &&
+        virHostValidateKernelCmdline("QEMU", "intel_iommu=on",
+                                     VIR_HOST_VALIDATE_WARN,
+                                     "IOMMU present in system but disabled in kernel. "
+                                     "Add intel_iommu=on to kernel cmdline arguments") < 0)
+        ret = -1;
+
     return ret;
 }
-- 
2.4.3

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]