]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
qemu: Honor the original properties of PCI device when detaching
authorOsier Yang <jyang@redhat.com>
Tue, 29 Nov 2011 10:09:24 +0000 (18:09 +0800)
committerOsier Yang <jyang@redhat.com>
Thu, 15 Dec 2011 02:14:11 +0000 (10:14 +0800)
This patch fixes two problems:
    1) The device will be reattached to host even if it's not
       managed, as there is a "pciDeviceSetManaged".
    2) The device won't be reattached to host with original
       driver properly. As it doesn't honor the device original
       properties which are maintained by driver->activePciHostdevs.

src/qemu/qemu_hotplug.c

index eabfeaa760eea752f9dd0c2950c7965a8880004a..b28a8cb1eaee943a395fa3dbf640700d8eb0c467 100644 (file)
@@ -1960,6 +1960,7 @@ int qemuDomainDetachHostPciDevice(struct qemud_driver *driver,
     qemuDomainObjPrivatePtr priv = vm->privateData;
     int i, ret;
     pciDevice *pci;
+    pciDevice *activePci;
 
     for (i = 0 ; i < vm->def->nhostdevs ; i++) {
         if (vm->def->hostdevs[i]->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
@@ -2019,16 +2020,16 @@ int qemuDomainDetachHostPciDevice(struct qemud_driver *driver,
                        detach->source.subsys.u.pci.bus,
                        detach->source.subsys.u.pci.slot,
                        detach->source.subsys.u.pci.function);
-    if (!pci)
-        ret = -1;
-    else {
-        pciDeviceSetManaged(pci, detach->managed);
-        pciDeviceListDel(driver->activePciHostdevs, pci);
-        if (pciResetDevice(pci, driver->activePciHostdevs, NULL) < 0)
+    if (pci) {
+        activePci = pciDeviceListSteal(driver->activePciHostdevs, pci);
+        if (pciResetDevice(activePci, driver->activePciHostdevs, NULL))
+            qemuReattachPciDevice(activePci, driver);
+        else
             ret = -1;
-        pciDeviceReAttachInit(pci);
-        qemuReattachPciDevice(pci, driver);
         pciFreeDevice(pci);
+        pciFreeDevice(activePci);
+    } else {
+        ret = -1;
     }
 
     if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&