diff options
author | Hans de Goede <hdegoede@redhat.com> | 2010-09-15 17:32:48 +0200 |
---|---|---|
committer | Hans de Goede <hdegoede@redhat.com> | 2010-09-15 17:32:48 +0200 |
commit | e34bb01b5f209b88f10ac44b5c8c308dc6759753 (patch) | |
tree | c15cea6bb44ab6c904c43871dfef329ea1f91ddf | |
parent | 6d1d3d62c35ee70d2e33dab6e732eaee7439dfca (diff) | |
download | kernel-e34bb01b5f209b88f10ac44b5c8c308dc6759753.tar.gz kernel-e34bb01b5f209b88f10ac44b5c8c308dc6759753.tar.xz kernel-e34bb01b5f209b88f10ac44b5c8c308dc6759753.zip |
- virtio_console: Fix poll/select blocking even though there is data to read
-rw-r--r-- | kernel.spec | 5 | ||||
-rw-r--r-- | 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 364a4068c..f44f98d12 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@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. 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; |