Commit 3c4159b3 authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'net-mlx5e-disable-egress-xdp-redirect-in-default'

Tariq Toukan says:

====================
net/mlx5e: Disable egress xdp-redirect in default

This small series disables the egress xdp-redirect feature in default.
It can still be enabled by loading a dummy XDP program.

Patches were previously submitted as part of [1].

This reduces the default number of SQs in each channel from 4 to 3, and
saves resources in device and host memory.

This also improves the latency of channel configuration operations, like
interface up (create channels), interface down (destroy channels), and
channels reconfiguration (create new set, destroy old one).

Perf numbers:
NIC: Connect-X7.
Setup: 248 channels, default mtu and rx/tx ring sizes.

Interface up + down:
Before: 2.246 secs
After:  1.798 secs (-0.448 sec)

Saves ~1.8 msec per channel.

[1]
https://lore.kernel.org/all/1762939749-1165658-1-git-send-email-tariqt@nvidia.com/
====================

Link: https://patch.msgid.link/1764497617-1326331-1-git-send-email-tariqt@nvidia.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 31a3ed49 d4aa0cc9
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -1249,7 +1249,7 @@ void mlx5e_netdev_attach_nic_profile(struct mlx5e_priv *priv);
void mlx5e_set_netdev_mtu_boundaries(struct mlx5e_priv *priv);
void mlx5e_build_nic_params(struct mlx5e_priv *priv, struct mlx5e_xsk *xsk, u16 mtu);

void mlx5e_set_xdp_feature(struct net_device *netdev);
void mlx5e_set_xdp_feature(struct mlx5e_priv *priv);
netdev_features_t mlx5e_features_check(struct sk_buff *skb,
				       struct net_device *netdev,
				       netdev_features_t features);
+1 −9
Original line number Diff line number Diff line
@@ -2294,7 +2294,6 @@ static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable)
	struct mlx5e_priv *priv = netdev_priv(netdev);
	struct mlx5_core_dev *mdev = priv->mdev;
	struct mlx5e_params new_params;
	int err;

	if (enable) {
		/* Checking the regular RQ here; mlx5e_validate_xsk_param called
@@ -2315,14 +2314,7 @@ static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable)
	MLX5E_SET_PFLAG(&new_params, MLX5E_PFLAG_RX_STRIDING_RQ, enable);
	mlx5e_set_rq_type(mdev, &new_params);

	err = mlx5e_safe_switch_params(priv, &new_params, NULL, NULL, true);
	if (err)
		return err;

	/* update XDP supported features */
	mlx5e_set_xdp_feature(netdev);

	return 0;
	return mlx5e_safe_switch_params(priv, &new_params, NULL, NULL, true);
}

static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
+17 −19
Original line number Diff line number Diff line
@@ -2612,7 +2612,7 @@ static int mlx5e_open_queues(struct mlx5e_channel *c,
	if (err)
		goto err_close_icosq_cq;

	if (netdev_ops->ndo_xdp_xmit) {
	if (netdev_ops->ndo_xdp_xmit && c->xdp) {
		c->xdpsq = mlx5e_open_xdpredirect_sq(c, params, cparam, &ccp);
		if (IS_ERR(c->xdpsq)) {
			err = PTR_ERR(c->xdpsq);
@@ -3365,6 +3365,7 @@ static int mlx5e_switch_priv_params(struct mlx5e_priv *priv,
		}
	}

	mlx5e_set_xdp_feature(priv);
	return 0;
}

@@ -3396,6 +3397,7 @@ static int mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
		}
	}

	mlx5e_set_xdp_feature(priv);
	if (!MLX5_CAP_GEN(priv->mdev, tis_tir_td_order))
		mlx5e_close_channels(old_chs);
	priv->profile->update_rx(priv);
@@ -4409,23 +4411,22 @@ static int mlx5e_handle_feature(struct net_device *netdev,
	return 0;
}

void mlx5e_set_xdp_feature(struct net_device *netdev)
void mlx5e_set_xdp_feature(struct mlx5e_priv *priv)
{
	struct mlx5e_priv *priv = netdev_priv(netdev);
	struct mlx5e_params *params = &priv->channels.params;
	xdp_features_t val;

	if (!netdev->netdev_ops->ndo_bpf ||
	    params->packet_merge.type != MLX5E_PACKET_MERGE_NONE) {
		xdp_set_features_flag_locked(netdev, 0);
		return;
	}
	struct net_device *netdev = priv->netdev;
	xdp_features_t val = 0;

	if (netdev->netdev_ops->ndo_bpf &&
	    params->packet_merge.type == MLX5E_PACKET_MERGE_NONE)
		val = NETDEV_XDP_ACT_BASIC | NETDEV_XDP_ACT_REDIRECT |
		      NETDEV_XDP_ACT_XSK_ZEROCOPY |
	      NETDEV_XDP_ACT_RX_SG |
	      NETDEV_XDP_ACT_NDO_XMIT |
		      NETDEV_XDP_ACT_RX_SG;

	if (netdev->netdev_ops->ndo_xdp_xmit && params->xdp_prog)
		val |= NETDEV_XDP_ACT_NDO_XMIT |
			NETDEV_XDP_ACT_NDO_XMIT_SG;

	xdp_set_features_flag_locked(netdev, val);
}

@@ -4461,9 +4462,6 @@ int mlx5e_set_features(struct net_device *netdev, netdev_features_t features)
		return -EINVAL;
	}

	/* update XDP supported features */
	mlx5e_set_xdp_feature(netdev);

	return 0;
}

@@ -5859,7 +5857,7 @@ static void mlx5e_build_nic_netdev(struct net_device *netdev)
	netdev->netmem_tx = true;

	netif_set_tso_max_size(netdev, GSO_MAX_SIZE);
	mlx5e_set_xdp_feature(netdev);
	mlx5e_set_xdp_feature(priv);
	mlx5e_set_netdev_dev_addr(netdev);
	mlx5e_macsec_build_netdev(priv);
	mlx5e_ipsec_build_netdev(priv);
@@ -5957,7 +5955,7 @@ static int mlx5e_nic_init(struct mlx5_core_dev *mdev,

	mlx5e_psp_register(priv);
	/* update XDP supported features */
	mlx5e_set_xdp_feature(netdev);
	mlx5e_set_xdp_feature(priv);

	if (take_rtnl)
		rtnl_unlock();
+1 −1
Original line number Diff line number Diff line
@@ -867,7 +867,7 @@ static void mlx5e_build_rep_params(struct net_device *netdev)
	if (take_rtnl)
		rtnl_lock();
	/* update XDP supported features */
	mlx5e_set_xdp_feature(netdev);
	mlx5e_set_xdp_feature(priv);
	if (take_rtnl)
		rtnl_unlock();