• E
    ntb_netdev: Use dev_kfree_skb_any() in interrupt context · 5f7d78b2
    Eric Pilmore 提交于
    TX/RX callback handlers (ntb_netdev_tx_handler(),
    ntb_netdev_rx_handler()) can be called in interrupt
    context via the DMA framework when the respective
    DMA operations have completed. As such, any calls
    by these routines to free skb's, should use the
    interrupt context safe dev_kfree_skb_any() function.
    
    Previously, these callback handlers would call the
    interrupt unsafe version of dev_kfree_skb(). This has
    not presented an issue on Intel IOAT DMA engines as
    that driver utilizes tasklets rather than a hard
    interrupt handler, like the AMD PTDMA DMA driver.
    On AMD systems, a kernel WARNING message is
    encountered, which is being issued from
    skb_release_head_state() due to in_hardirq()
    being true.
    
    Besides the user visible WARNING from the kernel,
    the other symptom of this bug was that TCP/IP performance
    across the ntb_netdev interface was very poor, i.e.
    approximately an order of magnitude below what was
    expected. With the repair to use dev_kfree_skb_any(),
    kernel WARNINGs from skb_release_head_state() ceased
    and TCP/IP performance, as measured by iperf, was on
    par with expected results, approximately 20 Gb/s on
    AMD Milan based server. Note that this performance
    is comparable with Intel based servers.
    
    Fixes: 765ccc7b ("ntb_netdev: correct skb leak")
    Fixes: 548c237c ("net: Add support for NTB virtual ethernet device")
    Signed-off-by: NEric Pilmore <epilmore@gigaio.com>
    Reviewed-by: NDave Jiang <dave.jiang@intel.com>
    Link: https://lore.kernel.org/r/20221209000659.8318-1-epilmore@gigaio.comSigned-off-by: NJakub Kicinski <kuba@kernel.org>
    5f7d78b2
ntb_netdev.c 12.3 KB