Re: URB IRQ fires on URB after usb_kill_urb() already completed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, 23 Feb 2015, Devin Heitmueller wrote:

> > Good suggestion.  I'll add code to print it out before and after
> > usb_kill_urb(), as well as from within the the IRQ handler and right
> > before the call to usb_free_urb().
> 
> Added a quick debug line right before the call to usb_urb_kill(),
> thinking that perhaps one of the things checked for at the top of that
> function was causing the function to return without actually doing the
> work (the function starts with a check of urb, dev, and ep for NULL).
> That said though, it looks like the usage count is screwed up.  The
> URB has a usage count of zero before the call to usb_kill_urb(), and
> that's the exact URB that is referenced in the panic trace (ecb07680).
> 
> Is the usage_count member an indication that the URB has gone through
> usb_submit_urb()?  That it's been linked into the hardware transfer
> ring?

Here's the story:

	A new URB has its use_count set to 0 by usb_init_urb.

	The use_count is incremented when the URB is submitted,
	in usb_hcd_submit_urb.  (If the submission fails then
	the use_count is decremented again.)

	The use_count is decremented after the completion routine
	returns, in usb_hcd_giveback_urb.

This means that an active URB should never have its use_count equal to
0.  The value is normally 1; it can go up to 2 temporarily if the
completion routine resubmits the URB.

So if you see the use_count set to 0 while the URB is active, it means 
that something has overwritten the value.  For example, the driver 
might have called usb_init_urb.

Alan Stern

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux