• Tirthendu Sarkar's avatar
    i40e: handle multi-buffer packets that are shrunk by xdp prog · 83014323
    Tirthendu Sarkar authored
    XDP programs can shrink packets by calling the bpf_xdp_adjust_tail()
    helper function. For multi-buffer packets this may lead to reduction of
    frag count stored in skb_shared_info area of the xdp_buff struct. This
    results in issues with the current handling of XDP_PASS and XDP_DROP
    cases.
    
    For XDP_PASS, currently skb is being built using frag count of
    xdp_buffer before it was processed by XDP prog and thus will result in
    an inconsistent skb when frag count gets reduced by XDP prog. To fix
    this, get correct frag count while building the skb instead of using
    pre-obtained frag count.
    
    For XDP_DROP, current page recycling logic will not reuse the page but
    instead will adjust the pagecnt_bias so that the page can be freed. This
    again results in inconsistent behavior as the page refcnt has already
    been changed by the helper while freeing the frag(s) as part of
    shrinking the packet. To fix this, only adjust pagecnt_bias for buffers
    that are stillpart of the packet post-xdp prog run.
    
    Fixes: e213ced1 ("i40e: add support for XDP multi-buffer Rx")
    Reported-by: default avatarMaciej Fijalkowski <maciej.fijalkowski@intel.com>
    Signed-off-by: default avatarTirthendu Sarkar <tirthendu.sarkar@intel.com>
    Link: https://lore.kernel.org/r/20240124191602.566724-6-maciej.fijalkowski@intel.comSigned-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    83014323
i40e_txrx.c 111 KB