summaryrefslogtreecommitdiffstats
path: root/linux-2.6.35.4-virtio_console-fix-poll.patch
diff options
context:
space:
mode:
authorHans de Goede <hdegoede@redhat.com>2010-09-15 17:32:48 +0200
committerHans de Goede <hdegoede@redhat.com>2010-09-15 17:32:48 +0200
commite34bb01b5f209b88f10ac44b5c8c308dc6759753 (patch)
treec15cea6bb44ab6c904c43871dfef329ea1f91ddf /linux-2.6.35.4-virtio_console-fix-poll.patch
parent6d1d3d62c35ee70d2e33dab6e732eaee7439dfca (diff)
downloadkernel-e34bb01b5f209b88f10ac44b5c8c308dc6759753.tar.gz
kernel-e34bb01b5f209b88f10ac44b5c8c308dc6759753.tar.xz
kernel-e34bb01b5f209b88f10ac44b5c8c308dc6759753.zip
- virtio_console: Fix poll/select blocking even though there is data to read
Diffstat (limited to 'linux-2.6.35.4-virtio_console-fix-poll.patch')
-rw-r--r--linux-2.6.35.4-virtio_console-fix-poll.patch29
1 files changed, 29 insertions, 0 deletions
diff --git a/linux-2.6.35.4-virtio_console-fix-poll.patch b/linux-2.6.35.4-virtio_console-fix-poll.patch
new file mode 100644
index 000000000..ff46eb41e
--- /dev/null
+++ b/linux-2.6.35.4-virtio_console-fix-poll.patch
@@ -0,0 +1,29 @@
+Subject: virtio_console: Fix poll blocking even though there is data to read (version 2)
+From: Hans de Goede <hdegoede@redhat.com>
+
+I found this while working on a Linux agent for spice, the symptom I was
+seeing was select blocking on the spice vdagent virtio serial port even
+though there were messages queued up there.
+
+virtio_console's port_fops_poll checks port->inbuf != NULL to determine if
+read won't block. However if an application reads enough bytes from inbuf
+through port_fops_read, to empty the current port->inbuf, port->inbuf
+will be NULL even though there may be buffers left in the virtqueue.
+
+This causes poll() to block even though there is data ready to be read, this
+patch fixes this by using port_has_data(port) instead of the
+port->inbuf != NULL check.
+
+Signed-off-By: Hans de Goede <hdegoede@redhat.com>
+diff -up linux-2.6.35.x86_64/drivers/char/virtio_console.c~ linux-2.6.35.x86_64/drivers/char/virtio_console.c
+--- linux-2.6.35.x86_64/drivers/char/virtio_console.c~ 2010-08-02 00:11:14.000000000 +0200
++++ linux-2.6.35.x86_64/drivers/char/virtio_console.c 2010-09-15 13:39:29.043505000 +0200
+@@ -642,7 +642,7 @@ static unsigned int port_fops_poll(struc
+ poll_wait(filp, &port->waitqueue, wait);
+
+ ret = 0;
+- if (port->inbuf)
++ if (port_has_data(port))
+ ret |= POLLIN | POLLRDNORM;
+ if (!will_write_block(port))
+ ret |= POLLOUT;