[libvirt] [PATCH v2 02/11] qemu: support host usb device unplug

Daniel Henrique Barboza danielhb413 at gmail.com
Thu Sep 12 19:16:11 UTC 2019



On 9/9/19 8:33 AM, Nikolay Shirokovskiy wrote:
> Handle host usb device unplug in DEVICE_DELETED handle execution
> path.
>
> Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy at virtuozzo.com>
> ---

Reviewed-by: Daniel Henrique Barboza <danielhb413 at gmail.com>


>   src/qemu/qemu_hotplug.c | 38 +++++++++++++++++++++++++++++++-------
>   1 file changed, 31 insertions(+), 7 deletions(-)
>
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 559254b234..b045735022 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -4366,7 +4366,8 @@ qemuDomainRemoveUSBHostDevice(virQEMUDriverPtr driver,
>                                 virDomainHostdevDefPtr hostdev)
>   {
>       qemuHostdevReAttachUSBDevices(driver, vm->def->name, &hostdev, 1);
> -    qemuDomainReleaseDeviceAddress(vm, hostdev->info);
> +    if (hostdev->deleteAction != VIR_DOMAIN_HOSTDEV_DELETE_ACTION_UNPLUG)
> +        qemuDomainReleaseDeviceAddress(vm, hostdev->info);
>   }
>   
>   static void
> @@ -4408,6 +4409,7 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
>       char *drivealias = NULL;
>       char *objAlias = NULL;
>       bool is_vfio = false;
> +    bool unplug = hostdev->deleteAction == VIR_DOMAIN_HOSTDEV_DELETE_ACTION_UNPLUG;
>   
>       VIR_DEBUG("Removing host device %s from domain %p %s",
>                 hostdev->info->alias, vm, vm->def->name);
> @@ -4454,16 +4456,24 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
>           }
>       }
>   
> -    for (i = 0; i < vm->def->nhostdevs; i++) {
> -        if (vm->def->hostdevs[i] == hostdev) {
> -            virDomainHostdevRemove(vm->def, i);
> -            break;
> +    if (!unplug) {
> +        for (i = 0; i < vm->def->nhostdevs; i++) {
> +            if (vm->def->hostdevs[i] == hostdev) {
> +                virDomainHostdevRemove(vm->def, i);
> +                break;
> +            }
>           }
>       }
>   
>       virDomainAuditHostdev(vm, hostdev, "detach", true);
>   
> -    if (!is_vfio &&
> +    /*
> +     * In case of unplug the attempt to restore label will fail. But we don't
> +     * need to restore the label! In case of separate mount namespace for the
> +     * domain we remove device file later in this function. In case of global
> +     * mount namespace the device file is deleted or being deleted by systemd.
> +     */
> +    if (!is_vfio && !unplug &&
>           qemuSecurityRestoreHostdevLabel(driver, vm, hostdev) < 0)
>           VIR_WARN("Failed to restore host device labelling");
>   
> @@ -4497,7 +4507,13 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
>           break;
>       }
>   
> -    virDomainHostdevDefFree(hostdev);
> +    if (unplug) {
> +        virDomainHostdevSubsysUSBPtr usbsrc = &hostdev->source.subsys.u.usb;
> +        usbsrc->bus = 0;
> +        usbsrc->device = 0;
> +    } else {
> +        virDomainHostdevDefFree(hostdev);
> +    }
>   
>       if (net) {
>           if (net->type == VIR_DOMAIN_NET_TYPE_NETWORK) {
> @@ -4512,6 +4528,8 @@ qemuDomainRemoveHostDevice(virQEMUDriverPtr driver,
>           virDomainNetDefFree(net);
>       }
>   
> +    hostdev->deleteAction = VIR_DOMAIN_HOSTDEV_DELETE_ACTION_NONE;
> +
>       ret = 0;
>   
>    cleanup:
> @@ -4981,6 +4999,7 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver,
>       virDomainDeviceInfoPtr info;
>       virObjectEventPtr event;
>       VIR_AUTOFREE(char *) alias = NULL;
> +    bool unplug;
>   
>       /*
>        * save the alias to use when sending a DEVICE_REMOVED event after
> @@ -5021,8 +5040,13 @@ qemuDomainRemoveDevice(virQEMUDriverPtr driver,
>               return -1;
>           break;
>       case VIR_DOMAIN_DEVICE_HOSTDEV:
> +        unplug = dev->data.hostdev->deleteAction == VIR_DOMAIN_HOSTDEV_DELETE_ACTION_UNPLUG;
> +
>           if (qemuDomainRemoveHostDevice(driver, vm, dev->data.hostdev) < 0)
>               return -1;
> +
> +        if (unplug)
> +            return 0;
>           break;
>       case VIR_DOMAIN_DEVICE_RNG:
>           if (qemuDomainRemoveRNGDevice(driver, vm, dev->data.rng) < 0)




More information about the libvir-list mailing list