Commit f7f732a7 authored by Tirthendu Sarkar's avatar Tirthendu Sarkar Committed by Tony Nguyen
Browse files

i40e: change Rx buffer size for legacy-rx to support XDP multi-buffer



Adding support for XDP multi-buffer entails adding information of all
the fragments of the packet in the xdp_buff. This approach implies that
underlying buffer has to provide tailroom for skb_shared_info.

In the legacy-rx mode, driver can only configure up to 2k sized Rx buffers
and with the current configuration of 2k sized Rx buffers there is no way
to do tailroom reservation for skb_shared_info. Hence size of Rx buffers
is now lowered to 2048 - sizeof(skb_shared_info). Also, driver can only
chain up to 5 Rx buffers and this means max MTU supported for legacy-rx
is now 8614 (5 * rx_buffer_len  - ETH header with VLAN).

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>
parent a4ba6290
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -5402,6 +5402,13 @@ static int i40e_set_priv_flags(struct net_device *dev, u32 flags)
		return -EOPNOTSUPP;
	}

	if ((changed_flags & I40E_FLAG_LEGACY_RX) &&
	    I40E_2K_TOO_SMALL_WITH_PADDING) {
		dev_warn(&pf->pdev->dev,
			 "2k Rx buffer is too small to fit standard MTU and skb_shared_info\n");
		return -EOPNOTSUPP;
	}

	if ((changed_flags & new_flags &
	     I40E_FLAG_LINK_DOWN_ON_CLOSE_ENABLED) &&
	    (new_flags & I40E_FLAG_MFP_ENABLED))
+9 −3
Original line number Diff line number Diff line
@@ -2903,7 +2903,7 @@ static void i40e_sync_filters_subtask(struct i40e_pf *pf)
static u16 i40e_calculate_vsi_rx_buf_len(struct i40e_vsi *vsi)
{
	if (!vsi->netdev || (vsi->back->flags & I40E_FLAG_LEGACY_RX))
		return I40E_RXBUFFER_2048;
		return SKB_WITH_OVERHEAD(I40E_RXBUFFER_2048);

	return PAGE_SIZE < 8192 ? I40E_RXBUFFER_3072 : I40E_RXBUFFER_2048;
}
@@ -3661,10 +3661,16 @@ static int i40e_configure_rx_ring(struct i40e_ring *ring)
	}

	/* configure Rx buffer alignment */
	if (!vsi->netdev || (vsi->back->flags & I40E_FLAG_LEGACY_RX))
	if (!vsi->netdev || (vsi->back->flags & I40E_FLAG_LEGACY_RX)) {
		if (I40E_2K_TOO_SMALL_WITH_PADDING) {
			dev_info(&vsi->back->pdev->dev,
				 "2k Rx buffer is too small to fit standard MTU and skb_shared_info\n");
			return -EOPNOTSUPP;
		}
		clear_ring_build_skb_enabled(ring);
	else
	} else {
		set_ring_build_skb_enabled(ring);
	}

	ring->rx_offset = i40e_rx_offset(ring);