[Spice-devel] [PATCH] Revert "usbredir: Disconnect USB device asynchronously"
Qiu Wenbo
qiuwenbo at kylinos.com.cn
Sat May 12 03:19:34 UTC 2018
Yes. The situation can be easily reproduced by the patch below. We have
noticed it usually happen on some thin clients (without the patch).
Also, I can reproduce it on my desktop (latest version of Arch linux,
ryzen 1600x) with debug build of qemu, spice-gtk, and usbredir with
remote-viewer --spice-debug and gdb attached(also without the patch).
Step to produce the situation:
1. launch a virtual machine, and redirect a USB mass storage device (or
something else) to it
2. run udevadmin monitor
3. poweroff your virtual machine by running poweroff in your virtual
machine
The udevadmin won't tell you there is an ADD uevent for your USB device
if the situation is produced. Host operating system won't do a driver
probe automatically without an ADD uevent, and you should do a replug
to work with the device.
diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c
index 0cc5630..2c27825 100644
--- a/src/channel-usbredir.c
+++ b/src/channel-usbredir.c
@@ -128,6 +128,7 @@ static void
_channel_reset_finish(SpiceUsbredirChannel *channel)
spice_usbredir_channel_lock(channel);
+ sleep(1);
usbredirhost_close(priv->host);
priv->host = NULL;
On Fri, May 11, 2018 at 12:27 AM, Jonathon Jongsma
<jjongsma at redhat.com> wrote:
> On Mon, 2018-05-07 at 17:02 +0800, Qiu Wenbo wrote:
>> This reverts commit 9fbf679453d8dbfe797a738cb536136599d7adab.
>>
>> In some cases, remote-viewer will exit before the async function run
>> in
>> another thread finish and USB devices redirected to the VM will not
>> "pop up" to
>> operation system. For example, a USB disk should be auto mounted
>> when remote-viewer exit.
>
> Do you have a reliable way to reproduce this situation?
>
>
>>
>> Signed-off-by: Qiu Wenbo <qiuwenbo at kylinos.com.cn>
>> ---
>> src/channel-usbredir.c | 48 ++++++--------------------------------
>> ----
>> 1 file changed, 7 insertions(+), 41 deletions(-)
>>
>> diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c
>> index 0cc5630..34c4679 100644
>> --- a/src/channel-usbredir.c
>> +++ b/src/channel-usbredir.c
>> @@ -121,54 +121,20 @@ static void
>> spice_usbredir_channel_init(SpiceUsbredirChannel *channel)
>> }
>>
>> #ifdef USE_USBREDIR
>> -
>> -static void _channel_reset_finish(SpiceUsbredirChannel *channel)
>> -{
>> - SpiceUsbredirChannelPrivate *priv = channel->priv;
>> -
>> - spice_usbredir_channel_lock(channel);
>> -
>> - usbredirhost_close(priv->host);
>> - priv->host = NULL;
>> -
>> - /* Call set_context to re-create the host */
>> - spice_usbredir_channel_set_context(channel, priv->context);
>> -
>> - spice_usbredir_channel_unlock(channel);
>> -}
>> -
>> -static void _channel_reset_cb(GObject *gobject,
>> - GAsyncResult *result,
>> - gpointer user_data)
>> -{
>> - SpiceChannel *spice_channel = SPICE_CHANNEL(gobject);
>> - SpiceUsbredirChannel *channel =
>> SPICE_USBREDIR_CHANNEL(spice_channel);
>> - gboolean migrating = GPOINTER_TO_UINT(user_data);
>> - GError *err = NULL;
>> -
>> - _channel_reset_finish(channel);
>> -
>> - SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)-
>> >channel_reset(spice_channel, migrating);
>> -
>> - spice_usbredir_channel_disconnect_device_finish(channel,
>> result,
>> &err);
>> - g_object_unref(result);
>> -}
>> -
>> static void spice_usbredir_channel_reset(SpiceChannel *c, gboolean
>> migrating)
>> {
>> SpiceUsbredirChannel *channel = SPICE_USBREDIR_CHANNEL(c);
>> SpiceUsbredirChannelPrivate *priv = channel->priv;
>>
>> if (priv->host) {
>> - if (priv->state == STATE_CONNECTED) {
>> - spice_usbredir_channel_disconnect_device_async(channel,
>> NULL,
>> - _channel_reset_cb, GUINT_TO_POINTER(migrating));
>> - } else {
>> - _channel_reset_finish(channel);
>> - }
>> - } else {
>> - SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)-
>> >channel_reset(c, migrating);
>> + if (priv->state == STATE_CONNECTED)
>> + spice_usbredir_channel_disconnect_device(channel);
>> + usbredirhost_close(priv->host);
>> + priv->host = NULL;
>> + /* Call set_context to re-create the host */
>> + spice_usbredir_channel_set_context(channel, priv->context);
>> }
>> + SPICE_CHANNEL_CLASS(spice_usbredir_channel_parent_class)-
>> >channel_reset(c, migrating);
>> }
>> #endif
>>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/spice-devel/attachments/20180512/a5306544/attachment-0001.html>
More information about the Spice-devel
mailing list