The hostdevices are the only devices which have dependencies
outside of themselves such that, other functions of the PCI
card should also have been detached from host driver before
attempting the hotplug.

This patch moves the detach to the beginning of the hotplug
so that the following patch can detach all funtions first before
attempting to hotplug any.

We need not move the detach for net devices using SRIOV as
all SRIOV devices are single function devices and can be independently
detached as usual.

Signed-off-by: Shivaprasad G Bhat <sb...@linux.vnet.ibm.com>
---
 src/qemu/qemu_hotplug.c |   43 ++++++++++++++++++++++++++++++++++---------
 1 file changed, 34 insertions(+), 9 deletions(-)

diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 9a546e2..6821ed5 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -899,6 +899,7 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
     actualType = virDomainNetGetActualType(net);
 
     if (actualType == VIR_DOMAIN_NET_TYPE_HOSTDEV) {
+        virDomainHostdevDefPtr hostdev = virDomainNetGetActualHostdev(net);
         /* This is really a "smart hostdev", so it should be attached
          * as a hostdev (the hostdev code will reach over into the
          * netdev-specific code as appropriate), then also added to
@@ -907,8 +908,14 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
          * qemuDomainAttachHostDevice uses a connection to resolve
          * a SCSI hostdev secret, which is not this case, so pass NULL.
          */
-        ret = qemuDomainAttachHostDevice(NULL, driver, vm,
-                                         virDomainNetGetActualHostdev(net));
+        if (qemuDomainAttachPCIHostDevicePrepare(driver, vm->def,
+                                                 hostdev, priv->qemuCaps) < 0)
+            goto cleanup;
+
+        ret = qemuDomainAttachHostDevice(NULL, driver, vm, hostdev);
+        if (!ret)
+            qemuHostdevReAttachPCIDevices(driver, vm->def->name, &hostdev, 1);
+
         goto cleanup;
     }
 
@@ -1248,10 +1255,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
     if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
         return -1;
 
-    if (qemuDomainAttachPCIHostDevicePrepare(driver, vm->def,
-                                             hostdev, priv->qemuCaps) < 0)
-        return -1;
-
     backend = hostdev->source.subsys.u.pci.backend;
 
     /* Temporarily add the hostdev to the domain definition. This is needed
@@ -1330,8 +1333,6 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
     if (releaseaddr)
         qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
 
-    qemuHostdevReAttachPCIDevices(driver, vm->def->name, &hostdev, 1);
-
     VIR_FREE(devstr);
     VIR_FREE(configfd_name);
     VIR_FORCE_CLOSE(configfd);
@@ -4386,11 +4387,35 @@ qemuDomainAttachDeviceLive(virDomainObjPtr vm,
                            virDomainDeviceDefPtr dev,
                            virDomainPtr dom)
 {
+    virQEMUDriverPtr driver = dom->conn->privateData;
+    virQEMUCapsPtr qemuCaps = NULL;
+    qemuDomainObjPrivatePtr priv = vm->privateData;
+
+    if (priv->qemuCaps)
+        qemuCaps = virObjectRef(priv->qemuCaps);
+    else if (!(qemuCaps = virQEMUCapsCacheLookup(driver->qemuCapsCache, 
vm->def->emulator)))
+        return -1;
+
     if (virDomainDefCompatibleDevice(vm->def, dev,
                                      VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
         return -1;
 
-    return qemuDomainAttachDeviceLiveInternal(vm, dev, dom);
+    if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
+        dev->data.hostdev->source.subsys.type == 
VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI &&
+        qemuDomainAttachPCIHostDevicePrepare(driver, vm->def, 
dev->data.hostdev, qemuCaps) < 0)
+        return -1;
+
+    if (qemuDomainAttachDeviceLiveInternal(vm, dev, dom) < 0)
+        goto undoprepare;
+
+    return 0;
+
+ undoprepare:
+    if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
+        dev->data.hostdev->source.subsys.type == 
VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
+        qemuHostdevReAttachPCIDevices(driver, vm->def->name, 
&dev->data.hostdev, 1);
+
+    return -1;
 }
 
 static int

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

Reply via email to