[libvirt] [PATCH v3 11/13] Move the detach of PCI device to the beginnging of live hotplug
Nikunj A Dadhania
nikunj at linux.vnet.ibm.com
Tue May 24 13:56:28 UTC 2016
Shivaprasad G Bhat <shivaprasadbhat at gmail.com> writes:
> 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 <sbhat at 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);
Unref / free the 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 at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list
More information about the libvir-list
mailing list