mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 18:41:58 +09:00
net/mlx5e: Revert parameters on errors when changing MTU and LRO state without reset
[ Upstream commit8355060f5e] Sometimes, channel params are changed without recreating the channels. It happens in two basic cases: when the channels are closed, and when the parameter being changed doesn't affect how channels are configured. Such changes invoke a hardware command that might fail. The whole operation should be reverted in such cases, but the code that restores the parameters' values in the driver was missing. This commit adds this handling. Fixes:2e20a15120("net/mlx5e: Fail safe mtu and lro setting") Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com> Reviewed-by: Tariq Toukan <tariqt@nvidia.com> Signed-off-by: Saeed Mahameed <saeedm@nvidia.com> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
f24b493eba
commit
f5430661f2
@@ -3730,7 +3730,7 @@ static int set_feature_lro(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 = {};
|
||||
struct mlx5e_params *old_params;
|
||||
struct mlx5e_params *cur_params;
|
||||
int err = 0;
|
||||
bool reset;
|
||||
|
||||
@@ -3743,8 +3743,8 @@ static int set_feature_lro(struct net_device *netdev, bool enable)
|
||||
goto out;
|
||||
}
|
||||
|
||||
old_params = &priv->channels.params;
|
||||
if (enable && !MLX5E_GET_PFLAG(old_params, MLX5E_PFLAG_RX_STRIDING_RQ)) {
|
||||
cur_params = &priv->channels.params;
|
||||
if (enable && !MLX5E_GET_PFLAG(cur_params, MLX5E_PFLAG_RX_STRIDING_RQ)) {
|
||||
netdev_warn(netdev, "can't set LRO with legacy RQ\n");
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
@@ -3752,18 +3752,23 @@ static int set_feature_lro(struct net_device *netdev, bool enable)
|
||||
|
||||
reset = test_bit(MLX5E_STATE_OPENED, &priv->state);
|
||||
|
||||
new_channels.params = *old_params;
|
||||
new_channels.params = *cur_params;
|
||||
new_channels.params.lro_en = enable;
|
||||
|
||||
if (old_params->rq_wq_type != MLX5_WQ_TYPE_CYCLIC) {
|
||||
if (mlx5e_rx_mpwqe_is_linear_skb(mdev, old_params, NULL) ==
|
||||
if (cur_params->rq_wq_type != MLX5_WQ_TYPE_CYCLIC) {
|
||||
if (mlx5e_rx_mpwqe_is_linear_skb(mdev, cur_params, NULL) ==
|
||||
mlx5e_rx_mpwqe_is_linear_skb(mdev, &new_channels.params, NULL))
|
||||
reset = false;
|
||||
}
|
||||
|
||||
if (!reset) {
|
||||
*old_params = new_channels.params;
|
||||
struct mlx5e_params old_params;
|
||||
|
||||
old_params = *cur_params;
|
||||
*cur_params = new_channels.params;
|
||||
err = mlx5e_modify_tirs_lro(priv);
|
||||
if (err)
|
||||
*cur_params = old_params;
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -4037,9 +4042,16 @@ int mlx5e_change_mtu(struct net_device *netdev, int new_mtu,
|
||||
}
|
||||
|
||||
if (!reset) {
|
||||
unsigned int old_mtu = params->sw_mtu;
|
||||
|
||||
params->sw_mtu = new_mtu;
|
||||
if (preactivate)
|
||||
preactivate(priv, NULL);
|
||||
if (preactivate) {
|
||||
err = preactivate(priv, NULL);
|
||||
if (err) {
|
||||
params->sw_mtu = old_mtu;
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
netdev->mtu = params->sw_mtu;
|
||||
goto out;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user