net/mlx5e: Add error flow for ethtool -X command

Prior to this patch, ethtool -X fail but the user receives a success
status. Try to roll-back when failing and return success status
accordingly.

Signed-off-by: Aya Levin <ayal@nvidia.com>
Reviewed-by: Tariq Toukan <tariqt@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
This commit is contained in:
Aya Levin 2021-08-30 18:31:55 +03:00 committed by Saeed Mahameed
parent c228dce262
commit 6c2509d446

View File

@ -391,7 +391,7 @@ int mlx5e_rss_obtain_tirn(struct mlx5e_rss *rss,
return 0; return 0;
} }
static void mlx5e_rss_apply(struct mlx5e_rss *rss, u32 *rqns, unsigned int num_rqns) static int mlx5e_rss_apply(struct mlx5e_rss *rss, u32 *rqns, unsigned int num_rqns)
{ {
int err; int err;
@ -399,6 +399,7 @@ static void mlx5e_rss_apply(struct mlx5e_rss *rss, u32 *rqns, unsigned int num_r
if (err) if (err)
mlx5e_rss_warn(rss->mdev, "Failed to redirect RQT %#x to channels: err = %d\n", mlx5e_rss_warn(rss->mdev, "Failed to redirect RQT %#x to channels: err = %d\n",
mlx5e_rqt_get_rqtn(&rss->rqt), err); mlx5e_rqt_get_rqtn(&rss->rqt), err);
return err;
} }
void mlx5e_rss_enable(struct mlx5e_rss *rss, u32 *rqns, unsigned int num_rqns) void mlx5e_rss_enable(struct mlx5e_rss *rss, u32 *rqns, unsigned int num_rqns)
@ -490,6 +491,14 @@ int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir,
{ {
bool changed_indir = false; bool changed_indir = false;
bool changed_hash = false; bool changed_hash = false;
struct mlx5e_rss *old_rss;
int err = 0;
old_rss = mlx5e_rss_alloc();
if (!old_rss)
return -ENOMEM;
*old_rss = *rss;
if (hfunc && *hfunc != rss->hash.hfunc) { if (hfunc && *hfunc != rss->hash.hfunc) {
switch (*hfunc) { switch (*hfunc) {
@ -497,7 +506,8 @@ int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir,
case ETH_RSS_HASH_TOP: case ETH_RSS_HASH_TOP:
break; break;
default: default:
return -EINVAL; err = -EINVAL;
goto out;
} }
changed_hash = true; changed_hash = true;
changed_indir = true; changed_indir = true;
@ -520,13 +530,20 @@ int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir,
rss->indir.table[i] = indir[i]; rss->indir.table[i] = indir[i];
} }
if (changed_indir && rss->enabled) if (changed_indir && rss->enabled) {
mlx5e_rss_apply(rss, rqns, num_rqns); err = mlx5e_rss_apply(rss, rqns, num_rqns);
if (err) {
*rss = *old_rss;
goto out;
}
}
if (changed_hash) if (changed_hash)
mlx5e_rss_update_tirs(rss); mlx5e_rss_update_tirs(rss);
return 0; out:
mlx5e_rss_free(old_rss);
return err;
} }
struct mlx5e_rss_params_hash mlx5e_rss_get_hash(struct mlx5e_rss *rss) struct mlx5e_rss_params_hash mlx5e_rss_get_hash(struct mlx5e_rss *rss)