]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
net/mlx5e: Defer channels closure to reduce interface down time
authorTariq Toukan <tariqt@nvidia.com>
Thu, 30 Oct 2025 13:32:39 +0000 (15:32 +0200)
committerJakub Kicinski <kuba@kernel.org>
Wed, 5 Nov 2025 01:04:36 +0000 (17:04 -0800)
Cap bit tis_tir_td_order=1 indicates that an old firmware requirement /
limitation no longer exists. When unset, the latency of several firmware
commands significantly increases with the presence of high number of
co-existing channels (both old and new sets). Hence, we used to close
unneeded old channels before invoking those firmware commands.

Today, on capable devices, this is no longer the case. Minimize the
interface down time by deferring the old channels closure, after the
activation of the new ones.

Perf numbers:
Measured the number of dropped packets in a simple ping flood test,
during a configuration change operation, that switches the number of
channels from 247 to 248.

Before: 71 packets lost
After:  15 packets lost, ~80% saving.

Signed-off-by: Tariq Toukan <tariqt@nvidia.com>
Reviewed-by: Carolina Jubran <cjubran@nvidia.com>
Reviewed-by: Simon Horman <horms@kernel.org>
Link: https://patch.msgid.link/1761831159-1013140-8-git-send-email-tariqt@nvidia.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/en_main.c

index 4adc5a4297454633631e082c20acd5133bcc949c..7b7a0060979d6a8597f956f44131f984cd47d4cb 100644 (file)
@@ -3383,7 +3383,8 @@ static int mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
                }
        }
 
-       mlx5e_close_channels(old_chs);
+       if (!MLX5_CAP_GEN(priv->mdev, tis_tir_td_order))
+               mlx5e_close_channels(old_chs);
        priv->profile->update_rx(priv);
 
        mlx5e_selq_apply(&priv->selq);
@@ -3431,6 +3432,9 @@ int mlx5e_safe_switch_params(struct mlx5e_priv *priv,
        if (err)
                goto err_close;
 
+       if (MLX5_CAP_GEN(priv->mdev, tis_tir_td_order))
+               mlx5e_close_channels(old_chs);
+
        kfree(new_chs);
        kfree(old_chs);
        return 0;