[Spice-devel] [PATCH v7 06/14] usbredir: Spawn a different thread for device redirection flow

Fabiano FidĂȘncio fidencio at redhat.com
Wed Mar 16 22:01:35 UTC 2016


On Wed, Mar 16, 2016 at 10:54 PM, Jonathon Jongsma <jjongsma at redhat.com> wrote:
> Updated proposal:
>
> --- a/src/channel-usbredir.c
> +++ b/src/channel-usbredir.c
> @@ -368,16 +368,19 @@ _open_device_async_cb(GTask *task,
>      spice_usbredir_channel_lock(channel);
>
>      if (!spice_usbredir_channel_open_device(channel, &err)) {
> -        g_task_return_error(task, err);
>          libusb_unref_device(priv->device);
>          priv->device = NULL;
>          g_boxed_free(spice_usb_device_get_type(), priv->spice_device);
>          priv->spice_device = NULL;
> -    } else {
> -        g_task_return_boolean(task, TRUE);
>      }
>
>      spice_usbredir_channel_unlock(channel);
> +
> +    if (err) {
> +        g_task_return_error(task, err);
> +    } else {
> +        g_task_return_boolean(task, TRUE);
> +    }
>  }
>  #endif

ACK from my side. But I really would like to have Dmitry doing a last
round of tests on his series, this time with this GTask changes
applied.
Does it sound reasonable?

>
>
>
> On Wed, 2016-03-16 at 16:44 -0500, Jonathon Jongsma wrote:
>> On Wed, 2016-03-16 at 10:41 -0500, Jonathon Jongsma wrote:
>> > So, after adding the g_task_return_boolean back to _open_device_async_cb(),
>> > I
>> > noticed that since g_task_return_error() can potentially complete the task
>> > immediately (rather than in an idle handler done previously), we may be
>> > executing the GAsyncReadyCallback while the channel is locked. Currently, I
>> > don't think this causes any problems, but if the callback did anything that
>> > required locking the channel's mutex, that could result in a deadlock. So
>> > here's
>> > an additional proposed patch to unlock before completing the task. If this
>> > change is ACKed, I'd probably squash it into this patch.
>> >
>> > ------------
>> > diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c
>> > index cd2ff4f..aa8e943 100644
>> > --- a/src/channel-usbredir.c
>> > +++ b/src/channel-usbredir.c
>> > @@ -367,17 +367,19 @@ _open_device_async_cb(GTask *task,
>> >
>> >      spice_usbredir_channel_lock(channel);
>> >
>> > -    if (!spice_usbredir_channel_open_device(channel, &err)) {
>> > +    spice_usbredir_channel_open_device(channel, &err);
>> > +    libusb_unref_device(priv->device);
>> > +    priv->device = NULL;
>> > +    g_boxed_free(spice_usb_device_get_type(), priv->spice_device);
>> > +    priv->spice_device = NULL;
>> > +
>> > +    spice_usbredir_channel_unlock(channel);
>> > +
>> > +    if (err) {
>> >          g_task_return_error(task, err);
>> > -        libusb_unref_device(priv->device);
>> > -        priv->device = NULL;
>> > -        g_boxed_free(spice_usb_device_get_type(), priv->spice_device);
>> > -        priv->spice_device = NULL;
>> >      } else {
>> >          g_task_return_boolean(task, TRUE);
>> >      }
>> > -
>> > -    spice_usbredir_channel_unlock(channel);
>> >  }
>> >  #endif
>> >
>>
>> ... And Fabiano pointed out that this patch is incorrect since it frees the
>> device even if it was successfully redirected. That's clearly wrong. New patch
>> coming.
>>
>>
>> >
>> >
>> > On Wed, 2016-03-16 at 10:16 -0500, Jonathon Jongsma wrote:
>> > > On Wed, 2016-03-16 at 11:27 +0100, Christophe Fergeau wrote:
>> > > > Hey,
>> > > >
>> > > > On Tue, Mar 15, 2016 at 02:31:03PM -0500, Jonathon Jongsma wrote:
>> > > > > +#ifndef USE_POLKIT
>> > > > > +static void
>> > > > > +_open_device_async_cb(GTask *task,
>> > > > > +                      gpointer object,
>> > > > > +                      gpointer task_data,
>> > > > > +                      GCancellable *cancellable)
>> > > > > +{
>> > > > > +    GError *err = NULL;
>> > > > > +    SpiceUsbredirChannel *channel = SPICE_USBREDIR_CHANNEL(object);
>> > > > > +    SpiceUsbredirChannelPrivate *priv = channel->priv;
>> > > > > +
>> > > > > +    spice_usbredir_channel_lock(channel);
>> > > > > +
>> > > > > +    if (!spice_usbredir_channel_open_device(channel, &err)) {
>> > > > > +        g_task_return_error(task, err);
>> > > > > +        libusb_unref_device(priv->device);
>> > > > > +        priv->device = NULL;
>> > > > > +        g_boxed_free(spice_usb_device_get_type(), priv
>> > > > > ->spice_device);
>> > > > > +        priv->spice_device = NULL;
>> > > > > +    }
>> > > > > +
>> > > > > +    spice_usbredir_channel_unlock(channel);
>> > > > > +}
>> > > > > +#endif
>> > > > > +
>> > > > >  G_GNUC_INTERNAL
>> > > > >  void spice_usbredir_channel_connect_device_async(
>> > > > >                                            SpiceUsbredirChannel
>> > > > > *channel,
>> > > > > @@ -331,9 +356,6 @@ void spice_usbredir_channel_connect_device_async(
>> > > > >  {
>> > > > >      SpiceUsbredirChannelPrivate *priv = channel->priv;
>> > > > >      GTask *task;
>> > > > > -#ifndef USE_POLKIT
>> > > > > -    GError *err = NULL;
>> > > > > -#endif
>> > > > >
>> > > > >      g_return_if_fail(SPICE_IS_USBREDIR_CHANNEL(channel));
>> > > > >      g_return_if_fail(device != NULL);
>> > > > > @@ -376,15 +398,7 @@ void spice_usbredir_channel_connect_device_async(
>> > > > >                                          channel);
>> > > > >      return;
>> > > > >  #else
>> > > > > -    if (!spice_usbredir_channel_open_device(channel, &err)) {
>> > > > > -        g_task_return_error(task, err);
>> > > > > -        libusb_unref_device(priv->device);
>> > > > > -        priv->device = NULL;
>> > > > > -        g_boxed_free(spice_usb_device_get_type(), priv
>> > > > > ->spice_device);
>> > > > > -        priv->spice_device = NULL;
>> > > > > -    } else {
>> > > > > -        g_task_return_boolean(task, TRUE);
>> > > >
>> > > > Only looked at the diff, not at the full code, but this
>> > > > g_task_return_boolean(task, TRUE); is gone from the threaded version, is
>> > > > this intentional?
>> > > >
>> > >
>> > > Good catch. That was unintentional.
>> > >
>> > >
>> > > > Christophe
>> > > _______________________________________________
>> > > Spice-devel mailing list
>> > > Spice-devel at lists.freedesktop.org
>> > > https://lists.freedesktop.org/mailman/listinfo/spice-devel
>> > _______________________________________________
>> > Spice-devel mailing list
>> > Spice-devel at lists.freedesktop.org
>> > https://lists.freedesktop.org/mailman/listinfo/spice-devel
>> _______________________________________________
>> Spice-devel mailing list
>> Spice-devel at lists.freedesktop.org
>> https://lists.freedesktop.org/mailman/listinfo/spice-devel
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/spice-devel


More information about the Spice-devel mailing list