c401cc
From d7e2761eba3655f898fca5388be26ab5c0469d48 Mon Sep 17 00:00:00 2001
c401cc
Message-Id: <d7e2761eba3655f898fca5388be26ab5c0469d48.1390394206.git.jdenemar@redhat.com>
c401cc
From: Jincheng Miao <jmiao@redhat.com>
c401cc
Date: Mon, 20 Jan 2014 14:41:13 +0100
c401cc
Subject: [PATCH] qemu: Don't detach devices if passthrough doesn't work
c401cc
c401cc
https://bugzilla.redhat.com/show_bug.cgi?id=1046919
c401cc
c401cc
If none (KVM, VFIO) of the supported PCI passthrough methods is known to
c401cc
work on a host, it's better to fail right away with a nice error message
c401cc
rather than letting attachment fail with a more cryptic message such as
c401cc
c401cc
    Failed to bind PCI device '0000:07:05.0' to vfio-pci: No such device
c401cc
c401cc
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
c401cc
(cherry picked from commit df8022721ef09b2e0bd06e16c7d45ff99034f761)
c401cc
---
c401cc
 src/qemu/qemu_driver.c | 32 +++++++++++++++++++++++---------
c401cc
 1 file changed, 23 insertions(+), 9 deletions(-)
c401cc
c401cc
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
c401cc
index a9368b1..b542414 100644
c401cc
--- a/src/qemu/qemu_driver.c
c401cc
+++ b/src/qemu/qemu_driver.c
c401cc
@@ -11065,6 +11065,8 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
c401cc
     int ret = -1;
c401cc
     virNodeDeviceDefPtr def = NULL;
c401cc
     char *xml = NULL;
c401cc
+    bool legacy = qemuHostdevHostSupportsPassthroughLegacy();
c401cc
+    bool vfio = qemuHostdevHostSupportsPassthroughVFIO();
c401cc
 
c401cc
     virCheckFlags(0, -1);
c401cc
 
c401cc
@@ -11087,22 +11089,34 @@ qemuNodeDeviceDetachFlags(virNodeDevicePtr dev,
c401cc
         goto cleanup;
c401cc
 
c401cc
     if (!driverName) {
c401cc
-        /* prefer vfio */
c401cc
-        if (qemuHostdevHostSupportsPassthroughVFIO())
c401cc
+        if (vfio) {
c401cc
             driverName = "vfio";
c401cc
-        else if (qemuHostdevHostSupportsPassthroughLegacy())
c401cc
+        } else if (legacy) {
c401cc
             driverName = "kvm";
c401cc
+        } else {
c401cc
+            virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
c401cc
+                           _("neither VFIO nor KVM device assignment is "
c401cc
+                             "currently supported on this system"));
c401cc
+            goto cleanup;
c401cc
+        }
c401cc
     }
c401cc
 
c401cc
-    if (!driverName) {
c401cc
-        virReportError(VIR_ERR_INVALID_ARG, "%s",
c401cc
-                       _("neither VFIO nor kvm device assignment is "
c401cc
-                         "currently supported on this system"));
c401cc
-        goto cleanup;
c401cc
-    } else if (STREQ(driverName, "vfio")) {
c401cc
+    if (STREQ(driverName, "vfio")) {
c401cc
+        if (!vfio) {
c401cc
+            virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
c401cc
+                           _("VFIO device assignment is currently not "
c401cc
+                             "supported on this system"));
c401cc
+            goto cleanup;
c401cc
+        }
c401cc
         if (virPCIDeviceSetStubDriver(pci, "vfio-pci") < 0)
c401cc
             goto cleanup;
c401cc
     } else if (STREQ(driverName, "kvm")) {
c401cc
+        if (!legacy) {
c401cc
+            virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED, "%s",
c401cc
+                           _("KVM device assignment is currently not "
c401cc
+                             "supported on this system"));
c401cc
+            goto cleanup;
c401cc
+        }
c401cc
         if (virPCIDeviceSetStubDriver(pci, "pci-stub") < 0)
c401cc
             goto cleanup;
c401cc
     } else {
c401cc
-- 
c401cc
1.8.5.3
c401cc