usb-host: workaround libusb bug
libusb seems to no allways call the completion callback for requests canceled (which it is supposed to do according to the docs). So add a limit to avoid qemu waiting forever. Tested-by: BALATON Zoltan <balaton@eik.bme.hu> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-Id: <20200529072225.3195-1-kraxel@redhat.com>
This commit is contained in:
parent
9f815e83e9
commit
54cdfe5112
@ -972,6 +972,7 @@ fail:
|
||||
static void usb_host_abort_xfers(USBHostDevice *s)
|
||||
{
|
||||
USBHostRequest *r, *rtmp;
|
||||
int limit = 100;
|
||||
|
||||
QTAILQ_FOREACH_SAFE(r, &s->requests, next, rtmp) {
|
||||
usb_host_req_abort(r);
|
||||
@ -982,6 +983,19 @@ static void usb_host_abort_xfers(USBHostDevice *s)
|
||||
memset(&tv, 0, sizeof(tv));
|
||||
tv.tv_usec = 2500;
|
||||
libusb_handle_events_timeout(ctx, &tv);
|
||||
if (--limit == 0) {
|
||||
/*
|
||||
* Don't wait forever for libusb calling the complete
|
||||
* callback (which will unlink and free the request).
|
||||
*
|
||||
* Leaking memory here, to make sure libusb will not
|
||||
* access memory which we have released already.
|
||||
*/
|
||||
QTAILQ_FOREACH_SAFE(r, &s->requests, next, rtmp) {
|
||||
QTAILQ_REMOVE(&s->requests, r, next);
|
||||
}
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user