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

This commit is contained in:
Hans de Goede 2010-09-15 17:32:48 +02:00
parent 6d1d3d62c3
commit e34bb01b5f
2 changed files with 34 additions and 0 deletions

View File

@ -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@redhat.com>
- virtio_console: Fix poll/select blocking even though there is data to read
* Wed Sep 15 2010 Chuck Ebbert <cebbert@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.

View File

@ -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;