On Wed, 8 Sep 2004, Andreas Mohr wrote:
> Uhoh, I just found one (linux-2.6.8.1/drivers/usb/core/hcd.c):
>
> irqreturn_t usb_hcd_irq (int irq, void *__hcd, struct pt_regs * r)
> {
> struct usb_hcd *hcd = __hcd;
> int start = hcd->state;
>
> if (unlikely (hcd->state == USB_STATE_HALT)) /* irq sharing? */
> return IRQ_NONE;
>
> hcd->saw_irq = 1;
> if (hcd->driver->irq (hcd, r) == IRQ_NONE)
> return IRQ_NONE;
>
> if (hcd->state != start && hcd->state == USB_STATE_HALT)
> usb_hc_died (hcd);
> return IRQ_HANDLED;
> }
>
> Why the h*ck is that one using unlikely()???
> IIRC, this changes cache probability from 95% to 99% or so, which clearly
> aggravates the (most likely too common) situation of IRQ sharing
> of the USB device with other devices in the system (I've seen IRQ-shared
> USB-UHCD many times already!).
>
> You could remove that unlikely() bracing, maybe that helps a bit.
>
> Also, it unnecessarily calculates hdc->state *twice* before and
> during the IRQ sharing check, so in total it should use
> if (start == USB_STATE_HALT) /* irq sharing? */
> return IRQ_NONE;
> instead, which now should be quite faster.
With all due respect, let me point out that you don't know what you're
talking about.
That unlikely() _really_ does cover an unlikely case -- the case where the
device is turned off. That's what USB_STATE_HALT means. It is indeed
very unlikely for the device to be turned off, since the HC drivers always
leave their devices on unless they encounter an unrecoverable error.
I imagine you were misled by the comment to think that it really was
testing for IRQ sharing. But it isn't; the implication behind the comment
is that _if_ the device is off then the IRQ _must_ be shared, since the
device couldn't have generated it. The _real_ test for IRQ sharing occurs
lower down, where it says:
if (hcd->driver->irq (hcd, r) == IRQ_NONE)
return IRQ_NONE;
As for replacing "hcd->state" by "start" in the body of the unlikely(),
yes, that could be done. Any decent compiler will do it for you,
automatically. The cost of a single extra dereference is minimal in any
case.
Alan Stern
-------------------------------------------------------
This SF.Net email is sponsored by BEA Weblogic Workshop
FREE Java Enterprise J2EE developer tools!
Get your free copy of BEA WebLogic Workshop 8.1 today.
http://ads.osdn.com/?ad_id=5047&alloc_id=10808&op=click
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel