All of lore.kernel.org
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches v3
@ 2013-03-28 13:28 Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested Hans de Goede
                   ` (6 more replies)
  0 siblings, 7 replies; 16+ messages in thread
From: Hans de Goede @ 2013-03-28 13:28 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Amit Shah, Hans de Goede, qemu-devel

I think you may already have these in a local branch, but since I've not
yet seen a pull request for them, here is another resend.

Here is v3 of the series adding watch support to the spicevmc chardev backend
and flowcontrol support to the usb-redir device. It also includes a few
virtio-consoled bugfixes which were found during the development of this
series.

Changes in v2:
-Address Amit's review of "[PATCH 2/8] virtio-console: Remove any pending 
watches on close"
-Drop 2 spice-qemu-char cleanup patches as Gerd has added them to his v5 series
-Add a (forward ported) patch from Alon Levy to fix a long standing
 spice-qemu-char migration issue in a way which should be acceptable upstream

Changes in v3:
-Rebased on top of latest master (some trivial manual conflict resolution)
-Dropped Alon's patch for the spice-qemu-char migration issue, this is fixed
 differently in another series which is already par of the latest master
-Add a new patch:
  usb-serial: Remove double call to qemu_chr_add_handlers( NULL )
-Fixed a checkpatch issue in:
  usb-redir: Add flow control support

Regards,

Hans

Alon Levy (1):
  spice-qemu-char: Remove intermediate buffer

Hans de Goede (6):
  virtio-console: Also throttle when less was written then requested
  virtio-console: Remove any pending watches on close
  spice-qemu-char: Remove #ifdef-ed code for old spice-server compat
  spice-qemu-char: Add watch support
  usb-redir: Add flow control support
  usb-serial: Remove double call to qemu_chr_add_handlers( NULL )

 hw/usb/dev-serial.c |   9 -----
 hw/usb/redirect.c   |  33 +++++++++++++++-
 hw/virtio-console.c |  29 ++++++++++++--
 spice-qemu-char.c   | 106 +++++++++++++++++++++++++++++++++-------------------
 4 files changed, 124 insertions(+), 53 deletions(-)

-- 
1.8.1.4

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested
  2013-03-28 13:28 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches v3 Hans de Goede
@ 2013-03-28 13:28 ` Hans de Goede
  2013-03-29  9:31   ` Amit Shah
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close Hans de Goede
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: Hans de Goede @ 2013-03-28 13:28 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Amit Shah, Hans de Goede, qemu-devel

This is necessary so that we get properly woken up to write the rest.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Acked-by: Amit Shah <amit.shah@redhat.com>
---
 hw/virtio-console.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/hw/virtio-console.c b/hw/virtio-console.c
index 284180f..015947c 100644
--- a/hw/virtio-console.c
+++ b/hw/virtio-console.c
@@ -47,7 +47,7 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
     ret = qemu_chr_fe_write(vcon->chr, buf, len);
     trace_virtio_console_flush_buf(port->id, len, ret);
 
-    if (ret <= 0) {
+    if (ret < len) {
         VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
 
         /*
@@ -56,7 +56,8 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
          * we had a finer-grained message, like -EPIPE, we could close
          * this connection.
          */
-        ret = 0;
+        if (ret < 0)
+            ret = 0;
         if (!k->is_console) {
             virtio_serial_throttle_port(port, true);
             qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, chr_write_unblocked,
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close
  2013-03-28 13:28 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches v3 Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested Hans de Goede
@ 2013-03-28 13:28 ` Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 3/7] spice-qemu-char: Remove #ifdef-ed code for old spice-server compat Hans de Goede
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Hans de Goede @ 2013-03-28 13:28 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Amit Shah, Hans de Goede, qemu-devel

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 hw/virtio-console.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/hw/virtio-console.c b/hw/virtio-console.c
index 015947c..e28c54f 100644
--- a/hw/virtio-console.c
+++ b/hw/virtio-console.c
@@ -18,6 +18,7 @@
 typedef struct VirtConsole {
     VirtIOSerialPort port;
     CharDriverState *chr;
+    guint watch;
 } VirtConsole;
 
 /*
@@ -29,6 +30,7 @@ static gboolean chr_write_unblocked(GIOChannel *chan, GIOCondition cond,
 {
     VirtConsole *vcon = opaque;
 
+    vcon->watch = 0;
     virtio_serial_throttle_port(&vcon->port, false);
     return FALSE;
 }
@@ -60,8 +62,10 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
             ret = 0;
         if (!k->is_console) {
             virtio_serial_throttle_port(port, true);
-            qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, chr_write_unblocked,
-                                  vcon);
+            if (!vcon->watch) {
+                vcon->watch = qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT,
+                                                    chr_write_unblocked, vcon);
+            }
         }
     }
     return ret;
@@ -105,6 +109,10 @@ static void chr_event(void *opaque, int event)
         virtio_serial_open(&vcon->port);
         break;
     case CHR_EVENT_CLOSED:
+        if (vcon->watch) {
+            g_source_remove(vcon->watch);
+            vcon->watch = 0;
+        }
         virtio_serial_close(&vcon->port);
         break;
     }
@@ -129,6 +137,17 @@ static int virtconsole_initfn(VirtIOSerialPort *port)
     return 0;
 }
 
+static int virtconsole_exitfn(VirtIOSerialPort *port)
+{
+    VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
+
+    if (vcon->watch) {
+        g_source_remove(vcon->watch);
+    }
+
+    return 0;
+}
+
 static Property virtconsole_properties[] = {
     DEFINE_PROP_CHR("chardev", VirtConsole, chr),
     DEFINE_PROP_END_OF_LIST(),
@@ -141,6 +160,7 @@ static void virtconsole_class_init(ObjectClass *klass, void *data)
 
     k->is_console = true;
     k->init = virtconsole_initfn;
+    k->exit = virtconsole_exitfn;
     k->have_data = flush_buf;
     k->set_guest_connected = set_guest_connected;
     dc->props = virtconsole_properties;
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH 3/7] spice-qemu-char: Remove #ifdef-ed code for old spice-server compat
  2013-03-28 13:28 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches v3 Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close Hans de Goede
@ 2013-03-28 13:28 ` Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 4/7] spice-qemu-char: Add watch support Hans de Goede
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Hans de Goede @ 2013-03-28 13:28 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Amit Shah, Hans de Goede, qemu-devel

We now require spice-server to be >= 0.12.0 so this is no longer needed.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 spice-qemu-char.c | 27 +--------------------------
 1 file changed, 1 insertion(+), 26 deletions(-)

diff --git a/spice-qemu-char.c b/spice-qemu-char.c
index 535f955..c4f81cf 100644
--- a/spice-qemu-char.c
+++ b/spice-qemu-char.c
@@ -85,21 +85,6 @@ static void vmc_state(SpiceCharDeviceInstance *sin, int connected)
 {
     SpiceCharDriver *scd = container_of(sin, SpiceCharDriver, sin);
 
-#if SPICE_SERVER_VERSION < 0x000901
-    /*
-     * spice-server calls the state callback for the agent channel when the
-     * spice client connects / disconnects. Given that not the client but
-     * the server is doing the parsing of the messages this is wrong as the
-     * server is still listening. Worse, this causes the parser in the server
-     * to go out of sync, so we ignore state calls for subtype vdagent
-     * spicevmc chardevs. For the full story see:
-     * http://lists.freedesktop.org/archives/spice-devel/2011-July/004837.html
-     */
-    if (strcmp(sin->subtype, "vdagent") == 0) {
-        return;
-    }
-#endif
-
     if ((scd->chr->be_open && connected) ||
         (!scd->chr->be_open && !connected)) {
         return;
@@ -224,7 +209,6 @@ static CharDriverState *chr_open(const char *subtype)
 
 CharDriverState *qemu_chr_open_spice_vmc(const char *type)
 {
-    CharDriverState *chr;
     const char **psubtype = spice_server_char_device_recognized_subtypes();
 
     if (type == NULL) {
@@ -243,16 +227,7 @@ CharDriverState *qemu_chr_open_spice_vmc(const char *type)
         return NULL;
     }
 
-    chr = chr_open(type);
-
-#if SPICE_SERVER_VERSION < 0x000901
-    /* See comment in vmc_state() */
-    if (strcmp(type, "vdagent") == 0) {
-        qemu_chr_generic_open(chr);
-    }
-#endif
-
-    return chr;
+    return chr_open(type);
 }
 
 #if SPICE_SERVER_VERSION >= 0x000c02
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH 4/7] spice-qemu-char: Add watch support
  2013-03-28 13:28 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches v3 Hans de Goede
                   ` (2 preceding siblings ...)
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 3/7] spice-qemu-char: Remove #ifdef-ed code for old spice-server compat Hans de Goede
@ 2013-03-28 13:28 ` Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 5/7] spice-qemu-char: Remove intermediate buffer Hans de Goede
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 16+ messages in thread
From: Hans de Goede @ 2013-03-28 13:28 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Amit Shah, Hans de Goede, qemu-devel

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 spice-qemu-char.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++----
 1 file changed, 63 insertions(+), 4 deletions(-)

diff --git a/spice-qemu-char.c b/spice-qemu-char.c
index c4f81cf..097a8c8 100644
--- a/spice-qemu-char.c
+++ b/spice-qemu-char.c
@@ -13,12 +13,18 @@ typedef struct SpiceCharDriver {
     SpiceCharDeviceInstance     sin;
     char                  *subtype;
     bool                  active;
+    bool                  blocked;
     uint8_t               *buffer;
     uint8_t               *datapos;
     ssize_t               bufsize, datalen;
     QLIST_ENTRY(SpiceCharDriver) next;
 } SpiceCharDriver;
 
+typedef struct SpiceCharSource {
+    GSource               source;
+    SpiceCharDriver       *scd;
+} SpiceCharSource;
+
 static QLIST_HEAD(, SpiceCharDriver) spice_chars =
     QLIST_HEAD_INITIALIZER(spice_chars);
 
@@ -54,9 +60,10 @@ static int vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len)
         scd->datapos += bytes;
         scd->datalen -= bytes;
         assert(scd->datalen >= 0);
-        if (scd->datalen == 0) {
-            scd->datapos = 0;
-        }
+    }
+    if (scd->datalen == 0) {
+        scd->datapos = 0;
+        scd->blocked = false;
     }
     trace_spice_vmc_read(bytes, len);
     return bytes;
@@ -129,10 +136,54 @@ static void vmc_unregister_interface(SpiceCharDriver *scd)
     trace_spice_vmc_unregister_interface(scd);
 }
 
+static gboolean spice_char_source_prepare(GSource *source, gint *timeout)
+{
+    SpiceCharSource *src = (SpiceCharSource *)source;
+
+    *timeout = -1;
+
+    return !src->scd->blocked;
+}
+
+static gboolean spice_char_source_check(GSource *source)
+{
+    SpiceCharSource *src = (SpiceCharSource *)source;
+
+    return !src->scd->blocked;
+}
+
+static gboolean spice_char_source_dispatch(GSource *source,
+    GSourceFunc callback, gpointer user_data)
+{
+    GIOFunc func = (GIOFunc)callback;
+
+    return func(NULL, G_IO_OUT, user_data);
+}
+
+GSourceFuncs SpiceCharSourceFuncs = {
+    .prepare  = spice_char_source_prepare,
+    .check    = spice_char_source_check,
+    .dispatch = spice_char_source_dispatch,
+};
+
+static GSource *spice_chr_add_watch(CharDriverState *chr, GIOCondition cond)
+{
+    SpiceCharDriver *scd = chr->opaque;
+    SpiceCharSource *src;
+
+    assert(cond == G_IO_OUT);
+
+    src = (SpiceCharSource *)g_source_new(&SpiceCharSourceFuncs,
+                                          sizeof(SpiceCharSource));
+    src->scd = scd;
+
+    return (GSource *)src;
+}
 
 static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
 {
     SpiceCharDriver *s = chr->opaque;
+    int read_bytes;
 
     assert(s->datalen == 0);
     if (s->bufsize < len) {
@@ -143,7 +194,14 @@ static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
     s->datapos = s->buffer;
     s->datalen = len;
     spice_server_char_device_wakeup(&s->sin);
-    return len;
+    read_bytes = len - s->datalen;
+    if (read_bytes != len) {
+        /* We'll get passed in the unconsumed data with the next call */
+        s->datalen = 0;
+        s->datapos = NULL;
+        s->blocked = true;
+    }
+    return read_bytes;
 }
 
 static void spice_chr_close(struct CharDriverState *chr)
@@ -199,6 +257,7 @@ static CharDriverState *chr_open(const char *subtype)
     s->sin.subtype = g_strdup(subtype);
     chr->opaque = s;
     chr->chr_write = spice_chr_write;
+    chr->chr_add_watch = spice_chr_add_watch;
     chr->chr_close = spice_chr_close;
     chr->chr_set_fe_open = spice_chr_set_fe_open;
 
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH 5/7] spice-qemu-char: Remove intermediate buffer
  2013-03-28 13:28 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches v3 Hans de Goede
                   ` (3 preceding siblings ...)
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 4/7] spice-qemu-char: Add watch support Hans de Goede
@ 2013-03-28 13:28 ` Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 6/7] usb-redir: Add flow control support Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 7/7] usb-serial: Remove double call to qemu_chr_add_handlers( NULL ) Hans de Goede
  6 siblings, 0 replies; 16+ messages in thread
From: Hans de Goede @ 2013-03-28 13:28 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Amit Shah, Hans de Goede, Alon Levy, qemu-devel

From: Alon Levy <alevy@redhat.com>

virtio-serial's buffer is valid when it calls us, and we don't
access it otherwise: vmc_read is only called in response to wakeup,
or else we set datalen=0 and throttle. Then vmc_read is called back,
we return 0 (not accessing the buffer) and set the timer to unthrottle.

Also make datalen int and not ssize_t (to fit spice_chr_write signature).

HdG: Update to apply to spice-qemu-char with new gio-channel based
flowcontrol support.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 spice-qemu-char.c | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/spice-qemu-char.c b/spice-qemu-char.c
index 097a8c8..7e6bd2d 100644
--- a/spice-qemu-char.c
+++ b/spice-qemu-char.c
@@ -14,9 +14,8 @@ typedef struct SpiceCharDriver {
     char                  *subtype;
     bool                  active;
     bool                  blocked;
-    uint8_t               *buffer;
-    uint8_t               *datapos;
-    ssize_t               bufsize, datalen;
+    const uint8_t         *datapos;
+    int                   datalen;
     QLIST_ENTRY(SpiceCharDriver) next;
 } SpiceCharDriver;
 
@@ -186,12 +185,7 @@ static int spice_chr_write(CharDriverState *chr, const uint8_t *buf, int len)
     int read_bytes;
 
     assert(s->datalen == 0);
-    if (s->bufsize < len) {
-        s->bufsize = len;
-        s->buffer = g_realloc(s->buffer, s->bufsize);
-    }
-    memcpy(s->buffer, buf, len);
-    s->datapos = s->buffer;
+    s->datapos = buf;
     s->datalen = len;
     spice_server_char_device_wakeup(&s->sin);
     read_bytes = len - s->datalen;
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH 6/7] usb-redir: Add flow control support
  2013-03-28 13:28 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches v3 Hans de Goede
                   ` (4 preceding siblings ...)
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 5/7] spice-qemu-char: Remove intermediate buffer Hans de Goede
@ 2013-03-28 13:28 ` Hans de Goede
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 7/7] usb-serial: Remove double call to qemu_chr_add_handlers( NULL ) Hans de Goede
  6 siblings, 0 replies; 16+ messages in thread
From: Hans de Goede @ 2013-03-28 13:28 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Amit Shah, Hans de Goede, qemu-devel

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 hw/usb/redirect.c | 33 ++++++++++++++++++++++++++++++++-
 1 file changed, 32 insertions(+), 1 deletion(-)

diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c
index d02a7b9..df682d1 100644
--- a/hw/usb/redirect.c
+++ b/hw/usb/redirect.c
@@ -104,6 +104,8 @@ struct USBRedirDevice {
     /* Data passed from chardev the fd_read cb to the usbredirparser read cb */
     const uint8_t *read_buf;
     int read_buf_size;
+    /* Active chardev-watch-tag */
+    guint watch;
     /* For async handling of close */
     QEMUBH *chardev_close_bh;
     /* To delay the usb attach in case of quick chardev close + open */
@@ -254,9 +256,21 @@ static int usbredir_read(void *priv, uint8_t *data, int count)
     return count;
 }
 
+static gboolean usbredir_write_unblocked(GIOChannel *chan, GIOCondition cond,
+                                         void *opaque)
+{
+    USBRedirDevice *dev = opaque;
+
+    dev->watch = 0;
+    usbredirparser_do_write(dev->parser);
+
+    return FALSE;
+}
+
 static int usbredir_write(void *priv, uint8_t *data, int count)
 {
     USBRedirDevice *dev = priv;
+    int r;
 
     if (!dev->cs->be_open) {
         return 0;
@@ -267,7 +281,17 @@ static int usbredir_write(void *priv, uint8_t *data, int count)
         return 0;
     }
 
-    return qemu_chr_fe_write(dev->cs, data, count);
+    r = qemu_chr_fe_write(dev->cs, data, count);
+    if (r < count) {
+        if (!dev->watch) {
+            dev->watch = qemu_chr_fe_add_watch(dev->cs, G_IO_OUT,
+                                               usbredir_write_unblocked, dev);
+        }
+        if (r < 0) {
+            r = 0;
+        }
+    }
+    return r;
 }
 
 /*
@@ -1085,6 +1109,10 @@ static void usbredir_chardev_close_bh(void *opaque)
         usbredirparser_destroy(dev->parser);
         dev->parser = NULL;
     }
+    if (dev->watch) {
+        g_source_remove(dev->watch);
+        dev->watch = 0;
+    }
 }
 
 static void usbredir_create_parser(USBRedirDevice *dev)
@@ -1317,6 +1345,9 @@ static void usbredir_handle_destroy(USBDevice *udev)
     if (dev->parser) {
         usbredirparser_destroy(dev->parser);
     }
+    if (dev->watch) {
+        g_source_remove(dev->watch);
+    }
 
     free(dev->filter_rules);
 }
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH 7/7] usb-serial: Remove double call to qemu_chr_add_handlers( NULL )
  2013-03-28 13:28 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches v3 Hans de Goede
                   ` (5 preceding siblings ...)
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 6/7] usb-redir: Add flow control support Hans de Goede
@ 2013-03-28 13:28 ` Hans de Goede
  6 siblings, 0 replies; 16+ messages in thread
From: Hans de Goede @ 2013-03-28 13:28 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Amit Shah, Hans de Goede, qemu-devel

usb-serial has a qdev chardev property, and hw/qdev-properties-system.c
already contains:

static void release_chr(Object *obj, const char *name, void *opaque)
{
    DeviceState *dev = DEVICE(obj);
    Property *prop = opaque;
    CharDriverState **ptr = qdev_get_prop_ptr(dev, prop);

    if (*ptr) {
        qemu_chr_add_handlers(*ptr, NULL, NULL, NULL, NULL);
    }
}

So doing the qemu_chr_add_handlers(s->cs, NULL, NULL, NULL, NULL); from
the usb handle_destroy function too will lead to it being done twice, which
will result in a wrong value for cs->avail_connections.

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 hw/usb/dev-serial.c | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c
index 7c314dc..21ddef6 100644
--- a/hw/usb/dev-serial.c
+++ b/hw/usb/dev-serial.c
@@ -410,13 +410,6 @@ static void usb_serial_handle_data(USBDevice *dev, USBPacket *p)
     }
 }
 
-static void usb_serial_handle_destroy(USBDevice *dev)
-{
-    USBSerialState *s = (USBSerialState *)dev;
-
-    qemu_chr_add_handlers(s->cs, NULL, NULL, NULL, NULL);
-}
-
 static int usb_serial_can_read(void *opaque)
 {
     USBSerialState *s = opaque;
@@ -595,7 +588,6 @@ static void usb_serial_class_initfn(ObjectClass *klass, void *data)
     uc->handle_reset   = usb_serial_handle_reset;
     uc->handle_control = usb_serial_handle_control;
     uc->handle_data    = usb_serial_handle_data;
-    uc->handle_destroy = usb_serial_handle_destroy;
     dc->vmsd = &vmstate_usb_serial;
     dc->props = serial_properties;
 }
@@ -623,7 +615,6 @@ static void usb_braille_class_initfn(ObjectClass *klass, void *data)
     uc->handle_reset   = usb_serial_handle_reset;
     uc->handle_control = usb_serial_handle_control;
     uc->handle_data    = usb_serial_handle_data;
-    uc->handle_destroy = usb_serial_handle_destroy;
     dc->vmsd = &vmstate_usb_serial;
     dc->props = braille_properties;
 }
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested
  2013-03-28 13:28 ` [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested Hans de Goede
@ 2013-03-29  9:31   ` Amit Shah
  2013-04-01 16:00     ` Hans de Goede
  0 siblings, 1 reply; 16+ messages in thread
From: Amit Shah @ 2013-03-29  9:31 UTC (permalink / raw)
  To: Hans de Goede; +Cc: Gerd Hoffmann, qemu-devel

On (Thu) 28 Mar 2013 [14:28:11], Hans de Goede wrote:
> This is necessary so that we get properly woken up to write the rest.
> 
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> Acked-by: Amit Shah <amit.shah@redhat.com>
> ---
>  hw/virtio-console.c | 5 +++--
>  1 file changed, 3 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/virtio-console.c b/hw/virtio-console.c
> index 284180f..015947c 100644
> --- a/hw/virtio-console.c
> +++ b/hw/virtio-console.c
> @@ -47,7 +47,7 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
>      ret = qemu_chr_fe_write(vcon->chr, buf, len);
>      trace_virtio_console_flush_buf(port->id, len, ret);
>  
> -    if (ret <= 0) {
> +    if (ret < len) {

Oops, there's a conversion bug here: len is size_t, and ret is
ssize_t.  Both need to be the same type.

Since we're not returning negative, ret should be changed to size_t.
The function signature changes too, but that's alright.

>          VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
>  
>          /*
> @@ -56,7 +56,8 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
>           * we had a finer-grained message, like -EPIPE, we could close
>           * this connection.
>           */
> -        ret = 0;
> +        if (ret < 0)
> +            ret = 0;

And there need to be braces here.

		Amit

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested
  2013-03-29  9:31   ` Amit Shah
@ 2013-04-01 16:00     ` Hans de Goede
  2013-04-02 10:40       ` Amit Shah
  0 siblings, 1 reply; 16+ messages in thread
From: Hans de Goede @ 2013-04-01 16:00 UTC (permalink / raw)
  To: Amit Shah; +Cc: Gerd Hoffmann, qemu-devel

Hi,

On 03/29/2013 10:31 AM, Amit Shah wrote:
> On (Thu) 28 Mar 2013 [14:28:11], Hans de Goede wrote:
>> This is necessary so that we get properly woken up to write the rest.
>>
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> Acked-by: Amit Shah <amit.shah@redhat.com>
>> ---
>>   hw/virtio-console.c | 5 +++--
>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/virtio-console.c b/hw/virtio-console.c
>> index 284180f..015947c 100644
>> --- a/hw/virtio-console.c
>> +++ b/hw/virtio-console.c
>> @@ -47,7 +47,7 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
>>       ret = qemu_chr_fe_write(vcon->chr, buf, len);
>>       trace_virtio_console_flush_buf(port->id, len, ret);
>>
>> -    if (ret <= 0) {
>> +    if (ret < len) {
>
> Oops, there's a conversion bug here: len is size_t, and ret is
> ssize_t.  Both need to be the same type.
>
> Since we're not returning negative, ret should be changed to size_t.
> The function signature changes too, but that's alright.

Erm changing ret to a size_t will break things, since qemu_chr_fe_write can
return < 0 and storing that into an unsigned will change it into a very
large value instead ...

A better fix would be to change len to ssize_t. Although that will cause
issues if we ever get a single buf which is larger then 2^31 - 1. Note
we already have that problem since qemu_chr_fe_write already cannot handle
such large buffers...


>
>>           VirtIOSerialPortClass *k = VIRTIO_SERIAL_PORT_GET_CLASS(port);
>>
>>           /*
>> @@ -56,7 +56,8 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
>>            * we had a finer-grained message, like -EPIPE, we could close
>>            * this connection.
>>            */
>> -        ret = 0;
>> +        if (ret < 0)
>> +            ret = 0;
>
> And there need to be braces here.

Ack.

Regards,

Hans

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested
  2013-04-01 16:00     ` Hans de Goede
@ 2013-04-02 10:40       ` Amit Shah
  2013-04-02 17:32         ` Hans de Goede
  0 siblings, 1 reply; 16+ messages in thread
From: Amit Shah @ 2013-04-02 10:40 UTC (permalink / raw)
  To: Hans de Goede; +Cc: Gerd Hoffmann, qemu-devel

On (Mon) 01 Apr 2013 [18:00:55], Hans de Goede wrote:
> Hi,
> 
> On 03/29/2013 10:31 AM, Amit Shah wrote:
> >On (Thu) 28 Mar 2013 [14:28:11], Hans de Goede wrote:
> >>This is necessary so that we get properly woken up to write the rest.
> >>
> >>Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> >>Acked-by: Amit Shah <amit.shah@redhat.com>
> >>---
> >>  hw/virtio-console.c | 5 +++--
> >>  1 file changed, 3 insertions(+), 2 deletions(-)
> >>
> >>diff --git a/hw/virtio-console.c b/hw/virtio-console.c
> >>index 284180f..015947c 100644
> >>--- a/hw/virtio-console.c
> >>+++ b/hw/virtio-console.c
> >>@@ -47,7 +47,7 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
> >>      ret = qemu_chr_fe_write(vcon->chr, buf, len);
> >>      trace_virtio_console_flush_buf(port->id, len, ret);
> >>
> >>-    if (ret <= 0) {
> >>+    if (ret < len) {
> >
> >Oops, there's a conversion bug here: len is size_t, and ret is
> >ssize_t.  Both need to be the same type.
> >
> >Since we're not returning negative, ret should be changed to size_t.
> >The function signature changes too, but that's alright.
> 
> Erm changing ret to a size_t will break things, since qemu_chr_fe_write can
> return < 0 and storing that into an unsigned will change it into a very
> large value instead ...

Oh, definitely.  I meant changing the return type of flush_buf(), but
that doesn't help matters much...

> A better fix would be to change len to ssize_t. Although that will cause
> issues if we ever get a single buf which is larger then 2^31 - 1. Note
> we already have that problem since qemu_chr_fe_write already cannot handle
> such large buffers...

Yep.  Do you want to do that as part of this series?

		Amit

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested
  2013-04-02 10:40       ` Amit Shah
@ 2013-04-02 17:32         ` Hans de Goede
  0 siblings, 0 replies; 16+ messages in thread
From: Hans de Goede @ 2013-04-02 17:32 UTC (permalink / raw)
  To: Amit Shah; +Cc: Gerd Hoffmann, qemu-devel

Hi,

On 04/02/2013 12:40 PM, Amit Shah wrote:
> On (Mon) 01 Apr 2013 [18:00:55], Hans de Goede wrote:
>> Hi,
>>
>> On 03/29/2013 10:31 AM, Amit Shah wrote:
>>> On (Thu) 28 Mar 2013 [14:28:11], Hans de Goede wrote:
>>>> This is necessary so that we get properly woken up to write the rest.
>>>>
>>>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>>>> Acked-by: Amit Shah <amit.shah@redhat.com>
>>>> ---
>>>>   hw/virtio-console.c | 5 +++--
>>>>   1 file changed, 3 insertions(+), 2 deletions(-)
>>>>
>>>> diff --git a/hw/virtio-console.c b/hw/virtio-console.c
>>>> index 284180f..015947c 100644
>>>> --- a/hw/virtio-console.c
>>>> +++ b/hw/virtio-console.c
>>>> @@ -47,7 +47,7 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
>>>>       ret = qemu_chr_fe_write(vcon->chr, buf, len);
>>>>       trace_virtio_console_flush_buf(port->id, len, ret);
>>>>
>>>> -    if (ret <= 0) {
>>>> +    if (ret < len) {
>>>
>>> Oops, there's a conversion bug here: len is size_t, and ret is
>>> ssize_t.  Both need to be the same type.
>>>
>>> Since we're not returning negative, ret should be changed to size_t.
>>> The function signature changes too, but that's alright.
>>
>> Erm changing ret to a size_t will break things, since qemu_chr_fe_write can
>> return < 0 and storing that into an unsigned will change it into a very
>> large value instead ...
>
> Oh, definitely.  I meant changing the return type of flush_buf(), but
> that doesn't help matters much...
>
>> A better fix would be to change len to ssize_t. Although that will cause
>> issues if we ever get a single buf which is larger then 2^31 - 1. Note
>> we already have that problem since qemu_chr_fe_write already cannot handle
>> such large buffers...
>
> Yep.  Do you want to do that as part of this series?

Yes, I'll send a v2 of this patch incorporating the change for Gerd to
pick up.

Regards,

Hans

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close
  2013-04-05  9:30 [Qemu-devel] [PATCH 0/7] usb-redir chardev flowcontrol patches v4 Hans de Goede
@ 2013-04-05  9:30 ` Hans de Goede
  0 siblings, 0 replies; 16+ messages in thread
From: Hans de Goede @ 2013-04-05  9:30 UTC (permalink / raw)
  To: Gerd Hoffmann; +Cc: Hans de Goede, qemu-devel

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 hw/virtio-console.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

diff --git a/hw/virtio-console.c b/hw/virtio-console.c
index 61f9ff5..908ec17 100644
--- a/hw/virtio-console.c
+++ b/hw/virtio-console.c
@@ -18,6 +18,7 @@
 typedef struct VirtConsole {
     VirtIOSerialPort port;
     CharDriverState *chr;
+    guint watch;
 } VirtConsole;
 
 /*
@@ -29,6 +30,7 @@ static gboolean chr_write_unblocked(GIOChannel *chan, GIOCondition cond,
 {
     VirtConsole *vcon = opaque;
 
+    vcon->watch = 0;
     virtio_serial_throttle_port(&vcon->port, false);
     return FALSE;
 }
@@ -61,8 +63,10 @@ static ssize_t flush_buf(VirtIOSerialPort *port,
             ret = 0;
         if (!k->is_console) {
             virtio_serial_throttle_port(port, true);
-            qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, chr_write_unblocked,
-                                  vcon);
+            if (!vcon->watch) {
+                vcon->watch = qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT,
+                                                    chr_write_unblocked, vcon);
+            }
         }
     }
     return ret;
@@ -106,6 +110,10 @@ static void chr_event(void *opaque, int event)
         virtio_serial_open(&vcon->port);
         break;
     case CHR_EVENT_CLOSED:
+        if (vcon->watch) {
+            g_source_remove(vcon->watch);
+            vcon->watch = 0;
+        }
         virtio_serial_close(&vcon->port);
         break;
     }
@@ -130,6 +138,17 @@ static int virtconsole_initfn(VirtIOSerialPort *port)
     return 0;
 }
 
+static int virtconsole_exitfn(VirtIOSerialPort *port)
+{
+    VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
+
+    if (vcon->watch) {
+        g_source_remove(vcon->watch);
+    }
+
+    return 0;
+}
+
 static Property virtconsole_properties[] = {
     DEFINE_PROP_CHR("chardev", VirtConsole, chr),
     DEFINE_PROP_END_OF_LIST(),
@@ -142,6 +161,7 @@ static void virtconsole_class_init(ObjectClass *klass, void *data)
 
     k->is_console = true;
     k->init = virtconsole_initfn;
+    k->exit = virtconsole_exitfn;
     k->have_data = flush_buf;
     k->set_guest_connected = set_guest_connected;
     dc->props = virtconsole_properties;
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close
  2013-03-14  7:35   ` Amit Shah
@ 2013-03-14 13:32     ` Hans de Goede
  0 siblings, 0 replies; 16+ messages in thread
From: Hans de Goede @ 2013-03-14 13:32 UTC (permalink / raw)
  To: Amit Shah; +Cc: Marc-André Lureau, qemu-devel, Gerd Hoffmann

Hi,

On 03/14/2013 08:35 AM, Amit Shah wrote:
> On (Wed) 13 Mar 2013 [14:59:42], Hans de Goede wrote:
>> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
>> ---
>>   hw/virtio-console.c | 16 ++++++++++++++--
>>   1 file changed, 14 insertions(+), 2 deletions(-)
>>
>> diff --git a/hw/virtio-console.c b/hw/virtio-console.c
>> index 1d87c5b..ec0f91b 100644
>> --- a/hw/virtio-console.c
>> +++ b/hw/virtio-console.c
>> @@ -18,6 +18,7 @@
>>   typedef struct VirtConsole {
>>       VirtIOSerialPort port;
>>       CharDriverState *chr;
>> +    guint watch;
>>   } VirtConsole;
>>
>>   /*
>> @@ -29,6 +30,7 @@ static gboolean chr_write_unblocked(GIOChannel *chan, GIOCondition cond,
>>   {
>>       VirtConsole *vcon = opaque;
>>
>> +    vcon->watch = 0;
>>       virtio_serial_throttle_port(&vcon->port, false);
>>       return FALSE;
>>   }
>> @@ -60,8 +62,10 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
>>               ret = 0;
>>           if (!k->is_console) {
>>               virtio_serial_throttle_port(port, true);
>> -            qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, chr_write_unblocked,
>> -                                  vcon);
>> +            if (!vcon->watch) {
>> +                vcon->watch = qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT,
>> +                                                    chr_write_unblocked, vcon);
>> +            }
>>           }
>>       }
>>       return ret;
>> @@ -86,6 +90,10 @@ static void guest_close(VirtIOSerialPort *port)
>>       if (!vcon->chr) {
>>           return;
>>       }
>> +    if (vcon->watch) {
>> +        g_source_remove(vcon->watch);
>> +        vcon->watch = 0;
>> +    }
>>       qemu_chr_fe_close(vcon->chr);
>>   }
>
> Even if a guest closed the connection, we want the data the guest sent
> before the close to go out.
>
> What's the reason to not do that?

There is no reason, this was a bad attempt by me to deal with closing
the watch on virtio-port hot-unplug. I've removed this in my
local version of the patchset and instead added an exit callback
to deal with virtio-port hot-unplug the proper way.

I still have a few other patches for spice-qemu-char.c I'm working on,
once those are finished, I'll resend the series with this fixed and
rebased on top of Gerd Hoffman's chardev.v5 tree.

Regards,

Hans

^ permalink raw reply	[flat|nested] 16+ messages in thread

* Re: [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close
  2013-03-13 13:59 ` [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close Hans de Goede
@ 2013-03-14  7:35   ` Amit Shah
  2013-03-14 13:32     ` Hans de Goede
  0 siblings, 1 reply; 16+ messages in thread
From: Amit Shah @ 2013-03-14  7:35 UTC (permalink / raw)
  To: Hans de Goede; +Cc: Marc-André Lureau, qemu-devel, Gerd Hoffmann

On (Wed) 13 Mar 2013 [14:59:42], Hans de Goede wrote:
> Signed-off-by: Hans de Goede <hdegoede@redhat.com>
> ---
>  hw/virtio-console.c | 16 ++++++++++++++--
>  1 file changed, 14 insertions(+), 2 deletions(-)
> 
> diff --git a/hw/virtio-console.c b/hw/virtio-console.c
> index 1d87c5b..ec0f91b 100644
> --- a/hw/virtio-console.c
> +++ b/hw/virtio-console.c
> @@ -18,6 +18,7 @@
>  typedef struct VirtConsole {
>      VirtIOSerialPort port;
>      CharDriverState *chr;
> +    guint watch;
>  } VirtConsole;
>  
>  /*
> @@ -29,6 +30,7 @@ static gboolean chr_write_unblocked(GIOChannel *chan, GIOCondition cond,
>  {
>      VirtConsole *vcon = opaque;
>  
> +    vcon->watch = 0;
>      virtio_serial_throttle_port(&vcon->port, false);
>      return FALSE;
>  }
> @@ -60,8 +62,10 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
>              ret = 0;
>          if (!k->is_console) {
>              virtio_serial_throttle_port(port, true);
> -            qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, chr_write_unblocked,
> -                                  vcon);
> +            if (!vcon->watch) {
> +                vcon->watch = qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT,
> +                                                    chr_write_unblocked, vcon);
> +            }
>          }
>      }
>      return ret;
> @@ -86,6 +90,10 @@ static void guest_close(VirtIOSerialPort *port)
>      if (!vcon->chr) {
>          return;
>      }
> +    if (vcon->watch) {
> +        g_source_remove(vcon->watch);
> +        vcon->watch = 0;
> +    }
>      qemu_chr_fe_close(vcon->chr);
>  }

Even if a guest closed the connection, we want the data the guest sent
before the close to go out.

What's the reason to not do that?

> @@ -116,6 +124,10 @@ static void chr_event(void *opaque, int event)
>          virtio_serial_open(&vcon->port);
>          break;
>      case CHR_EVENT_CLOSED:
> +        if (vcon->watch) {
> +            g_source_remove(vcon->watch);
> +            vcon->watch = 0;
> +        }
>          virtio_serial_close(&vcon->port);
>          break;
>      }

Agreed with the rest.


		Amit

^ permalink raw reply	[flat|nested] 16+ messages in thread

* [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close
  2013-03-13 13:59 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches Hans de Goede
@ 2013-03-13 13:59 ` Hans de Goede
  2013-03-14  7:35   ` Amit Shah
  0 siblings, 1 reply; 16+ messages in thread
From: Hans de Goede @ 2013-03-13 13:59 UTC (permalink / raw)
  To: qemu-devel
  Cc: Amit Shah, Hans de Goede, Marc-André Lureau, Gerd Hoffmann

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
 hw/virtio-console.c | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/hw/virtio-console.c b/hw/virtio-console.c
index 1d87c5b..ec0f91b 100644
--- a/hw/virtio-console.c
+++ b/hw/virtio-console.c
@@ -18,6 +18,7 @@
 typedef struct VirtConsole {
     VirtIOSerialPort port;
     CharDriverState *chr;
+    guint watch;
 } VirtConsole;
 
 /*
@@ -29,6 +30,7 @@ static gboolean chr_write_unblocked(GIOChannel *chan, GIOCondition cond,
 {
     VirtConsole *vcon = opaque;
 
+    vcon->watch = 0;
     virtio_serial_throttle_port(&vcon->port, false);
     return FALSE;
 }
@@ -60,8 +62,10 @@ static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
             ret = 0;
         if (!k->is_console) {
             virtio_serial_throttle_port(port, true);
-            qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT, chr_write_unblocked,
-                                  vcon);
+            if (!vcon->watch) {
+                vcon->watch = qemu_chr_fe_add_watch(vcon->chr, G_IO_OUT,
+                                                    chr_write_unblocked, vcon);
+            }
         }
     }
     return ret;
@@ -86,6 +90,10 @@ static void guest_close(VirtIOSerialPort *port)
     if (!vcon->chr) {
         return;
     }
+    if (vcon->watch) {
+        g_source_remove(vcon->watch);
+        vcon->watch = 0;
+    }
     qemu_chr_fe_close(vcon->chr);
 }
 
@@ -116,6 +124,10 @@ static void chr_event(void *opaque, int event)
         virtio_serial_open(&vcon->port);
         break;
     case CHR_EVENT_CLOSED:
+        if (vcon->watch) {
+            g_source_remove(vcon->watch);
+            vcon->watch = 0;
+        }
         virtio_serial_close(&vcon->port);
         break;
     }
-- 
1.8.1.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2013-04-05  9:27 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2013-03-28 13:28 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches v3 Hans de Goede
2013-03-28 13:28 ` [Qemu-devel] [PATCH 1/7] virtio-console: Also throttle when less was written then requested Hans de Goede
2013-03-29  9:31   ` Amit Shah
2013-04-01 16:00     ` Hans de Goede
2013-04-02 10:40       ` Amit Shah
2013-04-02 17:32         ` Hans de Goede
2013-03-28 13:28 ` [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close Hans de Goede
2013-03-28 13:28 ` [Qemu-devel] [PATCH 3/7] spice-qemu-char: Remove #ifdef-ed code for old spice-server compat Hans de Goede
2013-03-28 13:28 ` [Qemu-devel] [PATCH 4/7] spice-qemu-char: Add watch support Hans de Goede
2013-03-28 13:28 ` [Qemu-devel] [PATCH 5/7] spice-qemu-char: Remove intermediate buffer Hans de Goede
2013-03-28 13:28 ` [Qemu-devel] [PATCH 6/7] usb-redir: Add flow control support Hans de Goede
2013-03-28 13:28 ` [Qemu-devel] [PATCH 7/7] usb-serial: Remove double call to qemu_chr_add_handlers( NULL ) Hans de Goede
  -- strict thread matches above, loose matches on Subject: below --
2013-04-05  9:30 [Qemu-devel] [PATCH 0/7] usb-redir chardev flowcontrol patches v4 Hans de Goede
2013-04-05  9:30 ` [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close Hans de Goede
2013-03-13 13:59 [Qemu-devel] [PATCH 0/7] Spice / usb-redir chardev flowcontrol patches Hans de Goede
2013-03-13 13:59 ` [Qemu-devel] [PATCH 2/7] virtio-console: Remove any pending watches on close Hans de Goede
2013-03-14  7:35   ` Amit Shah
2013-03-14 13:32     ` Hans de Goede

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.