[libvirt] [PATCH] qemu: fix hot unplug of PCI devices with VFIO
Michal Privoznik
mprivozn at redhat.com
Tue Feb 16 12:13:34 UTC 2016
On 05.02.2016 20:07, Ludovic Beliveau wrote:
> Currently, on hot unplug of PCI devices with VFIO driver for QEMU, libvirt is
> trying to restore the host devices to it's previous value (basically a chown
> on the previous user/group).
>
> However for devices with VFIO driver, when the device is unbinded it is
> removed from the /dev/vfio file system causing the restore label to fail.
>
> The fix is to not restore the label for those PCI devices since they are going
> to be teared down anyway.
>
> Signed-off-by: Ludovic Beliveau <ludovic.beliveau at windriver.com>
> ---
Sorry for the delay. I had this patch marked for review but haven't been doing much review lately.
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index f8db960..f5beabd 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -2996,6 +2996,8 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
> int ret = -1;
> qemuDomainObjPrivatePtr priv = vm->privateData;
> char *drivestr = NULL;
> + virDomainHostdevSubsysPCIPtr pcisrc = NULL;
> + bool is_vfio = false;
>
> VIR_DEBUG("Removing host device %s from domain %p %s",
> hostdev->info->alias, vm, vm->def->name);
> @@ -3039,6 +3041,8 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
>
> switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) {
> case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
> + pcisrc = &hostdev->source.subsys.u.pci;
> + is_vfio = pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
I'd prefer:
int backend = hostdev->source.subsys.u.pci.backend;
is_vfio = backend == ...;
> qemuDomainRemovePCIHostDevice(driver, vm, hostdev);
> /* QEMU might no longer need to lock as much memory, eg. we just
> * detached the last VFIO device, so adjust the limit here */
> @@ -3058,7 +3062,8 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
> if (qemuTeardownHostdevCgroup(vm, hostdev) < 0)
> VIR_WARN("Failed to remove host device cgroup ACL");
>
> - if (virSecurityManagerRestoreHostdevLabel(driver->securityManager,
> + if (!is_vfio &&
> + virSecurityManagerRestoreHostdevLabel(driver->securityManager,
> vm->def, hostdev, NULL) < 0) {
> VIR_WARN("Failed to restore host device labelling");
> }
This approach is correct. But the same problem exists in qemuDomainAttachHostPCIDevice() under error label.
So ACK with this squashed in:
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 3e02c86..afa99f1 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -1278,7 +1278,8 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
if (virSecurityManagerSetHostdevLabel(driver->securityManager,
vm->def, hostdev, NULL) < 0)
goto error;
- teardownlabel = true;
+ if (backend != VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO)
+ teardownlabel = true;
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
if (qemuAssignDeviceHostdevAlias(vm->def, hostdev, -1) < 0)
@@ -2985,7 +2986,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
char *drivestr = NULL;
- virDomainHostdevSubsysPCIPtr pcisrc = NULL;
+ int backend;
bool is_vfio = false;
VIR_DEBUG("Removing host device %s from domain %p %s",
@@ -3030,8 +3031,8 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
switch ((virDomainHostdevSubsysType) hostdev->source.subsys.type) {
case VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI:
- pcisrc = &hostdev->source.subsys.u.pci;
- is_vfio = pcisrc->backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
+ backend = hostdev->source.subsys.u.pci.backend;
+ is_vfio = backend == VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO;
qemuDomainRemovePCIHostDevice(driver, vm, hostdev);
/* QEMU might no longer need to lock as much memory, eg. we just
* detached the last VFIO device, so adjust the limit here */
Michal
More information about the libvir-list
mailing list