]> git.baikalelectronics.ru Git - kernel.git/commitdiff
ixgbe: allow to increase MTU to 3K with XDP enabled
authorJason Xing <kernelxing@tencent.com>
Wed, 8 Feb 2023 02:43:32 +0000 (10:43 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 22 Feb 2023 11:59:51 +0000 (12:59 +0100)
commit e76e182f80875ee7fec0c3e92adf01faa9f46b9e upstream.

Recently I encountered one case where I cannot increase the MTU size
directly from 1500 to a much bigger value with XDP enabled if the
server is equipped with IXGBE card, which happened on thousands of
servers in production environment. After applying the current patch,
we can set the maximum MTU size to 3K.

This patch follows the behavior of changing MTU as i40e/ice does.

References:
[1] commit 53b5f8f08a03 ("ice: allow 3k MTU for XDP")
[2] commit 30067ecaebfe ("i40e: add XDP support for pass and drop actions")

Fixes: e6d3c7b58f9d ("ixgbe: Prevent unsupported configurations with XDP")
Signed-off-by: Jason Xing <kernelxing@tencent.com>
Reviewed-by: Alexander Duyck <alexanderduyck@fb.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>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index 298cfbfcb7b6fdd35435ac157c8e43965b50a99f..ab0e0dc083496386339e7e6a0aadf1b4d56c0530 100644 (file)
@@ -6777,6 +6777,18 @@ static void ixgbe_free_all_rx_resources(struct ixgbe_adapter *adapter)
                        ixgbe_free_rx_resources(adapter->rx_ring[i]);
 }
 
+/**
+ * ixgbe_max_xdp_frame_size - returns the maximum allowed frame size for XDP
+ * @adapter: device handle, pointer to adapter
+ */
+static int ixgbe_max_xdp_frame_size(struct ixgbe_adapter *adapter)
+{
+       if (PAGE_SIZE >= 8192 || adapter->flags2 & IXGBE_FLAG2_RX_LEGACY)
+               return IXGBE_RXBUFFER_2K;
+       else
+               return IXGBE_RXBUFFER_3K;
+}
+
 /**
  * ixgbe_change_mtu - Change the Maximum Transfer Unit
  * @netdev: network interface device structure
@@ -6788,18 +6800,13 @@ static int ixgbe_change_mtu(struct net_device *netdev, int new_mtu)
 {
        struct ixgbe_adapter *adapter = netdev_priv(netdev);
 
-       if (adapter->xdp_prog) {
+       if (ixgbe_enabled_xdp_adapter(adapter)) {
                int new_frame_size = new_mtu + ETH_HLEN + ETH_FCS_LEN +
                                     VLAN_HLEN;
-               int i;
-
-               for (i = 0; i < adapter->num_rx_queues; i++) {
-                       struct ixgbe_ring *ring = adapter->rx_ring[i];
 
-                       if (new_frame_size > ixgbe_rx_bufsz(ring)) {
-                               e_warn(probe, "Requested MTU size is not supported with XDP\n");
-                               return -EINVAL;
-                       }
+               if (new_frame_size > ixgbe_max_xdp_frame_size(adapter)) {
+                       e_warn(probe, "Requested MTU size is not supported with XDP\n");
+                       return -EINVAL;
                }
        }