Blame SOURCES/0176-netdrv-net-mlx5e-Change-inline-mode-correctly-when-c.patch

d8f823
From 0cf024ed12b5e44253c1498cb3265d2874a0c324 Mon Sep 17 00:00:00 2001
d8f823
From: Alaa Hleihel <ahleihel@redhat.com>
d8f823
Date: Tue, 12 May 2020 10:54:48 -0400
d8f823
Subject: [PATCH 176/312] [netdrv] net/mlx5e: Change inline mode correctly when
d8f823
 changing trust state
d8f823
d8f823
Message-id: <20200512105530.4207-83-ahleihel@redhat.com>
d8f823
Patchwork-id: 306954
d8f823
Patchwork-instance: patchwork
d8f823
O-Subject: [RHEL8.3 BZ 1789382 082/124] net/mlx5e: Change inline mode correctly when changing trust state
d8f823
Bugzilla: 1789382
d8f823
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
d8f823
RH-Acked-by: Kamal Heib <kheib@redhat.com>
d8f823
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
d8f823
d8f823
Bugzilla: http://bugzilla.redhat.com/1789382
d8f823
Upstream: v5.7-rc1
d8f823
d8f823
commit 6e0504c69811ae9df7e7e1284950befbe3e6f496
d8f823
Author: Maxim Mikityanskiy <maximmi@mellanox.com>
d8f823
Date:   Thu Nov 14 13:06:16 2019 +0200
d8f823
d8f823
    net/mlx5e: Change inline mode correctly when changing trust state
d8f823
d8f823
    The current steps that are performed when the trust state changes, if
d8f823
    the channels are active:
d8f823
d8f823
    1. The trust state is changed in hardware.
d8f823
d8f823
    2. The new inline mode is calculated.
d8f823
d8f823
    3. If the new inline mode is different, the channels are recreated using
d8f823
    the new inline mode.
d8f823
d8f823
    This approach has some issues:
d8f823
d8f823
    1. There is a time gap between changing trust state in hardware and
d8f823
    starting sending enough inline headers (the latter happens after
d8f823
    recreation of channels). It leads to failed transmissions and error
d8f823
    CQEs.
d8f823
d8f823
    2. If the new channels fail to open, we'll be left with the old ones,
d8f823
    but the hardware will be configured for the new trust state, so the
d8f823
    interval when we can see TX errors never ends.
d8f823
d8f823
    This patch fixes the issues above by moving the trust state change into
d8f823
    the preactivate hook that runs during the recreation of the channels
d8f823
    when no channels are active, so it eliminates the gap of partially
d8f823
    applied configuration. If the inline mode doesn't change with the change
d8f823
    of the trust state, the channels won't be recreated, just like before
d8f823
    this patch.
d8f823
d8f823
    Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
d8f823
    Reviewed-by: Tariq Toukan <tariqt@mellanox.com>
d8f823
    Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
d8f823
d8f823
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
d8f823
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
d8f823
---
d8f823
 drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 55 +++++++++++++---------
d8f823
 1 file changed, 33 insertions(+), 22 deletions(-)
d8f823
d8f823
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c
d8f823
index 1375f6483a13..47874d34156b 100644
d8f823
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c
d8f823
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c
d8f823
@@ -1098,49 +1098,59 @@ void mlx5e_dcbnl_delete_app(struct mlx5e_priv *priv)
d8f823
 	mlx5e_dcbnl_dscp_app(priv, DELETE);
d8f823
 }
d8f823
 
d8f823
-static void mlx5e_trust_update_tx_min_inline_mode(struct mlx5e_priv *priv,
d8f823
-						  struct mlx5e_params *params)
d8f823
+static void mlx5e_params_calc_trust_tx_min_inline_mode(struct mlx5_core_dev *mdev,
d8f823
+						       struct mlx5e_params *params,
d8f823
+						       u8 trust_state)
d8f823
 {
d8f823
-	mlx5_query_min_inline(priv->mdev, &params->tx_min_inline_mode);
d8f823
-	if (priv->dcbx_dp.trust_state == MLX5_QPTS_TRUST_DSCP &&
d8f823
+	mlx5_query_min_inline(mdev, &params->tx_min_inline_mode);
d8f823
+	if (trust_state == MLX5_QPTS_TRUST_DSCP &&
d8f823
 	    params->tx_min_inline_mode == MLX5_INLINE_MODE_L2)
d8f823
 		params->tx_min_inline_mode = MLX5_INLINE_MODE_IP;
d8f823
 }
d8f823
 
d8f823
-static void mlx5e_trust_update_sq_inline_mode(struct mlx5e_priv *priv)
d8f823
+static int mlx5e_update_trust_state_hw(struct mlx5e_priv *priv, void *context)
d8f823
+{
d8f823
+	u8 *trust_state = context;
d8f823
+	int err;
d8f823
+
d8f823
+	err = mlx5_set_trust_state(priv->mdev, *trust_state);
d8f823
+	if (err)
d8f823
+		return err;
d8f823
+	priv->dcbx_dp.trust_state = *trust_state;
d8f823
+
d8f823
+	return 0;
d8f823
+}
d8f823
+
d8f823
+static int mlx5e_set_trust_state(struct mlx5e_priv *priv, u8 trust_state)
d8f823
 {
d8f823
 	struct mlx5e_channels new_channels = {};
d8f823
+	bool reset_channels = true;
d8f823
+	int err = 0;
d8f823
 
d8f823
 	mutex_lock(&priv->state_lock);
d8f823
 
d8f823
 	new_channels.params = priv->channels.params;
d8f823
-	mlx5e_trust_update_tx_min_inline_mode(priv, &new_channels.params);
d8f823
+	mlx5e_params_calc_trust_tx_min_inline_mode(priv->mdev, &new_channels.params,
d8f823
+						   trust_state);
d8f823
 
d8f823
 	if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
d8f823
 		priv->channels.params = new_channels.params;
d8f823
-		goto out;
d8f823
+		reset_channels = false;
d8f823
 	}
d8f823
 
d8f823
 	/* Skip if tx_min_inline is the same */
d8f823
 	if (new_channels.params.tx_min_inline_mode ==
d8f823
 	    priv->channels.params.tx_min_inline_mode)
d8f823
-		goto out;
d8f823
+		reset_channels = false;
d8f823
 
d8f823
-	mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
d8f823
+	if (reset_channels)
d8f823
+		err = mlx5e_safe_switch_channels(priv, &new_channels,
d8f823
+						 mlx5e_update_trust_state_hw,
d8f823
+						 &trust_state);
d8f823
+	else
d8f823
+		err = mlx5e_update_trust_state_hw(priv, &trust_state);
d8f823
 
d8f823
-out:
d8f823
 	mutex_unlock(&priv->state_lock);
d8f823
-}
d8f823
-
d8f823
-static int mlx5e_set_trust_state(struct mlx5e_priv *priv, u8 trust_state)
d8f823
-{
d8f823
-	int err;
d8f823
-
d8f823
-	err = mlx5_set_trust_state(priv->mdev, trust_state);
d8f823
-	if (err)
d8f823
-		return err;
d8f823
-	priv->dcbx_dp.trust_state = trust_state;
d8f823
-	mlx5e_trust_update_sq_inline_mode(priv);
d8f823
 
d8f823
 	return err;
d8f823
 }
d8f823
@@ -1171,7 +1181,8 @@ static int mlx5e_trust_initialize(struct mlx5e_priv *priv)
d8f823
 	if (err)
d8f823
 		return err;
d8f823
 
d8f823
-	mlx5e_trust_update_tx_min_inline_mode(priv, &priv->channels.params);
d8f823
+	mlx5e_params_calc_trust_tx_min_inline_mode(priv->mdev, &priv->channels.params,
d8f823
+						   priv->dcbx_dp.trust_state);
d8f823
 
d8f823
 	err = mlx5_query_dscp2prio(priv->mdev, priv->dcbx_dp.dscp2prio);
d8f823
 	if (err)
d8f823
-- 
d8f823
2.13.6
d8f823