[17/28] net/mlx5: update queue state modify function
Checks
Commit Message
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
> -----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>
@@ -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));