aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2013-04-05 11:30:19 +0200
committerGerd Hoffmann <kraxel@redhat.com>2013-04-16 11:52:09 +0200
commitf9fb0532fb0c7155c0616614dc12ecccf93f8afb (patch)
tree589c51095b3708a09fea349c034c5e5acd84b7d5
parent8bb9f51ca243551fb838a3a6a2983016ed2bbb73 (diff)
virtio-console: Also throttle when less was written then requested
This is necessary so that we get properly woken up to write the rest. This patch also changes the len argument to the have_data callback, to avoid doing an unsigned signed comparison. Signed-off-by: Hans de Goede <hdegoede@redhat.com> Acked-by: Amit Shah <amit.shah@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r--hw/char/virtio-console.c8
-rw-r--r--include/hw/virtio/virtio-serial.h2
2 files changed, 6 insertions, 4 deletions
diff --git a/hw/char/virtio-console.c b/hw/char/virtio-console.c
index 50350303cd..061f4bd636 100644
--- a/hw/char/virtio-console.c
+++ b/hw/char/virtio-console.c
@@ -34,7 +34,8 @@ static gboolean chr_write_unblocked(GIOChannel *chan, GIOCondition cond,
}
/* Callback function that's called when the guest sends us data */
-static ssize_t flush_buf(VirtIOSerialPort *port, const uint8_t *buf, size_t len)
+static ssize_t flush_buf(VirtIOSerialPort *port,
+ const uint8_t *buf, ssize_t len)
{
VirtConsole *vcon = DO_UPCAST(VirtConsole, port, port);
ssize_t ret;
@@ -47,7 +48,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 +57,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,
diff --git a/include/hw/virtio/virtio-serial.h b/include/hw/virtio/virtio-serial.h
index 7c71304d10..1d2040b245 100644
--- a/include/hw/virtio/virtio-serial.h
+++ b/include/hw/virtio/virtio-serial.h
@@ -104,7 +104,7 @@ typedef struct VirtIOSerialPortClass {
* 'len'. In this case, throttling will be enabled for this port.
*/
ssize_t (*have_data)(VirtIOSerialPort *port, const uint8_t *buf,
- size_t len);
+ ssize_t len);
} VirtIOSerialPortClass;
/*