6d3351
From 0642cb0d5040df1e483752e15ba724fe04b3afca Mon Sep 17 00:00:00 2001
6d3351
Message-Id: <0642cb0d5040df1e483752e15ba724fe04b3afca@dist-git>
6d3351
From: Erik Skultety <eskultet@redhat.com>
6d3351
Date: Wed, 12 Apr 2017 13:07:14 +0200
6d3351
Subject: [PATCH] qemu: Fix mdev checking for VFIO support
6d3351
6d3351
Commit a4a39d90 added a check that checks for VFIO support with mediated
6d3351
devices. The problem is that the hostdev preparing functions behave like
6d3351
a fallthrough if device of that specific type doesn't exist. However,
6d3351
the check for VFIO support was independent of the existence of a mdev
6d3351
device which caused the guest to fail to start with any device to be
6d3351
directly assigned if VFIO was disabled/unavailable in the kernel.
6d3351
The proposed change first ensures that it makes sense to check for VFIO
6d3351
support in the first place, and only then performs the VFIO support check
6d3351
itself.
6d3351
6d3351
Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1441291
6d3351
6d3351
(cherry picked from commit b4c2ac8d56124428d9329643a68625465094c5a7)
6d3351
Signed-off-by: Erik Skultety <eskultet@redhat.com>
6d3351
---
6d3351
 src/qemu/qemu_hostdev.c | 17 +++++++++++++----
6d3351
 1 file changed, 13 insertions(+), 4 deletions(-)
6d3351
6d3351
diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
6d3351
index 685bf5b59..73d26f4c6 100644
6d3351
--- a/src/qemu/qemu_hostdev.c
6d3351
+++ b/src/qemu/qemu_hostdev.c
6d3351
@@ -330,11 +330,20 @@ qemuHostdevPrepareMediatedDevices(virQEMUDriverPtr driver,
6d3351
                                   int nhostdevs)
6d3351
 {
6d3351
     virHostdevManagerPtr hostdev_mgr = driver->hostdevMgr;
6d3351
+    bool supportsVFIO = qemuHostdevHostSupportsPassthroughVFIO();
6d3351
+    size_t i;
6d3351
 
6d3351
-    if (!qemuHostdevHostSupportsPassthroughVFIO()) {
6d3351
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
6d3351
-                       _("host doesn't support VFIO PCI interface"));
6d3351
-        return -1;
6d3351
+    for (i = 0; i < nhostdevs; i++) {
6d3351
+        if (hostdevs[i]->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
6d3351
+            hostdevs[i]->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_MDEV) {
6d3351
+            if (!supportsVFIO) {
6d3351
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
6d3351
+                               _("Mediated host device assignment requires "
6d3351
+                                 "VFIO support"));
6d3351
+                return -1;
6d3351
+            }
6d3351
+            break;
6d3351
+        }
6d3351
     }
6d3351
 
6d3351
     return virHostdevPrepareMediatedDevices(hostdev_mgr, QEMU_DRIVER_NAME,
6d3351
-- 
6d3351
2.12.2
6d3351