OSDN Git Service

net/mlx5e: Add error flow for ethtool -X command
authorAya Levin <ayal@nvidia.com>
Mon, 30 Aug 2021 15:31:55 +0000 (18:31 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Fri, 24 Sep 2021 18:46:51 +0000 (11:46 -0700)
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>
drivers/net/ethernet/mellanox/mlx5/core/en/rss.c

index 625cd49..b8b481b 100644 (file)
@@ -391,7 +391,7 @@ int mlx5e_rss_obtain_tirn(struct mlx5e_rss *rss,
        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;
 
@@ -399,6 +399,7 @@ static void mlx5e_rss_apply(struct mlx5e_rss *rss, u32 *rqns, unsigned int num_r
        if (err)
                mlx5e_rss_warn(rss->mdev, "Failed to redirect RQT %#x to channels: err = %d\n",
                               mlx5e_rqt_get_rqtn(&rss->rqt), err);
+       return err;
 }
 
 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_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) {
                switch (*hfunc) {
@@ -497,7 +506,8 @@ int mlx5e_rss_set_rxfh(struct mlx5e_rss *rss, const u32 *indir,
                case ETH_RSS_HASH_TOP:
                        break;
                default:
-                       return -EINVAL;
+                       err = -EINVAL;
+                       goto out;
                }
                changed_hash = 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];
        }
 
-       if (changed_indir && rss->enabled)
-               mlx5e_rss_apply(rss, rqns, num_rqns);
+       if (changed_indir && rss->enabled) {
+               err = mlx5e_rss_apply(rss, rqns, num_rqns);
+               if (err) {
+                       *rss = *old_rss;
+                       goto out;
+               }
+       }
 
        if (changed_hash)
                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)