• Alan Stern's avatar
    USB: EHCI: fix performance regression · fa38dfcc
    Alan Stern authored
    This patch (as1099) fixes a performance regression in ehci-hcd.  The
    fundamental problem is that queue headers get removed from the
    schedule too quickly, since the code checks for a counter advancing
    rather than making an actual time-based check.  The latency involved
    in removing the queue header and then relinking it can severely
    degrade certain kinds of workloads.
    
    The patch replaces a simple counter with a timestamp derived from the
    controller's uframe value.  In addition, the delay for unlinking an
    idle queue header is increased from 5 ms to 10 ms; since some
    controllers (nVidia) have a latency of up to 1 ms for unlinking, this
    reduces the relative impact from 20% to 10%.
    
    Finally, a logical error left over from the IAA watchdog-timer
    conversion is corrected.  Now the driver will always either unlink an
    idle queue header or set up a timer to unlink it later.  The old code
    would sometimes fail to do either.
    Signed-off-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Cc: David Brownell <david-b@pacbell.net>
    Cc: Leonid <leonidv11@gmail.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    fa38dfcc
ehci-hcd.c 30.7 KB