• Jonathan Bell's avatar
    xhci: Use more than one Event Ring segment · 28084d3f
    Jonathan Bell authored
    Users have reported log spam created by "Event Ring Full" xHC event
    TRBs.  These are caused by interrupt latency in conjunction with a very
    busy set of devices on the bus.  The errors are benign, but throughput
    will suffer as the xHC will pause processing of transfers until the
    Event Ring is drained by the kernel.
    
    Commit dc0ffbea ("usb: host: xhci: update event ring dequeue pointer
    on purpose") mitigated the issue by advancing the Event Ring Dequeue
    Pointer already after half a segment has been processed.  Nevertheless,
    providing a larger Event Ring would be useful to cope with load peaks.
    
    Expand the number of event TRB slots available by increasing the number
    of Event Ring segments in the ERST.
    
    Controllers have a hardware-defined limit as to the number of ERST
    entries they can process, but with up to 32k it can be excessively high
    (sec 5.3.4).  So cap the actual number at 2 (configurable through the
    ERST_MAX_SEGS macro), which seems like a reasonable quantity.  It is
    supported by any xHC because the limit in the HCSPARAMS2 register is
    defined as a power of 2.  Renesas uPD720201 and VIA VL805 controllers
    do not support more than 2 ERST entries.
    
    An alternative to increasing the number of Event Ring segments would be
    an increase of the segment size.  But that requires allocating multiple
    contiguous pages, which may be impossible if memory is fragmented.
    Signed-off-by: default avatarJonathan Bell <jonathan@raspberrypi.com>
    Signed-off-by: default avatarLukas Wunner <lukas@wunner.de>
    Signed-off-by: default avatarMathias Nyman <mathias.nyman@linux.intel.com>
    Link: https://lore.kernel.org/r/20231019102924.2797346-6-mathias.nyman@linux.intel.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    28084d3f
xhci-mem.c 70.9 KB