net/mlx5e: Wrap the open and apply of channels in one fail-safe function
authorTariq Toukan <tariqt@mellanox.com>
Mon, 26 Nov 2018 15:22:16 +0000 (17:22 +0200)
committerSaeed Mahameed <saeedm@mellanox.com>
Tue, 19 Feb 2019 22:15:03 +0000 (14:15 -0800)
Take into a function the common code structure of opening
a side set of channels followed by a call to apply them.

Signed-off-by: Tariq Toukan <tariqt@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c
drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
drivers/net/ethernet/mellanox/mlx5/core/en_main.c
drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c

index e9acfa9..71c65cc 100644 (file)
@@ -858,9 +858,9 @@ void mlx5e_close_channels(struct mlx5e_channels *chs);
  * switching channels
  */
 typedef int (*mlx5e_fp_hw_modify)(struct mlx5e_priv *priv);
-void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
-                               struct mlx5e_channels *new_chs,
-                               mlx5e_fp_hw_modify hw_modify);
+int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
+                              struct mlx5e_channels *new_chs,
+                              mlx5e_fp_hw_modify hw_modify);
 void mlx5e_activate_priv_channels(struct mlx5e_priv *priv);
 void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv);
 
index 722998d..554672e 100644 (file)
@@ -1126,9 +1126,7 @@ static void mlx5e_trust_update_sq_inline_mode(struct mlx5e_priv *priv)
            priv->channels.params.tx_min_inline_mode)
                goto out;
 
-       if (mlx5e_open_channels(priv, &new_channels))
-               goto out;
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
+       mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 
 out:
        mutex_unlock(&priv->state_lock);
index ee5dc8e..0804b47 100644 (file)
@@ -369,11 +369,7 @@ int mlx5e_ethtool_set_ringparam(struct mlx5e_priv *priv,
                goto unlock;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               goto unlock;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 
 unlock:
        mutex_unlock(&priv->state_lock);
@@ -431,11 +427,6 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv,
                goto out;
        }
 
-       /* Create fresh channels with new parameters */
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               goto out;
-
        arfs_enabled = priv->netdev->features & NETIF_F_NTUPLE;
        if (arfs_enabled)
                mlx5e_arfs_disable(priv);
@@ -445,13 +436,14 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv,
                                              MLX5E_INDIR_RQT_SIZE, count);
 
        /* Switch to new channels, set new parameters and close old ones */
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 
        if (arfs_enabled) {
-               err = mlx5e_arfs_enable(priv);
-               if (err)
+               int err2 = mlx5e_arfs_enable(priv);
+
+               if (err2)
                        netdev_err(priv->netdev, "%s: mlx5e_arfs_enable failed: %d\n",
-                                  __func__, err);
+                                  __func__, err2);
        }
 
 out:
@@ -577,12 +569,7 @@ int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv,
                goto out;
        }
 
-       /* open fresh channels with new coal parameters */
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               goto out;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 
 out:
        mutex_unlock(&priv->state_lock);
@@ -1635,7 +1622,6 @@ static int set_pflag_cqe_based_moder(struct net_device *netdev, bool enable,
        struct mlx5e_channels new_channels = {};
        bool mode_changed;
        u8 cq_period_mode, current_cq_period_mode;
-       int err = 0;
 
        cq_period_mode = enable ?
                MLX5_CQ_PERIOD_MODE_START_FROM_CQE :
@@ -1663,12 +1649,7 @@ static int set_pflag_cqe_based_moder(struct net_device *netdev, bool enable,
                return 0;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               return err;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
-       return 0;
+       return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 }
 
 static int set_pflag_tx_cqe_based_moder(struct net_device *netdev, bool enable)
@@ -1701,11 +1682,10 @@ int mlx5e_modify_rx_cqe_compression_locked(struct mlx5e_priv *priv, bool new_val
                return 0;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
        if (err)
                return err;
 
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
        mlx5e_dbg(DRV, priv, "MLX5E: RxCqeCmprss was turned %s\n",
                  MLX5E_GET_PFLAG(&priv->channels.params,
                                  MLX5E_PFLAG_RX_CQE_COMPRESS) ? "ON" : "OFF");
@@ -1738,7 +1718,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_channels new_channels = {};
-       int err;
 
        if (enable) {
                if (!mlx5e_check_fragmented_striding_rq_cap(mdev))
@@ -1760,12 +1739,7 @@ static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable)
                return 0;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               return err;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
-       return 0;
+       return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
 }
 
 static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
@@ -1808,12 +1782,8 @@ static int set_pflag_xdp_tx_mpwqe(struct net_device *netdev, bool enable)
                return 0;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               return err;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
-       return 0;
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
+       return err;
 }
 
 static const struct pflag_desc mlx5e_priv_flags[MLX5E_NUM_PFLAGS] = {
index 83510ca..878b346 100644 (file)
@@ -2885,13 +2885,14 @@ void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv)
        mlx5e_deactivate_channels(&priv->channels);
 }
 
-void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
-                               struct mlx5e_channels *new_chs,
-                               mlx5e_fp_hw_modify hw_modify)
+static void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
+                                      struct mlx5e_channels *new_chs,
+                                      mlx5e_fp_hw_modify hw_modify)
 {
        struct net_device *netdev = priv->netdev;
        int new_num_txqs;
        int carrier_ok;
+
        new_num_txqs = new_chs->num * new_chs->params.num_tc;
 
        carrier_ok = netif_carrier_ok(netdev);
@@ -2917,6 +2918,20 @@ void mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
                netif_carrier_on(netdev);
 }
 
+int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
+                              struct mlx5e_channels *new_chs,
+                              mlx5e_fp_hw_modify hw_modify)
+{
+       int err;
+
+       err = mlx5e_open_channels(priv, new_chs);
+       if (err)
+               return err;
+
+       mlx5e_switch_priv_channels(priv, new_chs, hw_modify);
+       return 0;
+}
+
 void mlx5e_timestamp_init(struct mlx5e_priv *priv)
 {
        priv->tstamp.tx_type   = HWTSTAMP_TX_OFF;
@@ -3333,13 +3348,12 @@ static int mlx5e_setup_tc_mqprio(struct net_device *netdev,
                goto out;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
        if (err)
                goto out;
 
        priv->max_opened_tc = max_t(u8, priv->max_opened_tc,
                                    new_channels.params.num_tc);
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
 out:
        mutex_unlock(&priv->state_lock);
        return err;
@@ -3549,11 +3563,7 @@ static int set_feature_lro(struct net_device *netdev, bool enable)
                goto out;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
-       if (err)
-               goto out;
-
-       mlx5e_switch_priv_channels(priv, &new_channels, mlx5e_modify_tirs_lro);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_modify_tirs_lro);
 out:
        mutex_unlock(&priv->state_lock);
        return err;
@@ -3771,11 +3781,10 @@ int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
                goto out;
        }
 
-       err = mlx5e_open_channels(priv, &new_channels);
+       err = mlx5e_safe_switch_channels(priv, &new_channels, set_mtu_cb);
        if (err)
                goto out;
 
-       mlx5e_switch_priv_channels(priv, &new_channels, set_mtu_cb);
        netdev->mtu = new_channels.params.sw_mtu;
 
 out:
index bfc0f65..4eac425 100644 (file)
@@ -446,11 +446,11 @@ static int mlx5i_change_mtu(struct net_device *netdev, int new_mtu)
 
        new_channels.params = *params;
        new_channels.params.sw_mtu = new_mtu;
-       err = mlx5e_open_channels(priv, &new_channels);
+
+       err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
        if (err)
                goto out;
 
-       mlx5e_switch_priv_channels(priv, &new_channels, NULL);
        netdev->mtu = new_channels.params.sw_mtu;
 
 out: