Re: [dpdk-dev] [v1] vdpa/mlx5: fix event channel setup
From: Xueming(Steven) Li <hidden>
Date: 2020-09-18 11:14:31
-----Original Message----- From: Maxime Coquelin <redacted> Sent: Friday, September 18, 2020 5:42 PM To: Xueming(Steven) Li <redacted>; Matan Azrad [off-list ref]; Slava Ovsiienko [off-list ref] Cc: dev@dpdk.org; Asaf Penso <redacted> Subject: Re: [dpdk-dev] [v1] vdpa/mlx5: fix event channel setup On 8/25/20 11:17 AM, Xueming Li wrote:quoted
During vdap device setup, if some error happens, event channel releases/vdap/vDPA/quoted
stuck at polling event channel. Event channel fd is set to nonblocking in cqe setup, so if any errornon-blockingquoted
happens before this function and after event channel created, the pooling before releasing resources will stuck. This patch moves event channel to non-blocking mode right after creation. Fixes: 8395927cdf ("vdpa/mlx5: prepare HW queues") Cc: matan@nvidia.com Signed-off-by: Xueming Li <redacted> --- drivers/vdpa/mlx5/mlx5_vdpa_event.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-)diff --git a/drivers/vdpa/mlx5/mlx5_vdpa_event.cb/drivers/vdpa/mlx5/mlx5_vdpa_event.c index 5a2d4fb1ec..bda547ffe0 100644--- a/drivers/vdpa/mlx5/mlx5_vdpa_event.c +++ b/drivers/vdpa/mlx5/mlx5_vdpa_event.c@@ -51,6 +51,8 @@ mlx5_vdpa_event_qp_global_release(structmlx5_vdpa_priv *priv) static int mlx5_vdpa_event_qp_global_prepare(struct mlx5_vdpa_priv *priv) { + int flags, ret; + if (priv->eventc) return 0; if (mlx5_glue->devx_query_eqn(priv->ctx, 0, &priv->eqn)) { @@ -66,6 +68,12 @@ mlx5_vdpa_event_qp_global_prepare(struct mlx5_vdpa_priv*priv)quoted
rte_errno); goto error; } + flags = fcntl(priv->eventc->fd, F_GETFL); + ret = fcntl(priv->eventc->fd, F_SETFL, flags | O_NONBLOCK); + if (ret) { + DRV_LOG(ERR, "Failed to change event channel FD."); + goto error; + } priv->uar = mlx5_glue->devx_alloc_uar(priv->ctx, 0); if (!priv->uar) { rte_errno = errno;@@ -376,7 +384,6 @@ mlx5_vdpa_interrupt_handler(void *cb_arg) intmlx5_vdpa_cqe_event_setup(struct mlx5_vdpa_priv *priv) { - int flags; int ret; if (!priv->eventc)@@ -393,12 +400,6 @@ mlx5_vdpa_cqe_event_setup(structmlx5_vdpa_priv *priv)quoted
return -1; } } - flags = fcntl(priv->eventc->fd, F_GETFL); - ret = fcntl(priv->eventc->fd, F_SETFL, flags | O_NONBLOCK); - if (ret) { - DRV_LOG(ERR, "Failed to change event channel FD."); - goto error; - } priv->intr_handle.fd = priv->eventc->fd; priv->intr_handle.type = RTE_INTR_HANDLE_EXT; if (rte_intr_callback_register(&priv->intr_handle,Looks good to me, I'll fix the typos while applying.
Appreciate!
Reviewed-by: Maxime Coquelin <redacted> Thanks, Maxime