Am Sonntag, 17. April 2005 04:52 schrieb Alan Stern:
> On Sat, 16 Apr 2005, Oliver Neukum wrote:
> 
> > A tasklet is useful only if you cannot enable interrupts because you are
> > in hard irq context.
> 
> A tasklet can be useful for another reason.  Consider that even if an IRQ
> handler does run with interrupts enabled, its own IRQ line still has to
> remain disabled.  So any devices sharing the IRQ line are unable to
> interrupt the CPU until the handler finishes.  With a tasklet, the handler 
> finishes much sooner.

True, but relvant only for irq handlers.

> There are reasons for not enabling interrupts other than being in hard irq
> context:
> 
>       You want to modify a data structure that other interrupt-time
>       code also touches, so you don't want other interrupts to
>       occur until you have finished the modifications.  (This applies
>       just as well to code that's not in an interrupt handler.  You
>       can think of this as a locking-related reason.)  If that other
>       code can be moved into a tasklet, you win.

Exactly. If the _other_ code can be moved to a tasklet. The other
code in question here is the irq handler. Leaving interrupts on
in the task context code is achieved by using spin_lock_bh().

>       Your caller has disabled interrupts and expects you to leave
>       them disabled.  If you defer most of your work to a tasklet
>       and return sooner, you win.
> 
> All of these reasons apply to uhci-hcd.

So convert irq handling to tasklets.

> >  If you shift the existing enqueue code to a tasklet
> > you gain nothing, because the spinlocks need to block irqs.
> 
> You're assuming that the tasklet needs to acquire the same spinlock as the
> existing code and for the same length of time.  If you shift the enqueue
> code to a tasklet and make the tasklet avoid the spinlock as much as
> possible, then you do gain something.

You gain what you gain by avoiding the spinlock. Being in a tasklet doesn't
help.
 
> > If you change the locking there you don't need a tasklet.
> 
> The locking in enqueue can't be changed, for the reasons mentioned above.
> 
> Perhaps you don't fully understand what's being planned here.  Right now
> enqueue, dequeue, and uhci_irq all need to hold the spinlock with
> interrupts disabled because they need to protect against each other.  But
> if the three of them were moved almost entirely into a single tasklet, the
> tasklet wouldn't need to protect against anything but the stubs remaining
> in enqueue, dequeue, and uhci_irq.  (In particular, it wouldn't need to
> protect against itself.)  So the total time spent in the tasklet with
> interrupts disabled would be very low.

Using a single tasklet for multiple tasks is unbelievably ugly.

        Regards
                Oliver


-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to