[libvirt] [PATCH v12 04/11] qemu_hostdev: parse BACKEND_DEFAULT outside

Chunyan Liu cyliu at suse.com
Mon Feb 17 06:32:06 UTC 2014


For extracting hostdev codes from qemu_hostdev.c to common library, change
original paring VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT in hostdev function to
qemuDomainDeviceDefPostParse.

Signed-off-by: Chunyan Liu <cyliu at suse.com>
---
 src/qemu/qemu_domain.c                             |   22 +++++++++++++++
 src/qemu/qemu_hostdev.c                            |   28 +++-----------------
 src/qemu/qemu_hostdev.h                            |    2 -
 src/qemu/qemu_hotplug.c                            |    2 +-
 src/qemu/qemu_process.c                            |    3 +-
 .../qemuxml2argv-hostdev-pci-address.xml           |    1 +
 .../qemuxml2argvdata/qemuxml2argv-net-hostdev.xml  |    1 +
 tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml    |    2 +
 8 files changed, 32 insertions(+), 29 deletions(-)

diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index a665061..55e707e 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -38,6 +38,7 @@
 #include "virtime.h"
 #include "virstoragefile.h"
 #include "virstring.h"
+#include "qemu_hostdev.h"
 
 #include <sys/time.h>
 #include <fcntl.h>
@@ -821,6 +822,7 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
     int ret = -1;
     virQEMUDriverPtr driver = opaque;
     virQEMUDriverConfigPtr cfg = NULL;
+    virQEMUCapsPtr qemuCaps = NULL;
 
     if (dev->type == VIR_DOMAIN_DEVICE_NET &&
         dev->data.net->type != VIR_DOMAIN_NET_TYPE_HOSTDEV &&
@@ -899,6 +901,26 @@ qemuDomainDeviceDefPostParse(virDomainDeviceDefPtr dev,
         dev->data.chr->source.data.nix.listen = true;
     }
 
+    if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV) {
+        virDomainHostdevDefPtr hostdev = dev->data.hostdev;
+        if (hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+            hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
+            hostdev->source.subsys.u.pci.backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT) {
+
+            hostdev->source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM;
+            if (driver && driver->qemuCapsCache) {
+                bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO();
+                qemuCaps = virQEMUCapsCacheLookupCopy(driver->qemuCapsCache,
+                                                      def->emulator);
+                if (supportsPassthroughVFIO && qemuCaps &&
+                    virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI))
+                    hostdev->source.subsys.u.pci.backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
+
+                virObjectUnref(qemuCaps);
+            }
+        }
+    }
+
     ret = 0;
 
 cleanup:
diff --git a/src/qemu/qemu_hostdev.c b/src/qemu/qemu_hostdev.c
index ce5012d..80552cd 100644
--- a/src/qemu/qemu_hostdev.c
+++ b/src/qemu/qemu_hostdev.c
@@ -583,8 +583,7 @@ qemuHostdevHostSupportsPassthroughLegacy(void)
 
 static bool
 qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs,
-                                  size_t nhostdevs,
-                                  virQEMUCapsPtr qemuCaps)
+                                  size_t nhostdevs)
 {
     bool supportsPassthroughKVM = qemuHostdevHostSupportsPassthroughLegacy();
     bool supportsPassthroughVFIO = qemuHostdevHostSupportsPassthroughVFIO();
@@ -601,23 +600,6 @@ qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs,
             continue;
 
         switch ((virDomainHostdevSubsysPciBackendType) *backend) {
-        case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_DEFAULT:
-            if (supportsPassthroughVFIO &&
-                virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VFIO_PCI)) {
-                *backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
-            } else if (supportsPassthroughKVM &&
-                       (virQEMUCapsGet(qemuCaps, QEMU_CAPS_PCIDEVICE) ||
-                        virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE))) {
-                *backend = VIR_DOMAIN_HOSTDEV_PCI_BACKEND_KVM;
-            } else {
-                virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
-                               _("host doesn't support passthrough of "
-                                 "host PCI devices"));
-                return false;
-            }
-
-            break;
-
         case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO:
             if (!supportsPassthroughVFIO) {
                 virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
@@ -635,7 +617,7 @@ qemuPrepareHostdevPCICheckSupport(virDomainHostdevDefPtr *hostdevs,
 
             break;
 
-        case VIR_DOMAIN_HOSTDEV_PCI_BACKEND_TYPE_LAST:
+        default:
             break;
         }
     }
@@ -650,7 +632,6 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
                              const unsigned char *uuid,
                              virDomainHostdevDefPtr *hostdevs,
                              int nhostdevs,
-                             virQEMUCapsPtr qemuCaps,
                              unsigned int flags)
 {
     virPCIDeviceListPtr pcidevs = NULL;
@@ -659,7 +640,7 @@ qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
     int ret = -1;
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
 
-    if (!qemuPrepareHostdevPCICheckSupport(hostdevs, nhostdevs, qemuCaps))
+    if (!qemuPrepareHostdevPCICheckSupport(hostdevs, nhostdevs))
         goto cleanup;
 
     virObjectLock(driver->activePciHostdevs);
@@ -1189,7 +1170,6 @@ cleanup:
 int
 qemuPrepareHostDevices(virQEMUDriverPtr driver,
                        virDomainDefPtr def,
-                       virQEMUCapsPtr qemuCaps,
                        unsigned int flags)
 {
     if (!def->nhostdevs)
@@ -1197,7 +1177,7 @@ qemuPrepareHostDevices(virQEMUDriverPtr driver,
 
     if (qemuPrepareHostdevPCIDevices(driver, def->name, def->uuid,
                                      def->hostdevs, def->nhostdevs,
-                                     qemuCaps, flags) < 0)
+                                     flags) < 0)
         return -1;
 
     if (qemuPrepareHostUSBDevices(driver, def, flags) < 0)
diff --git a/src/qemu/qemu_hostdev.h b/src/qemu/qemu_hostdev.h
index 710867d..128032d 100644
--- a/src/qemu/qemu_hostdev.h
+++ b/src/qemu/qemu_hostdev.h
@@ -45,7 +45,6 @@ int qemuPrepareHostdevPCIDevices(virQEMUDriverPtr driver,
                                  const unsigned char *uuid,
                                  virDomainHostdevDefPtr *hostdevs,
                                  int nhostdevs,
-                                 virQEMUCapsPtr qemuCaps,
                                  unsigned int flags);
 int qemuFindHostdevUSBDevice(virDomainHostdevDefPtr hostdev,
                              bool mandatory,
@@ -59,7 +58,6 @@ int qemuPrepareHostdevSCSIDevices(virQEMUDriverPtr driver,
                                   int nhostdevs);
 int qemuPrepareHostDevices(virQEMUDriverPtr driver,
                            virDomainDefPtr def,
-                           virQEMUCapsPtr qemuCaps,
                            unsigned int flags);
 void qemuDomainReAttachHostScsiDevices(virQEMUDriverPtr driver,
                                        const char *name,
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index c47c5e8..8486f25 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1163,7 +1163,7 @@ qemuDomainAttachHostPciDevice(virQEMUDriverPtr driver,
     if (!cfg->relaxedACS)
         flags |= VIR_STRICT_ACS_CHECK;
     if (qemuPrepareHostdevPCIDevices(driver, vm->def->name, vm->def->uuid,
-                                     &hostdev, 1, priv->qemuCaps, flags) < 0)
+                                     &hostdev, 1, flags) < 0)
         return -1;
 
     /* this could have been changed by qemuPrepareHostdevPCIDevices */
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index f1fe35e..e938649 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -3690,8 +3690,7 @@ int qemuProcessStart(virConnectPtr conn,
         hostdev_flags |= VIR_STRICT_ACS_CHECK;
     if (!migrateFrom)
         hostdev_flags |= VIR_COLD_BOOT;
-    if (qemuPrepareHostDevices(driver, vm->def, priv->qemuCaps,
-                                                    hostdev_flags) < 0)
+    if (qemuPrepareHostDevices(driver, vm->def, hostdev_flags) < 0)
         goto cleanup;
 
     VIR_DEBUG("Preparing chr devices");
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml
index 422127c..b9a221a 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-hostdev-pci-address.xml
@@ -24,6 +24,7 @@
     <controller type='ide' index='0'/>
     <controller type='pci' index='0' model='pci-root'/>
     <hostdev mode='subsystem' type='pci' managed='yes'>
+      <driver name='kvm'/>
       <source>
         <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
       </source>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml b/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml
index d65ef87..9e79348 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-net-hostdev.xml
@@ -24,6 +24,7 @@
     <controller type='pci' index='0' model='pci-root'/>
     <interface type='hostdev' managed='yes'>
       <mac address='00:11:22:33:44:55'/>
+      <driver name='kvm'/>
       <source>
         <address type='pci' domain='0x0002' bus='0x03' slot='0x07' function='0x1'/>
       </source>
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml
index a5e59b2..924842b 100644
--- a/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml
+++ b/tests/qemuxml2argvdata/qemuxml2argv-pci-rom.xml
@@ -33,12 +33,14 @@
       <rom file='/etc/fake/bootrom.bin'/>
     </interface>
     <hostdev mode='subsystem' type='pci' managed='yes'>
+      <driver name='kvm'/>
       <source>
         <address domain='0x0000' bus='0x06' slot='0x12' function='0x5'/>
       </source>
       <rom bar='off'/>
     </hostdev>
     <hostdev mode='subsystem' type='pci' managed='yes'>
+      <driver name='kvm'/>
       <source>
         <address domain='0x0000' bus='0x06' slot='0x12' function='0x6'/>
       </source>
-- 
1.6.0.2




More information about the libvir-list mailing list