diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 9457c4e..79be212 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1684,9 +1684,11 @@ static void __usb_hcd_giveback_urb(struct urb *urb)
 	 * and no one may trigger the above deadlock situation when
 	 * running complete() in tasklet.
 	 */
+	__this_cpu_write(hcd->completing_urb, urb);
 	local_irq_save(flags);
 	urb->complete(urb);
 	local_irq_restore(flags);
+	__this_cpu_write(hcd->completing_urb, NULL);
 
 	if (atomic_read(&urb->use_flag) == URB_UNUSING)
 		atomic_set(&urb->use_flag, URB_UNUSED);
@@ -2681,6 +2683,10 @@ int usb_add_hcd(struct usb_hcd *hcd,
 	init_giveback_urb_bh(&hcd->high_prio_bh);
 	init_giveback_urb_bh(&hcd->low_prio_bh);
 
+	hcd->completing_urb = alloc_percpu(typeof(*hcd->completing_urb));
+	if (!hcd->completing_urb)
+		goto err_hcd_driver_setup;
+
 	/* enable irqs just before we start the controller,
 	 * if the BIOS provides legacy PCI irqs.
 	 */
@@ -2744,6 +2750,7 @@ err_hcd_driver_start:
 	if (usb_hcd_is_primary_hcd(hcd) && hcd->irq > 0)
 		free_irq(irqnum, hcd);
 err_request_irq:
+	free_percpu(hcd->completing_urb);
 err_hcd_driver_setup:
 err_set_rh_speed:
 	usb_put_dev(hcd->self.root_hub);
@@ -2798,6 +2805,7 @@ void usb_remove_hcd(struct usb_hcd *hcd)
 	 * - it is too late to run complete() here since driver may have
 	 *   been removed already now
 	 */
+	free_percpu(hcd->completing_urb);
 
 	/* Prevent any more root-hub status calls from the timer.
 	 * The HCD might still restart the timer (if a port status change
diff --git a/drivers/usb/host/ehci-sched.c b/drivers/usb/host/ehci-sched.c
index f32e362..ee51eb4 100644
--- a/drivers/usb/host/ehci-sched.c
+++ b/drivers/usb/host/ehci-sched.c
@@ -1406,7 +1406,8 @@ iso_stream_schedule (
 	 * (irq delays etc).  If there are, the behavior depends on
 	 * whether URB_ISO_ASAP is set.
 	 */
-	if (likely (!list_empty (&stream->td_list))) {
+	if (likely (!list_empty (&stream->td_list)) ||
+			hcd_is_urb_completing(ehci_to_hcd(ehci), urb)) {
 
 		/* Take the isochronous scheduling threshold into account */
 		if (ehci->i_thresh)
