• Robert Hancock's avatar
    net: macb: use NAPI for TX completion path · 138badbc
    Robert Hancock authored
    This driver was using the TX IRQ handler to perform all TX completion
    tasks. Under heavy TX network load, this can cause significant irqs-off
    latencies (found to be in the hundreds of microseconds using ftrace).
    This can cause other issues, such as overrunning serial UART FIFOs when
    using high baud rates with limited UART FIFO sizes.
    
    Switch to using a NAPI poll handler to perform the TX completion work
    to get this out of hard IRQ context and avoid the IRQ latency impact. A
    separate NAPI instance is used for TX and RX to avoid checking the other
    ring's state unnecessarily when doing the poll, and so that the NAPI
    budget handling can work for both TX and RX packets.
    
    A new per-queue tx_ptr_lock spinlock has been added to avoid using the
    main device lock (with IRQs needing to be disabled) across the entire TX
    mapping operation, and also to protect the TX queue pointers from
    concurrent access between the TX start and TX poll operations.
    
    The TX Used Bit Read interrupt (TXUBR) handling also needs to be moved into
    the TX NAPI poll handler to maintain the proper order of operations. A flag
    is used to notify the poll handler that a UBR condition needs to be
    handled. The macb_tx_restart handler has had some locking added for global
    register access, since this could now potentially happen concurrently on
    different queues.
    Signed-off-by: default avatarRobert Hancock <robert.hancock@calian.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    138badbc
macb_main.c 134 KB