OSDN Git Service

combined-packet: Add a workaround for Linux usbfs + live migration
authorHans de Goede <hdegoede@redhat.com>
Wed, 31 Oct 2012 12:47:10 +0000 (13:47 +0100)
committerGerd Hoffmann <kraxel@redhat.com>
Thu, 1 Nov 2012 14:17:58 +0000 (15:17 +0100)
commit579967bea69bf1b32faee13ff76b19ba641a2618
tree7cf81684590b64347e6c4cd7bae2718aac3855cd
parenta552a966f16b7b39c5df16fc17e12d02c4fa5954
combined-packet: Add a workaround for Linux usbfs + live migration

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