From: Slava Ovsiienko <viacheslavo@mellanox.com>
To: Jack Min <jackmin@mellanox.com>, Shahaf Shuler <shahafs@mellanox.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>,
"stable@dpdk.org" <stable@dpdk.org>,
Zengmo Gao <gaozengmo@jd.com>
Subject: Re: [dpdk-stable] [dpdk-dev] [PATCH] net/mlx5: fix segfault when create hash rxq of drop
Date: Mon, 21 Oct 2019 05:01:04 +0000 [thread overview]
Message-ID: <AM4PR05MB3265F6ACBC8779D45015A754D2690@AM4PR05MB3265.eurprd05.prod.outlook.com> (raw)
In-Reply-To: <5457ba5f9334191a03696e630fde2ddbe31ad879.1571305289.git.jackmin@mellanox.com>
> -----Original Message-----
> From: dev <dev-bounces@dpdk.org> On Behalf Of Xiaoyu Min
> Sent: Thursday, October 17, 2019 13:50
> To: Shahaf Shuler <shahafs@mellanox.com>; Yongseok Koh
> <yskoh@mellanox.com>
> Cc: dev@dpdk.org; stable@dpdk.org; Zengmo Gao <gaozengmo@jd.com>
> Subject: [dpdk-dev] [PATCH] net/mlx5: fix segfault when create hash rxq of
> drop
>
> When to create hrxq for the drop, it could fail on creating qp and goto the
> error handle which will release created ind_table by calling drop release
> function, which takes rte_ethdev as the only parameter and uses the
> priv->drop_queue.hrxq as input to release.
>
> Unfortunately, at this point, the hrxq is not allocated and
> priv->drop_queue.hrxq is still NULL, which leads to a segfault.
>
> This patch fixes the above by allocating the hrxq at first place and when the
> error happens, hrxq is released as the last one.
>
> This patch also release other allocated resources by the correct order, which
> is missing previously.
>
> Fixes: 78be885295b8 ("net/mlx5: handle drop queues as regular queues")
> Cc: stable@dpdk.org
>
> Reported-by: Zengmo Gao <gaozengmo@jd.com>
> Signed-off-by: Xiaoyu Min <jackmin@mellanox.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@mellanox.com>
> ---
> drivers/net/mlx5/mlx5_rxq.c | 38 +++++++++++++++++++++++--------------
> 1 file changed, 24 insertions(+), 14 deletions(-)
>
> diff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c index
> 0db065a22c..f0ab8438d3 100644
> --- a/drivers/net/mlx5/mlx5_rxq.c
> +++ b/drivers/net/mlx5/mlx5_rxq.c
> @@ -2536,17 +2536,27 @@ struct mlx5_hrxq * mlx5_hrxq_drop_new(struct
> rte_eth_dev *dev) {
> struct mlx5_priv *priv = dev->data->dev_private;
> - struct mlx5_ind_table_obj *ind_tbl;
> - struct ibv_qp *qp;
> - struct mlx5_hrxq *hrxq;
> + struct mlx5_ind_table_obj *ind_tbl = NULL;
> + struct ibv_qp *qp = NULL;
> + struct mlx5_hrxq *hrxq = NULL;
>
> if (priv->drop_queue.hrxq) {
> rte_atomic32_inc(&priv->drop_queue.hrxq->refcnt);
> return priv->drop_queue.hrxq;
> }
> + hrxq = rte_calloc(__func__, 1, sizeof(*hrxq), 0);
> + if (!hrxq) {
> + DRV_LOG(WARNING,
> + "port %u cannot allocate memory for drop queue",
> + dev->data->port_id);
> + rte_errno = ENOMEM;
> + goto error;
> + }
> + priv->drop_queue.hrxq = hrxq;
> ind_tbl = mlx5_ind_table_obj_drop_new(dev);
> if (!ind_tbl)
> - return NULL;
> + goto error;
> + hrxq->ind_table = ind_tbl;
> qp = mlx5_glue->create_qp_ex(priv->sh->ctx,
> &(struct ibv_qp_init_attr_ex){
> .qp_type = IBV_QPT_RAW_PACKET,
> @@ -2570,15 +2580,6 @@ mlx5_hrxq_drop_new(struct rte_eth_dev *dev)
> rte_errno = errno;
> goto error;
> }
> - hrxq = rte_calloc(__func__, 1, sizeof(*hrxq), 0);
> - if (!hrxq) {
> - DRV_LOG(WARNING,
> - "port %u cannot allocate memory for drop queue",
> - dev->data->port_id);
> - rte_errno = ENOMEM;
> - goto error;
> - }
> - hrxq->ind_table = ind_tbl;
> hrxq->qp = qp;
> #ifdef HAVE_IBV_FLOW_DV_SUPPORT
> hrxq->action = mlx5_glue-
> >dv_create_flow_action_dest_ibv_qp(hrxq->qp);
> @@ -2587,12 +2588,21 @@ mlx5_hrxq_drop_new(struct rte_eth_dev *dev)
> goto error;
> }
> #endif
> - priv->drop_queue.hrxq = hrxq;
> rte_atomic32_set(&hrxq->refcnt, 1);
> return hrxq;
> error:
> +#ifdef HAVE_IBV_FLOW_DV_SUPPORT
> + if (hrxq && hrxq->action)
> + mlx5_glue->destroy_flow_action(hrxq->action);
> +#endif
> + if (qp)
> + claim_zero(mlx5_glue->destroy_qp(hrxq->qp));
> if (ind_tbl)
> mlx5_ind_table_obj_drop_release(dev);
> + if (hrxq) {
> + priv->drop_queue.hrxq = NULL;
> + rte_free(hrxq);
> + }
> return NULL;
> }
>
> --
> 2.23.0
next prev parent reply other threads:[~2019-10-21 5:01 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-17 10:49 [dpdk-stable] " Xiaoyu Min
2019-10-21 5:01 ` Slava Ovsiienko [this message]
2019-10-21 12:04 ` [dpdk-stable] [dpdk-dev] " Raslan Darawsheh
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=AM4PR05MB3265F6ACBC8779D45015A754D2690@AM4PR05MB3265.eurprd05.prod.outlook.com \
--to=viacheslavo@mellanox.com \
--cc=dev@dpdk.org \
--cc=gaozengmo@jd.com \
--cc=jackmin@mellanox.com \
--cc=shahafs@mellanox.com \
--cc=stable@dpdk.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).