Skip to content

Commit 55c2503

Browse files
author
Saeed Mahameed
committed
net/mlx5e: Introduce switch channels
A fail safe helper functions that allows switching to new channels on the fly, In simple words: make_new_config(new_params) { new_channels = open_channels(new_params); if (!new_channels) return "Failed, but current channels are still active :)" switch_channels(new_channels); return "SUCCESS"; } Demonstrate mlx5e_switch_priv_channels usage in set channels ethtool callback and make it fail-safe using the new switch channels mechanism. Signed-off-by: Saeed Mahameed <[email protected]> Reviewed-by: Tariq Toukan <[email protected]>
1 parent 9008ae0 commit 55c2503

File tree

3 files changed

+51
-15
lines changed

3 files changed

+51
-15
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -863,6 +863,13 @@ void mlx5e_build_indir_tir_ctx_hash(struct mlx5e_params *params,
863863

864864
int mlx5e_open_locked(struct net_device *netdev);
865865
int mlx5e_close_locked(struct net_device *netdev);
866+
867+
int mlx5e_open_channels(struct mlx5e_priv *priv,
868+
struct mlx5e_channels *chs);
869+
void mlx5e_close_channels(struct mlx5e_channels *chs);
870+
void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
871+
struct mlx5e_channels *new_chs);
872+
866873
void mlx5e_build_default_indir_rqt(struct mlx5_core_dev *mdev,
867874
u32 *indirection_rqt, int len,
868875
int num_channels);

drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -556,8 +556,8 @@ static int mlx5e_set_channels(struct net_device *dev,
556556
{
557557
struct mlx5e_priv *priv = netdev_priv(dev);
558558
unsigned int count = ch->combined_count;
559+
struct mlx5e_channels new_channels = {};
559560
bool arfs_enabled;
560-
bool was_opened;
561561
int err = 0;
562562

563563
if (!count) {
@@ -571,22 +571,27 @@ static int mlx5e_set_channels(struct net_device *dev,
571571

572572
mutex_lock(&priv->state_lock);
573573

574-
was_opened = test_bit(MLX5E_STATE_OPENED, &priv->state);
575-
if (was_opened)
576-
mlx5e_close_locked(dev);
574+
new_channels.params = priv->channels.params;
575+
new_channels.params.num_channels = count;
576+
mlx5e_build_default_indir_rqt(priv->mdev, new_channels.params.indirection_rqt,
577+
MLX5E_INDIR_RQT_SIZE, count);
578+
579+
if (!test_bit(MLX5E_STATE_OPENED, &priv->state)) {
580+
priv->channels.params = new_channels.params;
581+
goto out;
582+
}
583+
584+
/* Create fresh channels with new parameters */
585+
err = mlx5e_open_channels(priv, &new_channels);
586+
if (err)
587+
goto out;
577588

578589
arfs_enabled = dev->features & NETIF_F_NTUPLE;
579590
if (arfs_enabled)
580591
mlx5e_arfs_disable(priv);
581592

582-
priv->channels.params.num_channels = count;
583-
mlx5e_build_default_indir_rqt(priv->mdev, priv->channels.params.indirection_rqt,
584-
MLX5E_INDIR_RQT_SIZE, count);
585-
586-
if (was_opened)
587-
err = mlx5e_open_locked(dev);
588-
if (err)
589-
goto out;
593+
/* Switch to new channels, set new parameters and close old ones */
594+
mlx5e_switch_priv_channels(priv, &new_channels);
590595

591596
if (arfs_enabled) {
592597
err = mlx5e_arfs_enable(priv);

drivers/net/ethernet/mellanox/mlx5/core/en_main.c

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1972,8 +1972,8 @@ static void mlx5e_build_channel_param(struct mlx5e_priv *priv,
19721972
mlx5e_build_ico_cq_param(priv, icosq_log_wq_sz, &cparam->icosq_cq);
19731973
}
19741974

1975-
static int mlx5e_open_channels(struct mlx5e_priv *priv,
1976-
struct mlx5e_channels *chs)
1975+
int mlx5e_open_channels(struct mlx5e_priv *priv,
1976+
struct mlx5e_channels *chs)
19771977
{
19781978
struct mlx5e_channel_param *cparam;
19791979
int err = -ENOMEM;
@@ -2037,7 +2037,7 @@ static void mlx5e_deactivate_channels(struct mlx5e_channels *chs)
20372037
mlx5e_deactivate_channel(chs->c[i]);
20382038
}
20392039

2040-
static void mlx5e_close_channels(struct mlx5e_channels *chs)
2040+
void mlx5e_close_channels(struct mlx5e_channels *chs)
20412041
{
20422042
int i;
20432043

@@ -2533,6 +2533,30 @@ static void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv)
25332533
mlx5e_deactivate_channels(&priv->channels);
25342534
}
25352535

2536+
void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
2537+
struct mlx5e_channels *new_chs)
2538+
{
2539+
struct net_device *netdev = priv->netdev;
2540+
int new_num_txqs;
2541+
2542+
new_num_txqs = new_chs->num * new_chs->params.num_tc;
2543+
2544+
netif_carrier_off(netdev);
2545+
2546+
if (new_num_txqs < netdev->real_num_tx_queues)
2547+
netif_set_real_num_tx_queues(netdev, new_num_txqs);
2548+
2549+
mlx5e_deactivate_priv_channels(priv);
2550+
mlx5e_close_channels(&priv->channels);
2551+
2552+
priv->channels = *new_chs;
2553+
2554+
mlx5e_refresh_tirs(priv, false);
2555+
mlx5e_activate_priv_channels(priv);
2556+
2557+
mlx5e_update_carrier(priv);
2558+
}
2559+
25362560
int mlx5e_open_locked(struct net_device *netdev)
25372561
{
25382562
struct mlx5e_priv *priv = netdev_priv(netdev);

0 commit comments

Comments
 (0)