• Jesper Dangaard Brouer's avatar
    sfc: fix XDP-redirect in this driver · 86e85bf6
    Jesper Dangaard Brouer authored
    XDP-redirect is broken in this driver sfc. XDP_REDIRECT requires
    tailroom for skb_shared_info when creating an SKB based on the
    redirected xdp_frame (both in cpumap and veth).
    
    The fix requires some initial explaining. The driver uses RX page-split
    when possible. It reserves the top 64 bytes in the RX-page for storing
    dma_addr (struct efx_rx_page_state). It also have the XDP recommended
    headroom of XDP_PACKET_HEADROOM (256 bytes). As it doesn't reserve any
    tailroom, it can still fit two standard MTU (1500) frames into one page.
    
    The sizeof struct skb_shared_info in 320 bytes. Thus drivers like ixgbe
    and i40e, reduce their XDP headroom to 192 bytes, which allows them to
    fit two frames with max 1536 bytes into a 4K page (192+1536+320=2048).
    
    The fix is to reduce this drivers headroom to 128 bytes and add the 320
    bytes tailroom. This account for reserved top 64 bytes in the page, and
    still fit two frame in a page for normal MTUs.
    
    We must never go below 128 bytes of headroom for XDP, as one cacheline
    is for xdp_frame area and next cacheline is reserved for metadata area.
    
    Fixes: eb9a36be ("sfc: perform XDP processing on received packets")
    Signed-off-by: default avatarJesper Dangaard Brouer <brouer@redhat.com>
    Acked-by: default avatarEdward Cree <ecree@solarflare.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    86e85bf6
efx_common.c 30 KB