• David Brownell's avatar
    USB: ehci-hcd unlink speedups · b9638011
    David Brownell authored
    This patch fixes some performance bugs observed with some workloads
    when unlinking EHCI queue header (QH) descriptors from the async ring
    (control/bulk schedule).
    
    The mechanism intended to defer unlinking an empty QH (so there is no
    penalty in common cases where it's quickly reused) was not working as
    intended.  Sometimes the unlink was scheduled:
    
     - too quickly ... which can be a *strong* negative effect, since
       that QH becomes unavailable for immediate re-use;
    
     - too slowly ... wasting DMA cycles, usually a minor issue except
       for increased bus contention and power usage;
    
    Plus there was an extreme case of "too slowly":  a logical error in the
    IAA watchdog-timer conversion meant that sometimes the unlink never
    got scheduled.
    
    The fix replaces a simple counter with a timestamp derived from the
    controller's 8 KHz microframe counter, and adjusts the timer usage
    for some issues associated with HZ being less than 8K.
    
    (Based on a patch originally by Alan Stern, and good troubleshooting
    from  Leonid.)
    Signed-off-by: default avatarDavid Brownell <dbrownell@users.sourceforge.net>
    Cc: Alan Stern <stern@rowland.harvard.edu>
    Cc: Leonid <leonidv11@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    b9638011
ehci-q.c 32.4 KB