[v2,2/2] net/mlx5: fix resource leak when releasing a drop action

Message ID ad652dca7fa37753e06d866f3e6cc247fd754e83.1661223500.git.wangyunjian@huawei.com (mailing list archive)
State Changes Requested, archived
Delegated to: Raslan Darawsheh
Headers
Series fixes for mlx5 |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS
ci/iol-x86_64-unit-testing fail Testing issues
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-x86_64-compile-testing fail Testing issues
ci/github-robot: build success github build: passed

Commit Message

Yunjian Wang Aug. 23, 2022, 6:46 a.m. UTC
  Currently, the resources for hrxq->action are allocated in
mlx5_devx_hrxq_new(). But it was not being freed when the
drop action was released in mlx5_devx_drop_action_destroy().
So, fix is to free the resources in mlx5_devx_tir_destroy().

Fixes: bc5bee028ebc ("net/mlx5: create drop queue using DevX")
Cc: stable@dpdk.org

Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
---
 drivers/net/mlx5/mlx5_devx.c | 7 +++++++
 drivers/net/mlx5/mlx5_rxq.c  | 6 ------
 2 files changed, 7 insertions(+), 6 deletions(-)
  

Comments

Yunjian Wang Sept. 23, 2022, 9:31 a.m. UTC | #1
Friendly ping.

> -----Original Message-----
> From: wangyunjian
> Sent: Tuesday, August 23, 2022 2:46 PM
> To: dev@dpdk.org
> Cc: matan@nvidia.com; rasland@nvidia.com; viacheslavo@nvidia.com;
> dkozlyuk@nvidia.com; Huangshaozhang <huangshaozhang@huawei.com>;
> wangyunjian <wangyunjian@huawei.com>; stable@dpdk.org
> Subject: [dpdk-dev] [PATCH v2 2/2] net/mlx5: fix resource leak when releasing a
> drop action
> 
> Currently, the resources for hrxq->action are allocated in
> mlx5_devx_hrxq_new(). But it was not being freed when the drop action was
> released in mlx5_devx_drop_action_destroy().
> So, fix is to free the resources in mlx5_devx_tir_destroy().
> 
> Fixes: bc5bee028ebc ("net/mlx5: create drop queue using DevX")
> Cc: stable@dpdk.org
> 
> Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
> ---
>  drivers/net/mlx5/mlx5_devx.c | 7 +++++++  drivers/net/mlx5/mlx5_rxq.c  |
> 6 ------
>  2 files changed, 7 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c index
> 6886ae1f22..09c8856f05 100644
> --- a/drivers/net/mlx5/mlx5_devx.c
> +++ b/drivers/net/mlx5/mlx5_devx.c
> @@ -907,6 +907,13 @@ mlx5_devx_hrxq_new(struct rte_eth_dev *dev,
> struct mlx5_hrxq *hrxq,  static void  mlx5_devx_tir_destroy(struct
> mlx5_hrxq *hrxq)  {
> +#if defined(HAVE_IBV_FLOW_DV_SUPPORT)
> || !defined(HAVE_INFINIBAND_VERBS_H)
> +	if (hrxq->hws_flags)
> +		mlx5dr_action_destroy(hrxq->action);
> +	else
> +		mlx5_flow_os_destroy_flow_action(hrxq->action);
> +	hrxq->action = NULL;
> +#endif
>  	claim_zero(mlx5_devx_cmd_destroy(hrxq->tir));
>  }
> 
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index
> eaf23d0df4..e518fe9bfd 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -2861,12 +2861,6 @@ __mlx5_hrxq_remove(struct rte_eth_dev *dev,
> struct mlx5_hrxq *hrxq)  {
>  	struct mlx5_priv *priv = dev->data->dev_private;
> 
> -#ifdef HAVE_IBV_FLOW_DV_SUPPORT
> -	if (hrxq->hws_flags)
> -		mlx5dr_action_destroy(hrxq->action);
> -	else
> -		mlx5_glue->destroy_flow_action(hrxq->action);
> -#endif
>  	priv->obj_ops.hrxq_destroy(hrxq);
>  	if (!hrxq->standalone) {
>  		mlx5_ind_table_obj_release(dev, hrxq->ind_table,
> --
> 2.27.0
  
Slava Ovsiienko Sept. 26, 2022, 7:35 p.m. UTC | #2
Hi, Yunjian

We have drop action in mlx5.
To create/destroy drop action we have 
mlx5_drop_action_create/ mlx5_drop_action_destroy common routines.

As PMD supports operation either over FW (Verbs in rdma_core) or SW/HW steering
with DevX objects the "virtual" methods are used for objects:

priv->obj_ops.drop_action_create(dev) - create drop action
   a) mlx5_ibv_drop_action_create()- use Verbs (dv-flow_en == 0)
   b) mlx5_devx_drop_action_create() - use DevX (dv-flow_en != 0)

priv->obj_ops.drop_action_destroy(dev) - destroy drop action
   a) mlx5_ibv_drop_action_destroy()- use Verbs (dv-flow_en == 0)
   b) mlx5_devx_drop_action_destroy() - use DevX (dv-flow_en != 0)


Let's consider DevX case.
mlx5_devx_drop_action_create()
    mlx5_rxq_devx_obj_drop_create()
    mlx5_devx_ind_table_new()
    mlx5_devx_hrxq_new()
         xxx_create_dest_tir()
         xxx_action_create_dest_tir()


mlx5_devx_drop_action_destroy()
    /* It seems action destroy is missing here */
    mlx5_devx_tir_destroy()
    mlx5_devx_ind_table_destroy()
    mlx5_rxq_devx_obj_drop_release()

So, yes, I agree. There is missing action destroy, it seems we have leakage.

Let's look at 
__mlx5_hrxq_remove()
   destroy_action()
   priv->obj_ops.hrxq_destroy();


And there we have a problem.
obj_ops.hrxq_destroy() - not always mlx5_devx_tir_destroy() is called.
It might be mlx5_ibv_qp_destroy() (for Verbas) and patch would not work.

So, instead of fixing __mlx5_hrxq_remove() and mlx5_devx_tir_destroy()
I would consider patching:
- mlx5_devx_drop_action_destroy()
- mlx5_ibv_drop_action_destroy
by adding action desatroying.

With best regards,
Slava


> -----Original Message-----
> From: wangyunjian <wangyunjian@huawei.com>
> Sent: Friday, September 23, 2022 12:32
> To: dev@dpdk.org
> Cc: Matan Azrad <matan@nvidia.com>; Raslan Darawsheh <rasland@nvidia.com>;
> Slava Ovsiienko <viacheslavo@nvidia.com>; Dmitry Kozlyuk
> <dkozlyuk@nvidia.com>; Huangshaozhang <huangshaozhang@huawei.com>;
> stable@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v2 2/2] net/mlx5: fix resource leak when
> releasing a drop action
> 
> Friendly ping.
> 
> > -----Original Message-----
> > From: wangyunjian
> > Sent: Tuesday, August 23, 2022 2:46 PM
> > To: dev@dpdk.org
> > Cc: matan@nvidia.com; rasland@nvidia.com; viacheslavo@nvidia.com;
> > dkozlyuk@nvidia.com; Huangshaozhang <huangshaozhang@huawei.com>;
> > wangyunjian <wangyunjian@huawei.com>; stable@dpdk.org
> > Subject: [dpdk-dev] [PATCH v2 2/2] net/mlx5: fix resource leak when
> > releasing a drop action
> >
> > Currently, the resources for hrxq->action are allocated in
> > mlx5_devx_hrxq_new(). But it was not being freed when the drop action
> > was released in mlx5_devx_drop_action_destroy().
> > So, fix is to free the resources in mlx5_devx_tir_destroy().
> >
> > Fixes: bc5bee028ebc ("net/mlx5: create drop queue using DevX")
> > Cc: stable@dpdk.org
> >
> > Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
> > ---
> >  drivers/net/mlx5/mlx5_devx.c | 7 +++++++  drivers/net/mlx5/mlx5_rxq.c
> > |
> > 6 ------
> >  2 files changed, 7 insertions(+), 6 deletions(-)
> >
> > diff --git a/drivers/net/mlx5/mlx5_devx.c
> > b/drivers/net/mlx5/mlx5_devx.c index
> > 6886ae1f22..09c8856f05 100644
> > --- a/drivers/net/mlx5/mlx5_devx.c
> > +++ b/drivers/net/mlx5/mlx5_devx.c
> > @@ -907,6 +907,13 @@ mlx5_devx_hrxq_new(struct rte_eth_dev *dev,
> > struct mlx5_hrxq *hrxq,  static void  mlx5_devx_tir_destroy(struct
> > mlx5_hrxq *hrxq)  {
> > +#if defined(HAVE_IBV_FLOW_DV_SUPPORT)
> > || !defined(HAVE_INFINIBAND_VERBS_H)
> > +	if (hrxq->hws_flags)
> > +		mlx5dr_action_destroy(hrxq->action);
> > +	else
> > +		mlx5_flow_os_destroy_flow_action(hrxq->action);
> > +	hrxq->action = NULL;
> > +#endif
> >  	claim_zero(mlx5_devx_cmd_destroy(hrxq->tir));
> >  }
> >
> > diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> > index eaf23d0df4..e518fe9bfd 100644
> > --- a/drivers/net/mlx5/mlx5_rxq.c
> > +++ b/drivers/net/mlx5/mlx5_rxq.c
> > @@ -2861,12 +2861,6 @@ __mlx5_hrxq_remove(struct rte_eth_dev *dev,
> > struct mlx5_hrxq *hrxq)  {
> >  	struct mlx5_priv *priv = dev->data->dev_private;
> >
> > -#ifdef HAVE_IBV_FLOW_DV_SUPPORT
> > -	if (hrxq->hws_flags)
> > -		mlx5dr_action_destroy(hrxq->action);
> > -	else
> > -		mlx5_glue->destroy_flow_action(hrxq->action);
> > -#endif
> >  	priv->obj_ops.hrxq_destroy(hrxq);
> >  	if (!hrxq->standalone) {
> >  		mlx5_ind_table_obj_release(dev, hrxq->ind_table,
> > --
> > 2.27.0
  
Yunjian Wang Sept. 29, 2022, 1:51 a.m. UTC | #3
I agree with you. Can you fix it?

Thanks
        Yunjian

> -----Original Message-----
> From: Slava Ovsiienko [mailto:viacheslavo@nvidia.com]
> Sent: Tuesday, September 27, 2022 3:36 AM
> To: wangyunjian <wangyunjian@huawei.com>; dev@dpdk.org
> Cc: Matan Azrad <matan@nvidia.com>; Raslan Darawsheh
> <rasland@nvidia.com>; Dmitry Kozlyuk <dkozlyuk@nvidia.com>;
> Huangshaozhang <huangshaozhang@huawei.com>; stable@dpdk.org
> Subject: RE: [dpdk-dev] [PATCH v2 2/2] net/mlx5: fix resource leak when
> releasing a drop action
> 
> Hi, Yunjian
> 
> We have drop action in mlx5.
> To create/destroy drop action we have
> mlx5_drop_action_create/ mlx5_drop_action_destroy common routines.
> 
> As PMD supports operation either over FW (Verbs in rdma_core) or SW/HW
> steering with DevX objects the "virtual" methods are used for objects:
> 
> priv->obj_ops.drop_action_create(dev) - create drop action
>    a) mlx5_ibv_drop_action_create()- use Verbs (dv-flow_en == 0)
>    b) mlx5_devx_drop_action_create() - use DevX (dv-flow_en != 0)
> 
> priv->obj_ops.drop_action_destroy(dev) - destroy drop action
>    a) mlx5_ibv_drop_action_destroy()- use Verbs (dv-flow_en == 0)
>    b) mlx5_devx_drop_action_destroy() - use DevX (dv-flow_en != 0)
> 
> 
> Let's consider DevX case.
> mlx5_devx_drop_action_create()
>     mlx5_rxq_devx_obj_drop_create()
>     mlx5_devx_ind_table_new()
>     mlx5_devx_hrxq_new()
>          xxx_create_dest_tir()
>          xxx_action_create_dest_tir()
> 
> 
> mlx5_devx_drop_action_destroy()
>     /* It seems action destroy is missing here */
>     mlx5_devx_tir_destroy()
>     mlx5_devx_ind_table_destroy()
>     mlx5_rxq_devx_obj_drop_release()
> 
> So, yes, I agree. There is missing action destroy, it seems we have leakage.
> 
> Let's look at
> __mlx5_hrxq_remove()
>    destroy_action()
>    priv->obj_ops.hrxq_destroy();
> 
> 
> And there we have a problem.
> obj_ops.hrxq_destroy() - not always mlx5_devx_tir_destroy() is called.
> It might be mlx5_ibv_qp_destroy() (for Verbas) and patch would not work.
> 
> So, instead of fixing __mlx5_hrxq_remove() and mlx5_devx_tir_destroy()
> I would consider patching:
> - mlx5_devx_drop_action_destroy()
> - mlx5_ibv_drop_action_destroy
> by adding action desatroying.
> 
> With best regards,
> Slava
> 
> 
> > -----Original Message-----
> > From: wangyunjian <wangyunjian@huawei.com>
> > Sent: Friday, September 23, 2022 12:32
> > To: dev@dpdk.org
> > Cc: Matan Azrad <matan@nvidia.com>; Raslan Darawsheh
> <rasland@nvidia.com>;
> > Slava Ovsiienko <viacheslavo@nvidia.com>; Dmitry Kozlyuk
> > <dkozlyuk@nvidia.com>; Huangshaozhang
> <huangshaozhang@huawei.com>;
> > stable@dpdk.org
> > Subject: RE: [dpdk-dev] [PATCH v2 2/2] net/mlx5: fix resource leak when
> > releasing a drop action
> >
> > Friendly ping.
> >
> > > -----Original Message-----
> > > From: wangyunjian
> > > Sent: Tuesday, August 23, 2022 2:46 PM
> > > To: dev@dpdk.org
> > > Cc: matan@nvidia.com; rasland@nvidia.com; viacheslavo@nvidia.com;
> > > dkozlyuk@nvidia.com; Huangshaozhang <huangshaozhang@huawei.com>;
> > > wangyunjian <wangyunjian@huawei.com>; stable@dpdk.org
> > > Subject: [dpdk-dev] [PATCH v2 2/2] net/mlx5: fix resource leak when
> > > releasing a drop action
> > >
> > > Currently, the resources for hrxq->action are allocated in
> > > mlx5_devx_hrxq_new(). But it was not being freed when the drop action
> > > was released in mlx5_devx_drop_action_destroy().
> > > So, fix is to free the resources in mlx5_devx_tir_destroy().
> > >
> > > Fixes: bc5bee028ebc ("net/mlx5: create drop queue using DevX")
> > > Cc: stable@dpdk.org
> > >
> > > Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
> > > ---
> > >  drivers/net/mlx5/mlx5_devx.c | 7 +++++++  drivers/net/mlx5/mlx5_rxq.c
> > > |
> > > 6 ------
> > >  2 files changed, 7 insertions(+), 6 deletions(-)
> > >
> > > diff --git a/drivers/net/mlx5/mlx5_devx.c
> > > b/drivers/net/mlx5/mlx5_devx.c index
> > > 6886ae1f22..09c8856f05 100644
> > > --- a/drivers/net/mlx5/mlx5_devx.c
> > > +++ b/drivers/net/mlx5/mlx5_devx.c
> > > @@ -907,6 +907,13 @@ mlx5_devx_hrxq_new(struct rte_eth_dev *dev,
> > > struct mlx5_hrxq *hrxq,  static void  mlx5_devx_tir_destroy(struct
> > > mlx5_hrxq *hrxq)  {
> > > +#if defined(HAVE_IBV_FLOW_DV_SUPPORT)
> > > || !defined(HAVE_INFINIBAND_VERBS_H)
> > > +	if (hrxq->hws_flags)
> > > +		mlx5dr_action_destroy(hrxq->action);
> > > +	else
> > > +		mlx5_flow_os_destroy_flow_action(hrxq->action);
> > > +	hrxq->action = NULL;
> > > +#endif
> > >  	claim_zero(mlx5_devx_cmd_destroy(hrxq->tir));
> > >  }
> > >
> > > diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
> > > index eaf23d0df4..e518fe9bfd 100644
> > > --- a/drivers/net/mlx5/mlx5_rxq.c
> > > +++ b/drivers/net/mlx5/mlx5_rxq.c
> > > @@ -2861,12 +2861,6 @@ __mlx5_hrxq_remove(struct rte_eth_dev *dev,
> > > struct mlx5_hrxq *hrxq)  {
> > >  	struct mlx5_priv *priv = dev->data->dev_private;
> > >
> > > -#ifdef HAVE_IBV_FLOW_DV_SUPPORT
> > > -	if (hrxq->hws_flags)
> > > -		mlx5dr_action_destroy(hrxq->action);
> > > -	else
> > > -		mlx5_glue->destroy_flow_action(hrxq->action);
> > > -#endif
> > >  	priv->obj_ops.hrxq_destroy(hrxq);
> > >  	if (!hrxq->standalone) {
> > >  		mlx5_ind_table_obj_release(dev, hrxq->ind_table,
> > > --
> > > 2.27.0
  

Patch

diff --git a/drivers/net/mlx5/mlx5_devx.c b/drivers/net/mlx5/mlx5_devx.c
index 6886ae1f22..09c8856f05 100644
--- a/drivers/net/mlx5/mlx5_devx.c
+++ b/drivers/net/mlx5/mlx5_devx.c
@@ -907,6 +907,13 @@  mlx5_devx_hrxq_new(struct rte_eth_dev *dev, struct mlx5_hrxq *hrxq,
 static void
 mlx5_devx_tir_destroy(struct mlx5_hrxq *hrxq)
 {
+#if defined(HAVE_IBV_FLOW_DV_SUPPORT) || !defined(HAVE_INFINIBAND_VERBS_H)
+	if (hrxq->hws_flags)
+		mlx5dr_action_destroy(hrxq->action);
+	else
+		mlx5_flow_os_destroy_flow_action(hrxq->action);
+	hrxq->action = NULL;
+#endif
 	claim_zero(mlx5_devx_cmd_destroy(hrxq->tir));
 }
 
diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c
index eaf23d0df4..e518fe9bfd 100644
--- a/drivers/net/mlx5/mlx5_rxq.c
+++ b/drivers/net/mlx5/mlx5_rxq.c
@@ -2861,12 +2861,6 @@  __mlx5_hrxq_remove(struct rte_eth_dev *dev, struct mlx5_hrxq *hrxq)
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
 
-#ifdef HAVE_IBV_FLOW_DV_SUPPORT
-	if (hrxq->hws_flags)
-		mlx5dr_action_destroy(hrxq->action);
-	else
-		mlx5_glue->destroy_flow_action(hrxq->action);
-#endif
 	priv->obj_ops.hrxq_destroy(hrxq);
 	if (!hrxq->standalone) {
 		mlx5_ind_table_obj_release(dev, hrxq->ind_table,