net/mlx5e: Fix ICOSQ recovery flow for XSK
authorMaxim Mikityanskiy <maximmi@mellanox.com>
Wed, 22 Jul 2020 13:32:44 +0000 (16:32 +0300)
committerSaeed Mahameed <saeedm@nvidia.com>
Thu, 23 Dec 2021 04:38:48 +0000 (20:38 -0800)
There are two ICOSQs per channel: one is needed for RX, and the other
for async operations (XSK TX, kTLS offload). Currently, the recovery
flow for both is the same, and async ICOSQ is mistakenly treated like
the regular ICOSQ.

This patch prevents running the regular ICOSQ recovery on async ICOSQ.
The purpose of async ICOSQ is to handle XSK wakeup requests and post
kTLS offload RX parameters, it has nothing to do with RQ and XSKRQ UMRs,
so the regular recovery sequence is not applicable here.

Fixes: be5323c8379f ("net/mlx5e: Report and recover from CQE error on ICOSQ")
Signed-off-by: Maxim Mikityanskiy <maximmi@mellanox.com>
Reviewed-by: Aya Levin <ayal@nvidia.com>
Signed-off-by: Saeed Mahameed <saeedm@nvidia.com>
drivers/net/ethernet/mellanox/mlx5/core/en.h
drivers/net/ethernet/mellanox/mlx5/core/en_main.c

index f42067adc79d0b502b9c67238370868c16057b7d..b47a0d3ef22fb6da40668682cab149b0d1a0b2cc 100644 (file)
@@ -1016,9 +1016,6 @@ int mlx5e_create_rq(struct mlx5e_rq *rq, struct mlx5e_rq_param *param);
 void mlx5e_destroy_rq(struct mlx5e_rq *rq);
 
 struct mlx5e_sq_param;
-int mlx5e_open_icosq(struct mlx5e_channel *c, struct mlx5e_params *params,
-                    struct mlx5e_sq_param *param, struct mlx5e_icosq *sq);
-void mlx5e_close_icosq(struct mlx5e_icosq *sq);
 int mlx5e_open_xdpsq(struct mlx5e_channel *c, struct mlx5e_params *params,
                     struct mlx5e_sq_param *param, struct xsk_buff_pool *xsk_pool,
                     struct mlx5e_xdpsq *sq, bool is_redirect);
index a572fc9690ed36d85ef50eae03895cd68d321422..3b0f3a831216cc04546b1b0ba5af7f68c6b71478 100644 (file)
@@ -1214,9 +1214,20 @@ static void mlx5e_icosq_err_cqe_work(struct work_struct *recover_work)
        mlx5e_reporter_icosq_cqe_err(sq);
 }
 
+static void mlx5e_async_icosq_err_cqe_work(struct work_struct *recover_work)
+{
+       struct mlx5e_icosq *sq = container_of(recover_work, struct mlx5e_icosq,
+                                             recover_work);
+
+       /* Not implemented yet. */
+
+       netdev_warn(sq->channel->netdev, "async_icosq recovery is not implemented\n");
+}
+
 static int mlx5e_alloc_icosq(struct mlx5e_channel *c,
                             struct mlx5e_sq_param *param,
-                            struct mlx5e_icosq *sq)
+                            struct mlx5e_icosq *sq,
+                            work_func_t recover_work_func)
 {
        void *sqc_wq               = MLX5_ADDR_OF(sqc, param->sqc, wq);
        struct mlx5_core_dev *mdev = c->mdev;
@@ -1237,7 +1248,7 @@ static int mlx5e_alloc_icosq(struct mlx5e_channel *c,
        if (err)
                goto err_sq_wq_destroy;
 
-       INIT_WORK(&sq->recover_work, mlx5e_icosq_err_cqe_work);
+       INIT_WORK(&sq->recover_work, recover_work_func);
 
        return 0;
 
@@ -1573,13 +1584,14 @@ void mlx5e_tx_err_cqe_work(struct work_struct *recover_work)
        mlx5e_reporter_tx_err_cqe(sq);
 }
 
-int mlx5e_open_icosq(struct mlx5e_channel *c, struct mlx5e_params *params,
-                    struct mlx5e_sq_param *param, struct mlx5e_icosq *sq)
+static int mlx5e_open_icosq(struct mlx5e_channel *c, struct mlx5e_params *params,
+                           struct mlx5e_sq_param *param, struct mlx5e_icosq *sq,
+                           work_func_t recover_work_func)
 {
        struct mlx5e_create_sq_param csp = {};
        int err;
 
-       err = mlx5e_alloc_icosq(c, param, sq);
+       err = mlx5e_alloc_icosq(c, param, sq, recover_work_func);
        if (err)
                return err;
 
@@ -1618,7 +1630,7 @@ void mlx5e_deactivate_icosq(struct mlx5e_icosq *icosq)
        synchronize_net(); /* Sync with NAPI. */
 }
 
-void mlx5e_close_icosq(struct mlx5e_icosq *sq)
+static void mlx5e_close_icosq(struct mlx5e_icosq *sq)
 {
        struct mlx5e_channel *c = sq->channel;
 
@@ -2082,13 +2094,15 @@ static int mlx5e_open_queues(struct mlx5e_channel *c,
 
        spin_lock_init(&c->async_icosq_lock);
 
-       err = mlx5e_open_icosq(c, params, &cparam->async_icosq, &c->async_icosq);
+       err = mlx5e_open_icosq(c, params, &cparam->async_icosq, &c->async_icosq,
+                              mlx5e_async_icosq_err_cqe_work);
        if (err)
                goto err_close_xdpsq_cq;
 
        mutex_init(&c->icosq_recovery_lock);
 
-       err = mlx5e_open_icosq(c, params, &cparam->icosq, &c->icosq);
+       err = mlx5e_open_icosq(c, params, &cparam->icosq, &c->icosq,
+                              mlx5e_icosq_err_cqe_work);
        if (err)
                goto err_close_async_icosq;