• Sven Van Asbroeck's avatar
    lan743x: fix rx_napi_poll/interrupt ping-pong · 57030a0b
    Sven Van Asbroeck authored
    Even if there is more rx data waiting on the chip, the rx napi poll fn
    will never run more than once - it will always read a few buffers, then
    bail out and re-arm interrupts. Which results in ping-pong between napi
    and interrupt.
    
    This defeats the purpose of napi, and is bad for performance.
    
    Fix by making the rx napi poll behave identically to other ethernet
    drivers:
    1. initialize rx napi polling with an arbitrary budget (64).
    2. in the polling fn, return full weight if rx queue is not depleted,
       this tells the napi core to "keep polling".
    3. update the rx tail ("ring the doorbell") once for every 8 processed
       rx ring buffers.
    
    Thanks to Jakub Kicinski, Eric Dumazet and Andrew Lunn for their expert
    opinions and suggestions.
    
    Tested with 20 seconds of full bandwidth receive (iperf3):
            rx irqs      softirqs(NET_RX)
            -----------------------------
    before  23827        33620
    after   129          4081
    
    Tested-by: Sven Van Asbroeck <thesven73@gmail.com> # lan7430
    Fixes: 23f0703c ("lan743x: Add main source files for new lan743x driver")
    Signed-off-by: default avatarSven Van Asbroeck <thesven73@gmail.com>
    Link: https://lore.kernel.org/r/20201215161954.5950-1-TheSven73@gmail.comSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    57030a0b
lan743x_main.c 84.1 KB