diff options
Diffstat (limited to 'drivers/usb/core/hcd.c')
| -rw-r--r-- | drivers/usb/core/hcd.c | 12 | 
1 files changed, 7 insertions, 5 deletions
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c index e3366f4d82b9..1ff7d901fede 100644 --- a/drivers/usb/core/hcd.c +++ b/drivers/usb/core/hcd.c @@ -1623,6 +1623,7 @@ static void __usb_hcd_giveback_urb(struct urb *urb)  	struct usb_hcd *hcd = bus_to_hcd(urb->dev->bus);  	struct usb_anchor *anchor = urb->anchor;  	int status = urb->unlinked; +	unsigned long flags;  	urb->hcpriv = NULL;  	if (unlikely((urb->transfer_flags & URB_SHORT_NOT_OK) && @@ -1640,13 +1641,14 @@ static void __usb_hcd_giveback_urb(struct urb *urb)  	/* pass ownership to the completion handler */  	urb->status = status;  	/* -	 * This function can be called in task context inside another remote -	 * coverage collection section, but kcov doesn't support that kind of -	 * recursion yet. Only collect coverage in softirq context for now. +	 * Only collect coverage in the softirq context and disable interrupts +	 * to avoid scenarios with nested remote coverage collection sections +	 * that KCOV does not support. +	 * See the comment next to kcov_remote_start_usb_softirq() for details.  	 */ -	kcov_remote_start_usb_softirq((u64)urb->dev->bus->busnum); +	flags = kcov_remote_start_usb_softirq((u64)urb->dev->bus->busnum);  	urb->complete(urb); -	kcov_remote_stop_softirq(); +	kcov_remote_stop_softirq(flags);  	usb_anchor_resume_wakeups(anchor);  	atomic_dec(&urb->use_count);  |