• Tirthendu Sarkar's avatar
    i40e: add support for XDP multi-buffer Rx · e213ced1
    Tirthendu Sarkar authored
    This patch adds multi-buffer support for the i40e_driver.
    
    i40e_clean_rx_irq() is modified to collate all the buffers of a packet
    before calling the XDP program. xdp_buff is built for the first frag of
    the packet and subsequent frags are added to it. 'next_to_process' is
    incremented for all non-EOP frags while 'next_to_clean' stays at the
    first descriptor of the packet. XDP program is called only on receiving
    EOP frag.
    
    New functions are added for adding frags to xdp_buff and for post
    processing of the buffers once the xdp prog has run. For XDP_PASS this
    results in a skb with multiple fragments.
    
    i40e_build_skb() builds the skb around xdp buffer that already contains
    frags data. So i40e_add_rx_frag() helper function is now removed. Since
    fields before 'dataref' in skb_shared_info are cleared during
    napi_skb_build(), xdp_update_skb_shared_info() is called to set those.
    
    For i40e_construct_skb(), all the frags data needs to be copied from
    xdp_buffer's shared_skb_info to newly constructed skb's shared_skb_info.
    
    This also means 'skb' does not need to be preserved across i40e_napi_poll()
    calls and hence is removed from i40e_ring structure.
    
    Previously i40e_alloc_rx_buffers() was called for every 32 cleaned
    buffers. For multi-buffers this may not be optimal as there may be more
    cleaned buffers in each i40e_clean_rx_irq() call. So this is now called
    when at least half of the ring size has been cleaned.
    Signed-off-by: default avatarTirthendu Sarkar <tirthendu.sarkar@intel.com>
    Tested-by: Chandan Kumar Rout <chandanx.rout@intel.com> (A Contingent Worker at Intel)
    Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
    e213ced1
i40e_txrx.c 112 KB