Commit 6f5dacf8 authored by Jakub Kicinski's avatar Jakub Kicinski Committed by Paolo Abeni
Browse files

Revert "net/mlx5e: Update and set Xon/Xoff upon MTU set"



This reverts commit ceddedc9.

Commit in question breaks the mapping of PGs to pools for some SKUs.
Specifically multi-host NICs seem to be shipped with a custom buffer
configuration which maps the lossy PG to pool 4. But the bad commit
overrides this with pool 0 which does not have sufficient buffer space
reserved. Resulting in ~40% packet loss. The commit also breaks BMC /
OOB connection completely (100% packet loss).

Revert, similarly to commit 3fbfe251 ("Revert "net/mlx5e: Update and
set Xon/Xoff upon port speed set""). The breakage is exactly the same,
the only difference is that quoted commit would break the NIC immediately
on boot, and the currently reverted commit only when MTU is changed.

Note: "good" kernels do not restore the configuration, so downgrade isn't
enough to recover machines. A NIC power cycle seems to be necessary to
return to a healthy state (or overriding the relevant registers using
a custom patch).

Fixes: ceddedc9 ("net/mlx5e: Update and set Xon/Xoff upon MTU set")
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
Reviewed-by: default avatarTariq Toukan <tariqt@nvidia.com>
Link: https://patch.msgid.link/20250929181529.1848157-1-kuba@kernel.org


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent c18b0f5a
Loading
Loading
Loading
Loading
+0 −12
Original line number Diff line number Diff line
@@ -66,23 +66,11 @@ struct mlx5e_port_buffer {
	struct mlx5e_bufferx_reg  buffer[MLX5E_MAX_NETWORK_BUFFER];
};

#ifdef CONFIG_MLX5_CORE_EN_DCB
int mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
				    u32 change, unsigned int mtu,
				    struct ieee_pfc *pfc,
				    u32 *buffer_size,
				    u8 *prio2buffer);
#else
static inline int
mlx5e_port_manual_buffer_config(struct mlx5e_priv *priv,
				u32 change, unsigned int mtu,
				void *pfc,
				u32 *buffer_size,
				u8 *prio2buffer)
{
	return 0;
}
#endif

int mlx5e_port_query_buffer(struct mlx5e_priv *priv,
			    struct mlx5e_port_buffer *port_buffer);
+1 −16
Original line number Diff line number Diff line
@@ -49,7 +49,6 @@
#include "en.h"
#include "en/dim.h"
#include "en/txrx.h"
#include "en/port_buffer.h"
#include "en_tc.h"
#include "en_rep.h"
#include "en_accel/ipsec.h"
@@ -3061,11 +3060,9 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
	struct mlx5e_params *params = &priv->channels.params;
	struct net_device *netdev = priv->netdev;
	struct mlx5_core_dev *mdev = priv->mdev;
	u16 mtu, prev_mtu;
	u16 mtu;
	int err;

	mlx5e_query_mtu(mdev, params, &prev_mtu);

	err = mlx5e_set_mtu(mdev, params, params->sw_mtu);
	if (err)
		return err;
@@ -3075,18 +3072,6 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
		netdev_warn(netdev, "%s: VPort MTU %d is different than netdev mtu %d\n",
			    __func__, mtu, params->sw_mtu);

	if (mtu != prev_mtu && MLX5_BUFFER_SUPPORTED(mdev)) {
		err = mlx5e_port_manual_buffer_config(priv, 0, mtu,
						      NULL, NULL, NULL);
		if (err) {
			netdev_warn(netdev, "%s: Failed to set Xon/Xoff values with MTU %d (err %d), setting back to previous MTU %d\n",
				    __func__, mtu, err, prev_mtu);

			mlx5e_set_mtu(mdev, params, prev_mtu);
			return err;
		}
	}

	params->sw_mtu = mtu;
	return 0;
}