[Spice-devel] [spice-gtk PATCH v1] spice-channel: check message queue length
Marc-André Lureau
mlureau at redhat.com
Mon Oct 5 08:24:40 PDT 2015
(adding Hans in CC)
----- Original Message -----
> When channel wants to send much more data then the wire can handle, the
> queue grows fast. This patch does not limit the queue growth but
> introduces an internal API to check if queue length is too big.
>
> In the case of usbredir, video devices on high latency can easily
> trigger this situation.
>
> An easy way to test locally is sharing and webcam and simulating high
> latency with tc:
> tc qdisc add dev lo root netem delay 100ms
> tc qdisc change dev lo root netem delay 150ms
> tc qdisc del dev lo root netem
>
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1264156
> ---
> src/channel-usbredir.c | 7 +++++++
> src/spice-channel-priv.h | 1 +
> src/spice-channel.c | 9 +++++++++
> 3 files changed, 17 insertions(+)
>
> diff --git a/src/channel-usbredir.c b/src/channel-usbredir.c
> index 89f5c9d..fb7bd07 100644
> --- a/src/channel-usbredir.c
> +++ b/src/channel-usbredir.c
> @@ -475,6 +475,13 @@ static void usbredir_write_flush_callback(void
> *user_data)
> if (!priv->host)
> return;
>
> + if (spice_channel_has_full_queue (SPICE_CHANNEL(channel))) {
> + g_warning ("device %04x:%04x is loosing data due high traffic",
> + spice_usb_device_get_vid(priv->spice_device),
> + spice_usb_device_get_pid(priv->spice_device));
> + return;
> + }
> +
> usbredirhost_write_guest_data(priv->host);
> }
>
> diff --git a/src/spice-channel-priv.h b/src/spice-channel-priv.h
> index 436a521..709e032 100644
> --- a/src/spice-channel-priv.h
> +++ b/src/spice-channel-priv.h
> @@ -171,6 +171,7 @@ void spice_channel_wakeup(SpiceChannel *channel, gboolean
> cancel);
>
> SpiceSession* spice_channel_get_session(SpiceChannel *channel);
> enum spice_channel_state spice_channel_get_state(SpiceChannel *channel);
> +gboolean spice_channel_has_full_queue (SpiceChannel *channel);
>
> /* coroutine context */
> typedef void (*handler_msg_in)(SpiceChannel *channel, SpiceMsgIn *msg,
> gpointer data);
> diff --git a/src/spice-channel.c b/src/spice-channel.c
> index 2ce52c7..0195bda 100644
> --- a/src/spice-channel.c
> +++ b/src/spice-channel.c
> @@ -56,6 +56,8 @@ static void spice_channel_reset_capabilities(SpiceChannel
> *channel);
> static void spice_channel_send_migration_handshake(SpiceChannel *channel);
> static gboolean channel_connect(SpiceChannel *channel, gboolean tls);
>
> +#define QUEUE_MAX_LENGTH 500
> +
> /**
> * SECTION:spice-channel
> * @short_description: the base channel class
> @@ -2814,6 +2816,13 @@ enum spice_channel_state
> spice_channel_get_state(SpiceChannel *channel)
> }
>
> G_GNUC_INTERNAL
> +gboolean spice_channel_has_full_queue (SpiceChannel *channel)
> +{
> + SpiceChannelPrivate *c = channel->priv;
> + return (g_queue_get_length (&c->xmit_queue) > QUEUE_MAX_LENGTH);
> +}
> +
> +G_GNUC_INTERNAL
> void spice_channel_swap(SpiceChannel *channel, SpiceChannel *swap, gboolean
> swap_msgs)
> {
> SpiceChannelPrivate *c = channel->priv;
> --
> 2.4.3
>
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
>
More information about the Spice-devel
mailing list