Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit fdeb4c25 authored by Jason Xing's avatar Jason Xing Committed by Greg Kroah-Hartman
Browse files

ixgbe: allow to increase MTU to 3K with XDP enabled



commit f9cd6a4418bac6a046ee78382423b1ae7565fb24 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 23b44513c3e6 ("ice: allow 3k MTU for XDP")
[2] commit 0c8493d9 ("i40e: add XDP support for pass and drop actions")

Fixes: fabf1bce ("ixgbe: Prevent unsupported configurations with XDP")
Signed-off-by: default avatarJason Xing <kernelxing@tencent.com>
Reviewed-by: default avatarAlexander Duyck <alexanderduyck@fb.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>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 32d81fd5
Loading
Loading
Loading
Loading
+16 −9
Original line number Diff line number Diff line
@@ -6721,6 +6721,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
@@ -6732,20 +6744,15 @@ 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)) {
		if (new_frame_size > ixgbe_max_xdp_frame_size(adapter)) {
			e_warn(probe, "Requested MTU size is not supported with XDP\n");
			return -EINVAL;
		}
	}
	}

	/*
	 * For 82599EB we cannot allow legacy VFs to enable their receive