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.
132 lines
4.7 KiB
132 lines
4.7 KiB
From 61d364158c814d57a209665b8dcabf3e0babee89 Mon Sep 17 00:00:00 2001
|
|
From: Alaa Hleihel <ahleihel@redhat.com>
|
|
Date: Tue, 12 May 2020 10:54:35 -0400
|
|
Subject: [PATCH 165/312] [netdrv] net/mlx5e: Fix ICOSQ recovery flow with
|
|
Striding RQ
|
|
|
|
Message-id: <20200512105530.4207-70-ahleihel@redhat.com>
|
|
Patchwork-id: 306941
|
|
Patchwork-instance: patchwork
|
|
O-Subject: [RHEL8.3 BZ 1789382 069/124] net/mlx5e: Fix ICOSQ recovery flow with Striding RQ
|
|
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.6
|
|
|
|
commit e239c6d686e1c37fb2ab143162dfb57471a8643f
|
|
Author: Aya Levin <ayal@mellanox.com>
|
|
Date: Mon Mar 16 16:53:10 2020 +0200
|
|
|
|
net/mlx5e: Fix ICOSQ recovery flow with Striding RQ
|
|
|
|
In striding RQ mode, the buffers of an RX WQE are first
|
|
prepared and posted to the HW using a UMR WQEs via the ICOSQ.
|
|
We maintain the state of these in-progress WQEs in the RQ
|
|
SW struct.
|
|
|
|
In the flow of ICOSQ recovery, the corresponding RQ is not
|
|
in error state, hence:
|
|
|
|
- The buffers of the in-progress WQEs must be released
|
|
and the RQ metadata should reflect it.
|
|
- Existing RX WQEs in the RQ should not be affected.
|
|
|
|
For this, wrap the dealloc of the in-progress WQEs in
|
|
a function, and use it in the ICOSQ recovery flow
|
|
instead of mlx5e_free_rx_descs().
|
|
|
|
Fixes: be5323c8379f ("net/mlx5e: Report and recover from CQE error on ICOSQ")
|
|
Signed-off-by: Aya Levin <ayal@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 | 1 +
|
|
.../ethernet/mellanox/mlx5/core/en/reporter_rx.c | 2 +-
|
|
drivers/net/ethernet/mellanox/mlx5/core/en_main.c | 31 +++++++++++++++++-----
|
|
3 files changed, 26 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en.h b/drivers/net/ethernet/mellanox/mlx5/core/en.h
|
|
index 44f35adbf775..f0f33971be6c 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en.h
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en.h
|
|
@@ -1048,6 +1048,7 @@ int mlx5e_modify_rq_state(struct mlx5e_rq *rq, int curr_state, int next_state);
|
|
void mlx5e_activate_rq(struct mlx5e_rq *rq);
|
|
void mlx5e_deactivate_rq(struct mlx5e_rq *rq);
|
|
void mlx5e_free_rx_descs(struct mlx5e_rq *rq);
|
|
+void mlx5e_free_rx_in_progress_descs(struct mlx5e_rq *rq);
|
|
void mlx5e_activate_icosq(struct mlx5e_icosq *icosq);
|
|
void mlx5e_deactivate_icosq(struct mlx5e_icosq *icosq);
|
|
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_rx.c b/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_rx.c
|
|
index 6c72b592315b..a01e2de2488f 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_rx.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en/reporter_rx.c
|
|
@@ -90,7 +90,7 @@ static int mlx5e_rx_reporter_err_icosq_cqe_recover(void *ctx)
|
|
goto out;
|
|
|
|
mlx5e_reset_icosq_cc_pc(icosq);
|
|
- mlx5e_free_rx_descs(rq);
|
|
+ mlx5e_free_rx_in_progress_descs(rq);
|
|
clear_bit(MLX5E_SQ_STATE_RECOVERING, &icosq->state);
|
|
mlx5e_activate_icosq(icosq);
|
|
mlx5e_activate_rq(rq);
|
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
index c9b9c6cb1677..2f87b0b4660f 100644
|
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/en_main.c
|
|
@@ -814,6 +814,29 @@ int mlx5e_wait_for_min_rx_wqes(struct mlx5e_rq *rq, int wait_time)
|
|
return -ETIMEDOUT;
|
|
}
|
|
|
|
+void mlx5e_free_rx_in_progress_descs(struct mlx5e_rq *rq)
|
|
+{
|
|
+ struct mlx5_wq_ll *wq;
|
|
+ u16 head;
|
|
+ int i;
|
|
+
|
|
+ if (rq->wq_type != MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ)
|
|
+ return;
|
|
+
|
|
+ wq = &rq->mpwqe.wq;
|
|
+ head = wq->head;
|
|
+
|
|
+ /* Outstanding UMR WQEs (in progress) start at wq->head */
|
|
+ for (i = 0; i < rq->mpwqe.umr_in_progress; i++) {
|
|
+ rq->dealloc_wqe(rq, head);
|
|
+ head = mlx5_wq_ll_get_wqe_next_ix(wq, head);
|
|
+ }
|
|
+
|
|
+ rq->mpwqe.actual_wq_head = wq->head;
|
|
+ rq->mpwqe.umr_in_progress = 0;
|
|
+ rq->mpwqe.umr_completed = 0;
|
|
+}
|
|
+
|
|
void mlx5e_free_rx_descs(struct mlx5e_rq *rq)
|
|
{
|
|
__be16 wqe_ix_be;
|
|
@@ -821,14 +844,8 @@ void mlx5e_free_rx_descs(struct mlx5e_rq *rq)
|
|
|
|
if (rq->wq_type == MLX5_WQ_TYPE_LINKED_LIST_STRIDING_RQ) {
|
|
struct mlx5_wq_ll *wq = &rq->mpwqe.wq;
|
|
- u16 head = wq->head;
|
|
- int i;
|
|
|
|
- /* Outstanding UMR WQEs (in progress) start at wq->head */
|
|
- for (i = 0; i < rq->mpwqe.umr_in_progress; i++) {
|
|
- rq->dealloc_wqe(rq, head);
|
|
- head = mlx5_wq_ll_get_wqe_next_ix(wq, head);
|
|
- }
|
|
+ mlx5e_free_rx_in_progress_descs(rq);
|
|
|
|
while (!mlx5_wq_ll_is_empty(wq)) {
|
|
struct mlx5e_rx_wqe_ll *wqe;
|
|
--
|
|
2.13.6
|
|
|