[Spice-devel] [PATCH spice-gtk] fixup! usb-redir: define interfaces to support emulated devices

Yuri Benditovich yuri.benditovich at daynix.com
Fri Aug 9 06:59:44 UTC 2019


On Thu, Aug 8, 2019 at 1:41 PM Frediano Ziglio <fziglio at redhat.com> wrote:
>
> Change reference counting semantic for emulated devices.
> Make the same as not emulated.
> This fix a leak if spice_usb_backend_device_eject is not called.
> Consistently the reference counter for SpiceUsbBackendDevice is
> now the number of owning pointers.
> ---
>  src/usb-backend.c   | 19 ++++++++++---------
>  src/usb-emulation.h |  2 +-
>  2 files changed, 11 insertions(+), 10 deletions(-)
>
> diff --git a/src/usb-backend.c b/src/usb-backend.c
> index d80da177..de2b55ec 100644
> --- a/src/usb-backend.c
> +++ b/src/usb-backend.c
> @@ -852,17 +852,17 @@ void spice_usb_backend_device_report_change(SpiceUsbBackend *be,
>
>  void spice_usb_backend_device_eject(SpiceUsbBackend *be, SpiceUsbBackendDevice *dev)
>  {
> -    g_return_if_fail(dev && dev->edev);
> +    g_return_if_fail(dev);
>
> +    if (dev->edev) {
> +        be->own_devices_mask &= ~(1 << dev->device_info.address);
> +    }
>      if (be->hotplug_callback) {
>          be->hotplug_callback(be->hotplug_user_data, dev, FALSE);
>      }
> -    be->own_devices_mask &= ~(1 << dev->device_info.address);
> -
> -    spice_usb_backend_device_unref(dev);
>  }
>
> -SpiceUsbBackendDevice*
> +gboolean
>  spice_usb_backend_create_emulated_device(SpiceUsbBackend *be,
>                                           SpiceUsbEmulatedDeviceCreate create_proc,
>                                           void *create_params,
> @@ -877,7 +877,7 @@ spice_usb_backend_create_emulated_device(SpiceUsbBackend *be,
>      if (be->own_devices_mask == 0xffffffff) {
>          g_set_error(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
>                      _("can't create device - limit reached"));
> -        return NULL;
> +        return FALSE;
>      }
>      for (address = 0; address < 32; ++address) {
>          if (~be->own_devices_mask & (1 << address)) {
> @@ -893,7 +893,7 @@ spice_usb_backend_create_emulated_device(SpiceUsbBackend *be,
>      dev->edev = edev = create_proc(be, dev, create_params, err);
>      if (edev == NULL) {
>          spice_usb_backend_device_unref(dev);
> -        return NULL;
> +        return FALSE;
>      }
>
>      if (!device_ops(edev)->get_descriptor(edev, LIBUSB_DT_DEVICE, 0,
> @@ -903,7 +903,7 @@ spice_usb_backend_create_emulated_device(SpiceUsbBackend *be,
>          spice_usb_backend_device_unref(dev);
>          g_set_error(err, SPICE_CLIENT_ERROR, SPICE_CLIENT_ERROR_FAILED,
>                      _("can't create device - internal error"));
> -        return NULL;
> +        return FALSE;
>      }
>
>      be->own_devices_mask |= 1 << address;
> @@ -918,8 +918,9 @@ spice_usb_backend_create_emulated_device(SpiceUsbBackend *be,
>      if (be->hotplug_callback) {
>          be->hotplug_callback(be->hotplug_user_data, dev, TRUE);
>      }
> +    spice_usb_backend_device_unref(dev);

I was thinking about doing that... What looks for me a little
problematic in such solution is that cd-device keeps a pointer to the
backend device, but this device is referenced only by
usb-device-manager and never referenced by anybody at backend area.
If you're ok with this fixup, let's use it. I see it working in all
functional flows and in live migration.

>
> -    return dev;
> +    return TRUE;
>  }
>
>  #endif /* USB_REDIR */
> diff --git a/src/usb-emulation.h b/src/usb-emulation.h
> index 9e626a24..46d54d47 100644
> --- a/src/usb-emulation.h
> +++ b/src/usb-emulation.h
> @@ -80,7 +80,7 @@ static inline const UsbDeviceOps *device_ops(SpiceUsbEmulatedDevice *dev)
>      return (const UsbDeviceOps *)dev;
>  }
>
> -SpiceUsbBackendDevice*
> +gboolean
>  spice_usb_backend_create_emulated_device(SpiceUsbBackend *be,
>                                           SpiceUsbEmulatedDeviceCreate create_proc,
>                                           void *create_params,
> --
> 2.20.1
>


More information about the Spice-devel mailing list