net/mlx5: fix Tx queue stop state
Checks
Commit Message
The Tx queue stop API doesn't call the PMD callback when the state of
the queue is stopped.
The drivers should update the state to be stopped when the queue stop
callback is done successfully or when the port is stopped.
The drivers should update the state to be started when the queue start
callback is done successfully or when the port is started.
The driver wrongly didn't update the state to be started when the port
start callback was done what remained the state as stopped.
Following call to a queue stop API was not completed by ethdev layer
because the state is already stopped.
Move the state update from the Tx queue setup to the port start
callback.
Fixes: 161d103b231c ("net/mlx5: add queue start and stop")
Cc: stable@dpdk.org
Signed-off-by: Matan Azrad <matan@nvidia.com>
---
drivers/net/mlx5/linux/mlx5_verbs.c | 1 +
drivers/net/mlx5/mlx5_devx.c | 1 +
drivers/net/mlx5/mlx5_rxq.c | 4 +++-
drivers/net/mlx5/mlx5_trigger.c | 1 +
drivers/net/mlx5/mlx5_txq.c | 3 +--
5 files changed, 7 insertions(+), 3 deletions(-)
Comments
> -----Original Message-----
> From: Matan Azrad <matan@nvidia.com>
> Sent: Tuesday, November 3, 2020 8:49
> To: Slava Ovsiienko <viacheslavo@nvidia.com>
> Cc: dev@dpdk.org; stable@dpdk.org
> Subject: [PATCH] net/mlx5: fix Tx queue stop state
>
> The Tx queue stop API doesn't call the PMD callback when the state of the
> queue is stopped.
> The drivers should update the state to be stopped when the queue stop
> callback is done successfully or when the port is stopped.
> The drivers should update the state to be started when the queue start
> callback is done successfully or when the port is started.
>
> The driver wrongly didn't update the state to be started when the port start
> callback was done what remained the state as stopped.
> Following call to a queue stop API was not completed by ethdev layer because
> the state is already stopped.
>
> Move the state update from the Tx queue setup to the port start callback.
>
> Fixes: 161d103b231c ("net/mlx5: add queue start and stop")
> Cc: stable@dpdk.org
>
> Signed-off-by: Matan Azrad <matan@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
Hi,
> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Matan Azrad
> Sent: Tuesday, November 3, 2020 8:49 AM
> To: Slava Ovsiienko <viacheslavo@nvidia.com>
> Cc: dev@dpdk.org; stable@dpdk.org
> Subject: [dpdk-dev] [PATCH] net/mlx5: fix Tx queue stop state
>
> The Tx queue stop API doesn't call the PMD callback when the state of
> the queue is stopped.
> The drivers should update the state to be stopped when the queue stop
> callback is done successfully or when the port is stopped.
> The drivers should update the state to be started when the queue start
> callback is done successfully or when the port is started.
>
> The driver wrongly didn't update the state to be started when the port
> start callback was done what remained the state as stopped.
> Following call to a queue stop API was not completed by ethdev layer
> because the state is already stopped.
>
> Move the state update from the Tx queue setup to the port start
> callback.
>
> Fixes: 161d103b231c ("net/mlx5: add queue start and stop")
> Cc: stable@dpdk.org
>
> Signed-off-by: Matan Azrad <matan@nvidia.com>
> ---
> drivers/net/mlx5/linux/mlx5_verbs.c | 1 +
> drivers/net/mlx5/mlx5_devx.c | 1 +
> drivers/net/mlx5/mlx5_rxq.c | 4 +++-
> drivers/net/mlx5/mlx5_trigger.c | 1 +
> drivers/net/mlx5/mlx5_txq.c | 3 +--
> 5 files changed, 7 insertions(+), 3 deletions(-)
Patch applied to next-net-mlx,
Kindest regards,
Raslan Darawsheh
@@ -1038,6 +1038,7 @@
goto error;
}
txq_uar_init(txq_ctrl);
+ dev->data->tx_queue_state[idx] = RTE_ETH_QUEUE_STATE_STARTED;
priv->verbs_alloc_ctx.type = MLX5_VERBS_ALLOC_TYPE_NONE;
return 0;
error:
@@ -1427,6 +1427,7 @@
txq_ctrl->uar_mmap_offset =
mlx5_os_get_devx_uar_mmap_offset(sh->tx_uar);
txq_uar_init(txq_ctrl);
+ dev->data->tx_queue_state[idx] = RTE_ETH_QUEUE_STATE_STARTED;
return 0;
error:
ret = rte_errno; /* Save rte_errno before cleanup. */
@@ -1773,8 +1773,10 @@ struct mlx5_rxq_ctrl *
mlx5_free(rxq_ctrl->obj);
rxq_ctrl->obj = NULL;
}
- if (rxq_ctrl->type == MLX5_RXQ_TYPE_STANDARD)
+ if (rxq_ctrl->type == MLX5_RXQ_TYPE_STANDARD) {
rxq_free_elts(rxq_ctrl);
+ dev->data->rx_queue_state[idx] = RTE_ETH_QUEUE_STATE_STOPPED;
+ }
if (!__atomic_load_n(&rxq_ctrl->refcnt, __ATOMIC_RELAXED)) {
if (rxq_ctrl->type == MLX5_RXQ_TYPE_STANDARD)
mlx5_mr_btree_free(&rxq_ctrl->rxq.mr_ctrl.cache_bh);
@@ -77,6 +77,7 @@
}
if (txq_ctrl->type == MLX5_TXQ_TYPE_STANDARD) {
size_t size = txq_data->cqe_s * sizeof(*txq_data->fcqs);
+
txq_data->fcqs = mlx5_malloc(flags, size,
RTE_CACHE_LINE_SIZE,
txq_ctrl->socket);
@@ -388,7 +388,6 @@
DRV_LOG(DEBUG, "port %u adding Tx queue %u to list",
dev->data->port_id, idx);
(*priv->txqs)[idx] = &txq_ctrl->txq;
- dev->data->tx_queue_state[idx] = RTE_ETH_QUEUE_STATE_STARTED;
return 0;
}
@@ -1249,8 +1248,8 @@ struct mlx5_txq_ctrl *
txq_ctrl->txq.fcqs = NULL;
}
txq_free_elts(txq_ctrl);
+ dev->data->tx_queue_state[idx] = RTE_ETH_QUEUE_STATE_STOPPED;
}
- dev->data->tx_queue_state[idx] = RTE_ETH_QUEUE_STATE_STOPPED;
if (!__atomic_load_n(&txq_ctrl->refcnt, __ATOMIC_RELAXED)) {
if (txq_ctrl->type == MLX5_TXQ_TYPE_STANDARD)
mlx5_mr_btree_free(&txq_ctrl->txq.mr_ctrl.cache_bh);