[17/28] net/mlx5: update queue state modify function

Message ID 1563786795-14027-18-git-send-email-matan@mellanox.com (mailing list archive)
State Superseded, archived
Delegated to: Raslan Darawsheh
Headers
Series net/mlx5: support LRO |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK

Commit Message

Matan Azrad July 22, 2019, 9:13 a.m. UTC
From: Dekel Peled <dekelp@mellanox.com>

Function mlx5_queue_state_modify_primary() was implemented to handle
state change for queues created using Verbs API.

This patch update function mlx5_queue_state_modify_primary() to
support state change of RQ object created using DevX API.

Signed-off-by: Dekel Peled <dekelp@mellanox.com>
Acked-by: Matan Azrad <matan@mellanox.com>
---
 drivers/net/mlx5/mlx5_rxtx.c | 31 +++++++++++++++++++++++++------
 1 file changed, 25 insertions(+), 6 deletions(-)
  

Comments

Slava Ovsiienko July 22, 2019, 9:22 a.m. UTC | #1
> -----Original Message-----
> From: Matan Azrad <matan@mellanox.com>
> Sent: Monday, July 22, 2019 12:13
> To: Shahaf Shuler <shahafs@mellanox.com>; Yongseok Koh
> <yskoh@mellanox.com>; Slava Ovsiienko <viacheslavo@mellanox.com>
> Cc: dev@dpdk.org; Dekel Peled <dekelp@mellanox.com>
> Subject: [PATCH 17/28] net/mlx5: update queue state modify function
> 
> From: Dekel Peled <dekelp@mellanox.com>
> 
> Function mlx5_queue_state_modify_primary() was implemented to handle
> state change for queues created using Verbs API.
> 
> This patch update function mlx5_queue_state_modify_primary() to support
> state change of RQ object created using DevX API.
> 
> Signed-off-by: Dekel Peled <dekelp@mellanox.com>
> Acked-by: Matan Azrad <matan@mellanox.com>

Acked-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
  

Patch

diff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c
index 9bfb002..584da3e 100644
--- a/drivers/net/mlx5/mlx5_rxtx.c
+++ b/drivers/net/mlx5/mlx5_rxtx.c
@@ -788,7 +788,7 @@  enum mlx5_txcmp_code {
 }
 
 /**
- * Modify a Verbs queue state.
+ * Modify a Verbs/DevX queue state.
  * This must be called from the primary process.
  *
  * @param dev
@@ -807,15 +807,34 @@  enum mlx5_txcmp_code {
 	struct mlx5_priv *priv = dev->data->dev_private;
 
 	if (sm->is_wq) {
-		struct ibv_wq_attr mod = {
-			.attr_mask = IBV_WQ_ATTR_STATE,
-			.wq_state = sm->state,
-		};
 		struct mlx5_rxq_data *rxq = (*priv->rxqs)[sm->queue_id];
 		struct mlx5_rxq_ctrl *rxq_ctrl =
 			container_of(rxq, struct mlx5_rxq_ctrl, rxq);
 
-		ret = mlx5_glue->modify_wq(rxq_ctrl->obj->wq, &mod);
+		if (rxq_ctrl->obj->type == MLX5_RXQ_OBJ_TYPE_IBV) {
+			struct ibv_wq_attr mod = {
+				.attr_mask = IBV_WQ_ATTR_STATE,
+				.wq_state = sm->state,
+			};
+
+			ret = mlx5_glue->modify_wq(rxq_ctrl->obj->wq, &mod);
+		} else { /* rxq_ctrl->obj->type == MLX5_RXQ_OBJ_TYPE_DEVX_RQ. */
+			struct mlx5_devx_modify_rq_attr rq_attr;
+
+			memset(&rq_attr, 0, sizeof(rq_attr));
+			if (sm->state == IBV_WQS_RESET) {
+				rq_attr.rq_state = MLX5_RQC_STATE_ERR;
+				rq_attr.state = MLX5_RQC_STATE_RST;
+			} else if (sm->state == IBV_WQS_RDY) {
+				rq_attr.rq_state = MLX5_RQC_STATE_RST;
+				rq_attr.state = MLX5_RQC_STATE_RDY;
+			} else if (sm->state == IBV_WQS_ERR) {
+				rq_attr.rq_state = MLX5_RQC_STATE_RDY;
+				rq_attr.state = MLX5_RQC_STATE_ERR;
+			}
+			ret = mlx5_devx_cmd_modify_rq(rxq_ctrl->obj->rq,
+						      &rq_attr);
+		}
 		if (ret) {
 			DRV_LOG(ERR, "Cannot change Rx WQ state to %u  - %s\n",
 					sm->state, strerror(errno));