[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 25/31] combined-packet: Add a workaround for Linux u
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 25/31] combined-packet: Add a workaround for Linux usbfs + live migration |
Date: |
Thu, 1 Nov 2012 16:54:38 +0100 |
From: Hans de Goede <address@hidden>
Older versions (anything but the latest) of Linux usbfs + libusb(x),
will submit larger (bulk) transfers split into multiple 16k submissions,
which means that rather then all tds getting linked into the queue in
one atomic operarion they get linked in a bunch at a time, which could
cause problems if:
1) We scan the queue while libusb is in the middle of submitting a split
bulk transfer
2) While this bulk transfer is pending we migrate to another host.
The problem is that after 2, the new host will rescan the queue and
combine the packets in one large transfer, where as 1) has caused the
original host to see them as 2 transfers. This patch fixes this by stopping
combinging if we detect a 16k transfer with its int_req flag set.
This should not adversely effect performance for other cases as:
1) Linux never sets the interrupt flag on packets other then the last
2) Windows does set the in_req flag on each td, but will submit large
transfers in 20k tds thus never triggering the check
Signed-off-by: Hans de Goede <address@hidden>
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/usb/combined-packet.c | 7 +++++--
1 files changed, 5 insertions(+), 2 deletions(-)
diff --git a/hw/usb/combined-packet.c b/hw/usb/combined-packet.c
index 652bf02..3904e71 100644
--- a/hw/usb/combined-packet.c
+++ b/hw/usb/combined-packet.c
@@ -117,7 +117,7 @@ void usb_ep_combine_input_packets(USBEndpoint *ep)
{
USBPacket *p, *u, *next, *prev = NULL, *first = NULL;
USBPort *port = ep->dev->port;
- int ret;
+ int ret, totalsize;
assert(ep->pipeline);
assert(ep->pid == USB_TOKEN_IN);
@@ -161,8 +161,11 @@ void usb_ep_combine_input_packets(USBEndpoint *ep)
}
/* Is this packet the last one of a (combined) transfer? */
+ totalsize = (p->combined) ? p->combined->iov.size : p->iov.size;
if ((p->iov.size % ep->max_packet_size) != 0 || !p->short_not_ok ||
- next == NULL) {
+ next == NULL ||
+ /* Work around for Linux usbfs bulk splitting + migration */
+ (totalsize == 16348 && p->int_req)) {
ret = usb_device_handle_data(ep->dev, first);
assert(ret == USB_RET_ASYNC);
if (first->combined) {
--
1.7.1
- [Qemu-devel] [PATCH 30/31] usb-redir: Allow to attach USB 2.0 devices to 1.1 host controller, (continued)
- [Qemu-devel] [PATCH 30/31] usb-redir: Allow to attach USB 2.0 devices to 1.1 host controller, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 24/31] usb: Add packet combining functions, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 14/31] usb/ehci: add sysbus variant, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 22/31] uhci: Add a uhci_handle_td_error() helper function, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 27/31] usb-redir: Add support for input pipelining, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 19/31] usb/ehci-pci: dynamic type generation, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 13/31] usb/ehci: split into multiple source files, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 15/31] xilinx_zynq: add USB controllers, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 23/31] uhci: Don't crash on device disconnect, Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 17/31] uhci: stick irq routing info into UHCIInfo too., Gerd Hoffmann, 2012/11/01
- [Qemu-devel] [PATCH 25/31] combined-packet: Add a workaround for Linux usbfs + live migration,
Gerd Hoffmann <=