qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Hans de Goede <hdegoede@redhat.com>, Gerd Hoffmann <kraxel@redhat.com>
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	[thread overview]
Message-ID: <1351785284-15384-26-git-send-email-kraxel@redhat.com> (raw)
In-Reply-To: <1351785284-15384-1-git-send-email-kraxel@redhat.com>

From: Hans de Goede <hdegoede@redhat.com>

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 <hdegoede@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 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

  parent reply	other threads:[~2012-11-01 15:55 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-11-01 15:54 [Qemu-devel] [PULL 00/31] usb patch queue Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 01/31] xhci: add {get, set}_field macros & enum for pls Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 02/31] xhci: s/xhci_update_port/xhci_port_update/ Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 03/31] xhci: add xhci_port_have_device Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 04/31] xhci: add xhci_port_notify Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 05/31] xhci: add xhci_port_reset Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 06/31] xhci: set pls in xhci_port_update & xhci_port_reset Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 07/31] xhci: add port trace points Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 08/31] xhci: allow address slot being called multiple times Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 09/31] usb/ehci: parameterise the register region offsets Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 10/31] usb/ehci: Abstract away PCI DMA API Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 11/31] usb/ehci: seperate out PCIisms Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 12/31] usb/ehci: Guard definition of EHCI_DEBUG Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 13/31] usb/ehci: split into multiple source files Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 14/31] usb/ehci: add sysbus variant Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 15/31] xilinx_zynq: add USB controllers Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 16/31] uhci: dynamic type generation Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 17/31] uhci: stick irq routing info into UHCIInfo too Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 18/31] uhci: add ich9 00:1a.* variants Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 19/31] usb/ehci-pci: dynamic type generation Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 20/31] usb/ehci-pci: add ich9 00:1a.* variant Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 21/31] usb/ehci-pci: add helper to create ich9 usb controllers Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 22/31] uhci: Add a uhci_handle_td_error() helper function Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 23/31] uhci: Don't crash on device disconnect Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 24/31] usb: Add packet combining functions Gerd Hoffmann
2012-11-01 15:54 ` Gerd Hoffmann [this message]
2012-11-01 15:54 ` [Qemu-devel] [PATCH 26/31] usb-redir: Add support for 32 bits bulk packet length Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 27/31] usb-redir: Add support for input pipelining Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 28/31] usb-redir: Add an usbredir_setup_usb_eps() helper function Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 29/31] usb-redir: Use reject rather the disconnect on bad ep info Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 30/31] usb-redir: Allow to attach USB 2.0 devices to 1.1 host controller Gerd Hoffmann
2012-11-01 15:54 ` [Qemu-devel] [PATCH 31/31] usb-redir: Allow redirecting super speed devices to high speed controllers Gerd Hoffmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1351785284-15384-26-git-send-email-kraxel@redhat.com \
    --to=kraxel@redhat.com \
    --cc=hdegoede@redhat.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).