i40e: change Rx buffer size for legacy-rx to support XDP multi-buffer
authorTirthendu Sarkar <tirthendu.sarkar@intel.com>
Thu, 9 Mar 2023 18:56:09 +0000 (00:26 +0530)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Thu, 9 Mar 2023 21:10:57 +0000 (13:10 -0800)
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: Tirthendu Sarkar <tirthendu.sarkar@intel.com>
Tested-by: Chandan Kumar Rout <chandanx.rout@intel.com> (A Contingent Worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/i40e/i40e_ethtool.c
drivers/net/ethernet/intel/i40e/i40e_main.c

index 4934ff5..afc4fa8 100644 (file)
@@ -5402,6 +5402,13 @@ flags_complete:
                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))
index d375d79..e8cf564 100644 (file)
@@ -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);