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
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel