[kernel] - virtio_console: Fix poll/select blocking even though there is data to read

Hans de Goede jwrdegoede at fedoraproject.org
Wed Sep 15 15:33:07 UTC 2010


commit e34bb01b5f209b88f10ac44b5c8c308dc6759753
Author: Hans de Goede <hdegoede at redhat.com>
Date:   Wed Sep 15 17:32:48 2010 +0200

    - virtio_console: Fix poll/select blocking even though there is data to read

 kernel.spec                                  |    5 ++++
 linux-2.6.35.4-virtio_console-fix-poll.patch |   29 ++++++++++++++++++++++++++
 2 files changed, 34 insertions(+), 0 deletions(-)
---
diff --git a/kernel.spec b/kernel.spec
index 364a406..f44f98d 100644
--- a/kernel.spec
+++ b/kernel.spec
@@ -647,6 +647,7 @@ Patch800: linux-2.6-crash-driver.patch
 
 # virt + ksm patches
 Patch1555: fix_xen_guest_on_old_EC2.patch
+Patch1556: linux-2.6.35.4-virtio_console-fix-poll.patch
 
 # DRM
 Patch1801: drm-revert-drm-fbdev-rework-output-polling-to-be-back-in-core.patch
@@ -1243,6 +1244,7 @@ ApplyPatch linux-2.6-crash-driver.patch
 
 # Assorted Virt Fixes
 ApplyPatch fix_xen_guest_on_old_EC2.patch
+ApplyPatch linux-2.6.35.4-virtio_console-fix-poll.patch
 
 #ApplyPatch drm-revert-drm-fbdev-rework-output-polling-to-be-back-in-core.patch
 #ApplyPatch revert-drm-kms-toggle-poll-around-switcheroo.patch
@@ -1904,6 +1906,9 @@ fi
 #                 ||     ||
 
 %changelog
+* Wed Sep 15 2010 Hans de Goede <hdegoede at redhat.com>
+- virtio_console: Fix poll/select blocking even though there is data to read
+
 * Wed Sep 15 2010 Chuck Ebbert <cebbert at redhat.com> - 2.6.36-0.22.rc4.git2
 - Linux 2.6.36-rc4-git2
 - Fix up add-appleir-usb-driver.patch after HID core changes.
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 0000000..ff46eb4
--- /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 at 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 at 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;


More information about the scm-commits mailing list