[PATCH v2 2/4] USB: URB documentation: claim complete() will be run with IRQs enabled
Alan Stern
stern at rowland.harvard.edu
Mon Jun 24 11:18:45 EDT 2013
On Mon, 24 Jun 2013, Ming Lei wrote:
> There is no good reason to run complete() in hard interrupt
> disabled context.
>
> After switch to run complete() in tasklet, we will enable local IRQs
> when calling complete() since we can do it at that time.
>
> Even though we still disable IRQs now when calling complete()
> in tasklet, the URB documentation is updated to claim complete()
> will be run in tasklet context and local IRQs will be enabled, so
> that USB drivers can know the change and avoid one deadlock caused
> by: assume IRQs disabled in complete() and call spin_lock() to
> hold lock which might be acquired in interrupt context.
>
> Current spin_lock() usages in drivers' complete() will be cleaned
> up at the same time, and once the cleanup is finished, local IRQs
> will be enabled when calling complete() in tasklet.
>
> Also fix description about type of usb_complete_t, and remove the
> advice of running completion handler in tasklet for decreasing
> system latency.
>
> Cc: Oliver Neukum <oliver at neukum.org>
> Cc: Alan Stern <stern at rowland.harvard.edu>
> Signed-off-by: Ming Lei <ming.lei at canonical.com>
> ---
> Documentation/usb/URB.txt | 21 ++++++++++-----------
> 1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/Documentation/usb/URB.txt b/Documentation/usb/URB.txt
> index 00d2c64..50da0d4 100644
> --- a/Documentation/usb/URB.txt
> +++ b/Documentation/usb/URB.txt
> @@ -195,13 +195,12 @@ by the completion handler.
>
> The handler is of the following type:
>
> - typedef void (*usb_complete_t)(struct urb *, struct pt_regs *)
> + typedef void (*usb_complete_t)(struct urb *)
>
> -I.e., it gets the URB that caused the completion call, plus the
> -register values at the time of the corresponding interrupt (if any).
> -In the completion handler, you should have a look at urb->status to
> -detect any USB errors. Since the context parameter is included in the URB,
> -you can pass information to the completion handler.
> +I.e., it gets the URB that caused the completion call. In the completion
> +handler, you should have a look at urb->status to detect any USB errors.
> +Since the context parameter is included in the URB, you can pass
> +information to the completion handler.
>
> Note that even when an error (or unlink) is reported, data may have been
> transferred. That's because USB transfers are packetized; it might take
> @@ -210,12 +209,12 @@ have transferred successfully before the completion was called.
>
>
> NOTE: ***** WARNING *****
> -NEVER SLEEP IN A COMPLETION HANDLER. These are normally called
> -during hardware interrupt processing. If you can, defer substantial
> -work to a tasklet (bottom half) to keep system latencies low. You'll
> -probably need to use spinlocks to protect data structures you manipulate
> -in completion handlers.
> +NEVER SLEEP IN A COMPLETION HANDLER. These are often called in atomic
> +context.
>
> +In the current kernel, completion handlers run with local interrupts
> +disabled, but in the future this will be changed, so don't assume that
> +local IRQs are always disabled inside completion handlers.
>
> 1.8. How to do isochronous (ISO) transfers?
Acked-by: Alan Stern <stern at rowland.harvard.edu>
More information about the linux-arm-kernel
mailing list