[dpdk-dev] [v1] vdpa/mlx5: fix event channel setup

Xueming(Steven) Li xuemingl at nvidia.com
Fri Sep 18 13:14:22 CEST 2020



> -----Original Message-----
> From: Maxime Coquelin <maxime.coquelin at redhat.com>
> Sent: Friday, September 18, 2020 5:42 PM
> To: Xueming(Steven) Li <xuemingl at nvidia.com>; Matan Azrad
> <matan at nvidia.com>; Slava Ovsiienko <viacheslavo at nvidia.com>
> Cc: dev at dpdk.org; Asaf Penso <asafp at nvidia.com>
> Subject: Re: [dpdk-dev] [v1] vdpa/mlx5: fix event channel setup
> 
> 
> 
> On 8/25/20 11:17 AM, Xueming Li wrote:
> > During vdap device setup, if some error happens, event channel release
> 
> s/vdap/vDPA/
> 
> > stuck at polling event channel.
> >
> > Event channel fd is set to nonblocking in cqe setup, so if any error
> 
> non-blocking
> 
> > 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 at nvidia.com
> >
> > Signed-off-by: Xueming Li <xuemingl at nvidia.com>
> > ---
> >  drivers/vdpa/mlx5/mlx5_vdpa_event.c | 15 ++++++++-------
> >  1 file changed, 8 insertions(+), 7 deletions(-)
> >
> > diff --git a/drivers/vdpa/mlx5/mlx5_vdpa_event.c
> > b/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(struct
> > mlx5_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)
> >  			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)  int
> > mlx5_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(struct
> mlx5_vdpa_priv *priv)
> >  			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 <maxime.coquelin at redhat.com>
> 
> Thanks,
> Maxime



More information about the dev mailing list