--- x/drivers/usb/core/urb.c +++ u/drivers/usb/core/urb.c @@ -711,6 +711,7 @@ EXPORT_SYMBOL_GPL(usb_unlink_urb); */ void usb_kill_urb(struct urb *urb) { + int i; might_sleep(); if (!(urb && urb->dev && urb->ep)) return; @@ -723,7 +724,15 @@ void usb_kill_urb(struct urb *urb) smp_mb__after_atomic(); usb_hcd_unlink_urb(urb, -ENOENT); - wait_event(usb_kill_urb_queue, atomic_read(&urb->use_count) == 0); + + for (i = 1;; i++) { + if (!wait_event_timeout(usb_kill_urb_queue, + atomic_read(&urb->use_count) == 0, 5*HZ)) + continue; + WARN_ONCE(i > 27, "It took more than %d seconds to kill a urb\n", + (i - 1) *5); + break; + } atomic_dec(&urb->reject); }