[libvirt] [PATCHv4 8/9] Assign addresses on USB device hotplug

John Ferlan jferlan at redhat.com
Thu Jul 14 15:26:54 UTC 2016



On 07/01/2016 11:38 AM, Ján Tomko wrote:
> USB disks, redirected devices, host devices and serial devices
> are supported.
> ---
>  src/conf/domain_addr.c                             | 29 ++++++++++++++++++++++
>  src/conf/domain_addr.h                             |  4 +++
>  src/libvirt_private.syms                           |  1 +
>  src/qemu/qemu_domain_address.c                     |  5 ++++
>  src/qemu/qemu_hotplug.c                            | 27 ++++++++++++++++++++
>  .../qemuhotplug-hotplug-base-live+disk-usb.xml     |  1 +
>  6 files changed, 67 insertions(+)
> 

This wouldn't git am -3 apply for me without "removing" the hotplug xml
since I believe the tests moved.

> diff --git a/src/conf/domain_addr.c b/src/conf/domain_addr.c
> index e1a8385..491d9c6 100644
> --- a/src/conf/domain_addr.c
> +++ b/src/conf/domain_addr.c
> @@ -1731,3 +1731,32 @@ virDomainUSBAddressEnsure(virDomainUSBAddressSetPtr addrs,
>  
>      return 0;
>  }
> +
> +
> +int
> +virDomainUSBAddressRelease(virDomainUSBAddressSetPtr addrs,
> +                           virDomainDeviceInfoPtr info)
> +{
> +    virDomainUSBAddressHubPtr targetHub = NULL;
> +    char *portStr = NULL;
> +    int targetPort;
> +    int ret = -1;
> +
> +    if (info->type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB)
> +        return 0;
> +
> +    portStr = virDomainUSBAddressPortFormat(info->addr.usb.port);
> +    VIR_DEBUG("Releasing USB addr bus=%u port=%s", info->addr.usb.bus, portStr);
> +
> +    if (!(targetHub = virDomainUSBAddressFindPort(addrs, info, &targetPort,
> +                                                  portStr)))
> +        goto cleanup;
> +
> +    ignore_value(virBitmapClearBit(targetHub->ports, targetPort));
> +
> +    ret = 0;
> +
> + cleanup:
> +    VIR_FREE(portStr);
> +    return ret;
> +}
> diff --git a/src/conf/domain_addr.h b/src/conf/domain_addr.h
> index 4ae860c..5a3f935 100644
> --- a/src/conf/domain_addr.h
> +++ b/src/conf/domain_addr.h
> @@ -293,4 +293,8 @@ int
>  virDomainUSBAddressEnsure(virDomainUSBAddressSetPtr addrs,
>                            virDomainDeviceInfoPtr info)
>      ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
> +int
> +virDomainUSBAddressRelease(virDomainUSBAddressSetPtr addrs,
> +                           virDomainDeviceInfoPtr info)
> +    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
>  #endif /* __DOMAIN_ADDR_H__ */
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 4727d39..e23bfe3 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -112,6 +112,7 @@ virDomainUSBAddressEnsure;
>  virDomainUSBAddressPortFormat;
>  virDomainUSBAddressPortFormatBuf;
>  virDomainUSBAddressPortIsValid;
> +virDomainUSBAddressRelease;
>  virDomainUSBAddressReserve;
>  virDomainUSBAddressSetAddControllers;
>  virDomainUSBAddressSetAddHub;
> diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
> index 93c90de..c18182a 100644
> --- a/src/qemu/qemu_domain_address.c
> +++ b/src/qemu/qemu_domain_address.c
> @@ -1771,4 +1771,9 @@ qemuDomainReleaseDeviceAddress(virDomainObjPtr vm,
>          virDomainVirtioSerialAddrRelease(priv->vioserialaddrs, info) < 0)
>          VIR_WARN("Unable to release virtio-serial address on %s",
>                   NULLSTR(devstr));
> +    if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB &&
> +        priv->usbaddrs &&
> +        virDomainUSBAddressRelease(priv->usbaddrs, info) < 0)
> +        VIR_WARN("Unable to release usb address on %s",
> +                 NULLSTR(devstr));

OK well this addresses an earlier comment...

Still, message should use "USB" instead of "usb"

>  }
> diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
> index 093aaf9..e52780e 100644
> --- a/src/qemu/qemu_hotplug.c
> +++ b/src/qemu/qemu_hotplug.c
> @@ -640,6 +640,13 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver,
>      char *devstr = NULL;
>      virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
>      const char *src = virDomainDiskGetSource(disk);
> +    bool releaseaddr;

Not initialized, causes 2 Coverity complaints...

> +
> +    if (priv->usbaddrs) {
> +        if (virDomainUSBAddressEnsure(priv->usbaddrs, &disk->info) < 0)
> +            goto cleanup;
> +        releaseaddr = true;
> +    }
>  
>      if (qemuDomainPrepareDisk(driver, vm, disk, NULL, false) < 0)
>          goto cleanup;
> @@ -685,6 +692,8 @@ qemuDomainAttachUSBMassStorageDevice(virQEMUDriverPtr driver,
>      virDomainDiskInsertPreAlloced(vm->def, disk);
>  
>   cleanup:
> +    if (ret < 0 && releaseaddr)
> +        virDomainUSBAddressRelease(priv->usbaddrs, &disk->info);
>      VIR_FREE(devstr);
>      VIR_FREE(drivestr);
>      virObjectUnref(cfg);
> @@ -1486,6 +1495,12 @@ qemuDomainAttachChrDeviceAssignAddr(qemuDomainObjPrivatePtr priv,
>              return -1;
>          return 1;
>  
> +    } else if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
> +               chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB) {
> +        if (virDomainUSBAddressEnsure(priv->usbaddrs, &chr->info) < 0)
> +            return -1;
> +        return 1;
> +
>      } else if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
>                 chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO) {
>          if (virDomainVirtioSerialAddrAutoAssign(NULL, priv->vioserialaddrs,
> @@ -1804,11 +1819,18 @@ qemuDomainAttachHostUSBDevice(virQEMUDriverPtr driver,
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
>      char *devstr = NULL;
> +    bool releaseaddr = false;
>      bool added = false;
>      bool teardowncgroup = false;
>      bool teardownlabel = false;
>      int ret = -1;
>  
> +    if (priv->usbaddrs) {
> +        if (virDomainUSBAddressEnsure(priv->usbaddrs, hostdev->info) < 0)
> +            goto cleanup;
> +        releaseaddr = true;
> +    }
> +
>      if (qemuHostdevPrepareUSBDevices(driver, vm->def->name, &hostdev, 1, 0) < 0)
>          goto cleanup;
>  
> @@ -1854,6 +1876,8 @@ qemuDomainAttachHostUSBDevice(virQEMUDriverPtr driver,
>              VIR_WARN("Unable to restore host device labelling on hotplug fail");
>          if (added)
>              qemuHostdevReAttachUSBDevices(driver, vm->def->name, &hostdev, 1);
> +        if (releaseaddr)
> +            virDomainUSBAddressRelease(priv->usbaddrs, hostdev->info);
>      }
>      VIR_FREE(devstr);
>      return ret;
> @@ -2851,6 +2875,8 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
>      dev.type = VIR_DOMAIN_DEVICE_DISK;
>      dev.data.disk = disk;
>      ignore_value(qemuRemoveSharedDevice(driver, &dev, vm->def->name));
> +    if (priv->usbaddrs)
> +        virDomainUSBAddressRelease(priv->usbaddrs, &disk->info);

I suppose since virDomainUSBAddressRelease does check for address type
that it doesn't matter, but it is perhaps notable that SCSI disks would
be going through a few extra cycles before returning 0...

ACK with correct placement of the XML file, the error msg adjustment,
and the initialization of releaseaddr

John


>  
>      virDomainDiskDefFree(disk);
>      return 0;
> @@ -2947,6 +2973,7 @@ qemuDomainRemoveUSBHostDevice(virQEMUDriverPtr driver,
>                                virDomainHostdevDefPtr hostdev)
>  {
>      qemuHostdevReAttachUSBDevices(driver, vm->def->name, &hostdev, 1);
> +    qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
>  }
>  
>  static void
> diff --git a/tests/qemuhotplugtestdata/qemuhotplug-hotplug-base-live+disk-usb.xml b/tests/qemuhotplugtestdata/qemuhotplug-hotplug-base-live+disk-usb.xml
> index 41039a4..cd686e6 100644
> --- a/tests/qemuhotplugtestdata/qemuhotplug-hotplug-base-live+disk-usb.xml
> +++ b/tests/qemuhotplugtestdata/qemuhotplug-hotplug-base-live+disk-usb.xml
> @@ -27,6 +27,7 @@
>        <readonly/>
>        <shareable/>
>        <alias name='usb-disk16'/>
> +      <address type='usb' bus='0' port='1'/>
>      </disk>
>      <controller type='usb' index='0'>
>        <alias name='usb'/>
> 




More information about the libvir-list mailing list