You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
340 lines
13 KiB
340 lines
13 KiB
From 044c5eae6528939777ab0c41134d4c14f8e07a8a Mon Sep 17 00:00:00 2001
|
|
From: Alaa Hleihel <ahleihel@redhat.com>
|
|
Date: Tue, 12 May 2020 10:54:47 -0400
|
|
Subject: [PATCH 175/312] [netdrv] net/mlx5e: Add context to the preactivate
|
|
hook
|
|
|
|
Message-id: <20200512105530.4207-82-ahleihel@redhat.com>
|
|
Patchwork-id: 306953
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.3 BZ 1789382 081/124] net/mlx5e: Add context to the preactivate hook
|
|
Bugzilla: 1789382
|
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
|
RH-Acked-by: Kamal Heib <kheib@redhat.com>
|
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
|
|
|
Bugzilla: http://bugzilla.redhat.com/1789382
|
|
Upstream: v5.7-rc1
|
|
|
|
commit b9ab5d0ecf426a1bf16d706e7c284e00998d00be
|
|
Author: Maxim Mikityanskiy <maximmi@mellanox.com>
|
|
Date: Mon Dec 2 15:48:25 2019 +0200
|
|
|
|
net/mlx5e: Add context to the preactivate hook
|
|
|
|
Sometimes the preactivate hook of mlx5e_safe_switch_channels needs more
|
|
parameters than just struct mlx5e_priv *. For such cases, a new
|
|
parameter (void *context) is added to preactivate hooks.
|
|
|
|
Some of the existing normal functions are currently used as preactivate
|
|
callbacks. To avoid adding an extra unused parameter, they are wrapped
|
|
in an automatic way using the MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX
|
|
macro.
|
|
|
|
Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
|
|
Reviewed-by: Tariq Toukan <tariqt@mellanox.com>
|
|
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
|
|
|
|
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
|
|
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
|
|
---
|
|
drivers/net/ethernet/mellanox/mlx5/core/en.h | 15 ++++++---
|
|
drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c | 2 +-
|
|
.../net/ethernet/mellanox/mlx5/core/en_ethtool.c | 15 ++++-----
|
|
drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 36 ++++++++++++++--------
|
|
drivers/net/ethernet/mellanox/mlx5/core/en_rep.c | 2 +-
|
|
.../net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c | 2 +-
|
|
6 files changed, 45 insertions(+), 27 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
|
|
index b90225f62234..58a7f28b146f 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
|
|
@@ -1036,12 +1036,19 @@ void mlx5e_close_channels(struct mlx5e_channels *chs);
|
|
/* Function pointer to be used to modify HW or kernel settings while
|
|
* switching channels
|
|
*/
|
|
-typedef int (*mlx5e_fp_preactivate)(struct mlx5e_priv *priv);
|
|
+typedef int (*mlx5e_fp_preactivate)(struct mlx5e_priv *priv, void *context);
|
|
+#define MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(fn) \
|
|
+int fn##_ctx(struct mlx5e_priv *priv, void *context) \
|
|
+{ \
|
|
+ return fn(priv); \
|
|
+}
|
|
int mlx5e_safe_reopen_channels(struct mlx5e_priv *priv);
|
|
int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
|
|
struct mlx5e_channels *new_chs,
|
|
- mlx5e_fp_preactivate preactivate);
|
|
+ mlx5e_fp_preactivate preactivate,
|
|
+ void *context);
|
|
int mlx5e_num_channels_changed(struct mlx5e_priv *priv);
|
|
+int mlx5e_num_channels_changed_ctx(struct mlx5e_priv *priv, void *context);
|
|
void mlx5e_activate_priv_channels(struct mlx5e_priv *priv);
|
|
void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv);
|
|
|
|
@@ -1122,10 +1129,10 @@ void mlx5e_update_ndo_stats(struct mlx5e_priv *priv);
|
|
void mlx5e_queue_update_stats(struct mlx5e_priv *priv);
|
|
int mlx5e_bits_invert(unsigned long a, int size);
|
|
|
|
-typedef int (*change_hw_mtu_cb)(struct mlx5e_priv *priv);
|
|
int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv);
|
|
+int mlx5e_set_dev_port_mtu_ctx(struct mlx5e_priv *priv, void *context);
|
|
int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
|
|
- change_hw_mtu_cb set_mtu_cb);
|
|
+ mlx5e_fp_preactivate preactivate);
|
|
|
|
/* ethtool helpers */
|
|
void mlx5e_ethtool_get_drvinfo(struct mlx5e_priv *priv,
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c
|
|
index 01f2918063af..1375f6483a13 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_dcbnl.c
|
|
@@ -1126,7 +1126,7 @@ static void mlx5e_trust_update_sq_inline_mode(struct mlx5e_priv *priv)
|
|
priv->channels.params.tx_min_inline_mode)
|
|
goto out;
|
|
|
|
- mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
|
|
out:
|
|
mutex_unlock(&priv->state_lock);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
|
|
index e7043f68a38f..915f1d74afad 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_ethtool.c
|
|
@@ -357,7 +357,7 @@ int mlx5e_ethtool_set_ringparam(struct mlx5e_priv *priv,
|
|
goto unlock;
|
|
}
|
|
|
|
- err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
|
|
unlock:
|
|
mutex_unlock(&priv->state_lock);
|
|
@@ -441,7 +441,8 @@ int mlx5e_ethtool_set_channels(struct mlx5e_priv *priv,
|
|
mlx5e_arfs_disable(priv);
|
|
|
|
/* Switch to new channels, set new parameters and close old ones */
|
|
- err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_num_channels_changed);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels,
|
|
+ mlx5e_num_channels_changed_ctx, NULL);
|
|
|
|
if (arfs_enabled) {
|
|
int err2 = mlx5e_arfs_enable(priv);
|
|
@@ -574,7 +575,7 @@ int mlx5e_ethtool_set_coalesce(struct mlx5e_priv *priv,
|
|
goto out;
|
|
}
|
|
|
|
- err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
|
|
out:
|
|
mutex_unlock(&priv->state_lock);
|
|
@@ -1733,7 +1734,7 @@ static int set_pflag_cqe_based_moder(struct net_device *netdev, bool enable,
|
|
return 0;
|
|
}
|
|
|
|
- return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ return mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
}
|
|
|
|
static int set_pflag_tx_cqe_based_moder(struct net_device *netdev, bool enable)
|
|
@@ -1766,7 +1767,7 @@ int mlx5e_modify_rx_cqe_compression_locked(struct mlx5e_priv *priv, bool new_val
|
|
return 0;
|
|
}
|
|
|
|
- err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
if (err)
|
|
return err;
|
|
|
|
@@ -1823,7 +1824,7 @@ static int set_pflag_rx_striding_rq(struct net_device *netdev, bool enable)
|
|
return 0;
|
|
}
|
|
|
|
- return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ return mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
}
|
|
|
|
static int set_pflag_rx_no_csum_complete(struct net_device *netdev, bool enable)
|
|
@@ -1867,7 +1868,7 @@ static int set_pflag_xdp_tx_mpwqe(struct net_device *netdev, bool enable)
|
|
return 0;
|
|
}
|
|
|
|
- err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
return err;
|
|
}
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
index 390db68727ff..0d50ee4fd986 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
@@ -2771,6 +2771,8 @@ static int mlx5e_modify_tirs_lro(struct mlx5e_priv *priv)
|
|
return err;
|
|
}
|
|
|
|
+static MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(mlx5e_modify_tirs_lro);
|
|
+
|
|
static int mlx5e_set_mtu(struct mlx5_core_dev *mdev,
|
|
struct mlx5e_params *params, u16 mtu)
|
|
{
|
|
@@ -2820,6 +2822,8 @@ int mlx5e_set_dev_port_mtu(struct mlx5e_priv *priv)
|
|
return 0;
|
|
}
|
|
|
|
+MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(mlx5e_set_dev_port_mtu);
|
|
+
|
|
void mlx5e_set_netdev_mtu_boundaries(struct mlx5e_priv *priv)
|
|
{
|
|
struct mlx5e_params *params = &priv->channels.params;
|
|
@@ -2902,6 +2906,8 @@ int mlx5e_num_channels_changed(struct mlx5e_priv *priv)
|
|
return 0;
|
|
}
|
|
|
|
+MLX5E_DEFINE_PREACTIVATE_WRAPPER_CTX(mlx5e_num_channels_changed);
|
|
+
|
|
static void mlx5e_build_txq_maps(struct mlx5e_priv *priv)
|
|
{
|
|
int i, ch;
|
|
@@ -2957,7 +2963,8 @@ void mlx5e_deactivate_priv_channels(struct mlx5e_priv *priv)
|
|
|
|
static int mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
|
|
struct mlx5e_channels *new_chs,
|
|
- mlx5e_fp_preactivate preactivate)
|
|
+ mlx5e_fp_preactivate preactivate,
|
|
+ void *context)
|
|
{
|
|
struct net_device *netdev = priv->netdev;
|
|
struct mlx5e_channels old_chs;
|
|
@@ -2976,7 +2983,7 @@ static int mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
|
|
* to modify HW settings or update kernel parameters.
|
|
*/
|
|
if (preactivate) {
|
|
- err = preactivate(priv);
|
|
+ err = preactivate(priv, context);
|
|
if (err) {
|
|
priv->channels = old_chs;
|
|
goto out;
|
|
@@ -2998,7 +3005,8 @@ static int mlx5e_switch_priv_channels(struct mlx5e_priv *priv,
|
|
|
|
int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
|
|
struct mlx5e_channels *new_chs,
|
|
- mlx5e_fp_preactivate preactivate)
|
|
+ mlx5e_fp_preactivate preactivate,
|
|
+ void *context)
|
|
{
|
|
int err;
|
|
|
|
@@ -3006,7 +3014,7 @@ int mlx5e_safe_switch_channels(struct mlx5e_priv *priv,
|
|
if (err)
|
|
return err;
|
|
|
|
- err = mlx5e_switch_priv_channels(priv, new_chs, preactivate);
|
|
+ err = mlx5e_switch_priv_channels(priv, new_chs, preactivate, context);
|
|
if (err)
|
|
goto err_close;
|
|
|
|
@@ -3023,7 +3031,7 @@ int mlx5e_safe_reopen_channels(struct mlx5e_priv *priv)
|
|
struct mlx5e_channels new_channels = {};
|
|
|
|
new_channels.params = priv->channels.params;
|
|
- return mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ return mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
}
|
|
|
|
void mlx5e_timestamp_init(struct mlx5e_priv *priv)
|
|
@@ -3473,7 +3481,8 @@ static int mlx5e_setup_tc_mqprio(struct mlx5e_priv *priv,
|
|
goto out;
|
|
}
|
|
|
|
- err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_num_channels_changed);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels,
|
|
+ mlx5e_num_channels_changed_ctx, NULL);
|
|
if (err)
|
|
goto out;
|
|
|
|
@@ -3686,7 +3695,8 @@ static int set_feature_lro(struct net_device *netdev, bool enable)
|
|
goto out;
|
|
}
|
|
|
|
- err = mlx5e_safe_switch_channels(priv, &new_channels, mlx5e_modify_tirs_lro);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels,
|
|
+ mlx5e_modify_tirs_lro_ctx, NULL);
|
|
out:
|
|
mutex_unlock(&priv->state_lock);
|
|
return err;
|
|
@@ -3905,7 +3915,7 @@ static bool mlx5e_xsk_validate_mtu(struct net_device *netdev,
|
|
}
|
|
|
|
int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
|
|
- change_hw_mtu_cb set_mtu_cb)
|
|
+ mlx5e_fp_preactivate preactivate)
|
|
{
|
|
struct mlx5e_priv *priv = netdev_priv(netdev);
|
|
struct mlx5e_channels new_channels = {};
|
|
@@ -3954,13 +3964,13 @@ int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
|
|
|
|
if (!reset) {
|
|
params->sw_mtu = new_mtu;
|
|
- if (set_mtu_cb)
|
|
- set_mtu_cb(priv);
|
|
+ if (preactivate)
|
|
+ preactivate(priv, NULL);
|
|
netdev->mtu = params->sw_mtu;
|
|
goto out;
|
|
}
|
|
|
|
- err = mlx5e_safe_switch_channels(priv, &new_channels, set_mtu_cb);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels, preactivate, NULL);
|
|
if (err)
|
|
goto out;
|
|
|
|
@@ -3973,7 +3983,7 @@ int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
|
|
|
|
static int mlx5e_change_nic_mtu(struct net_device *netdev, int new_mtu)
|
|
{
|
|
- return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu);
|
|
+ return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu_ctx);
|
|
}
|
|
|
|
int mlx5e_hwstamp_set(struct mlx5e_priv *priv, struct ifreq *ifr)
|
|
@@ -4439,7 +4449,7 @@ static int mlx5e_xdp_set(struct net_device *netdev, struct bpf_prog *prog)
|
|
mlx5e_set_rq_type(priv->mdev, &new_channels.params);
|
|
old_prog = priv->channels.params.xdp_prog;
|
|
|
|
- err = mlx5e_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
if (err)
|
|
goto unlock;
|
|
} else {
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
|
|
index 2681bd39eab2..7d12e20e4582 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_rep.c
|
|
@@ -1302,7 +1302,7 @@ static int mlx5e_rep_change_mtu(struct net_device *netdev, int new_mtu)
|
|
|
|
static int mlx5e_uplink_rep_change_mtu(struct net_device *netdev, int new_mtu)
|
|
{
|
|
- return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu);
|
|
+ return mlx5e_change_mtu(netdev, new_mtu, mlx5e_set_dev_port_mtu_ctx);
|
|
}
|
|
|
|
static int mlx5e_uplink_rep_set_mac(struct net_device *netdev, void *addr)
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
|
|
index 56078b23f1a0..673aaa815f57 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/ipoib/ipoib.c
|
|
@@ -483,7 +483,7 @@ 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_safe_switch_channels(priv, &new_channels, NULL);
|
|
+ err = mlx5e_safe_switch_channels(priv, &new_channels, NULL, NULL);
|
|
if (err)
|
|
goto out;
|
|
|
|
--
|
|
2.13.6
|
|
|