From: Michael Baum <michaelba@nvidia.com> To: dev@dpdk.org Cc: Matan Azrad <matan@nvidia.com>, Raslan Darawsheh <rasland@nvidia.com>, David Marchand <david.marchand@redhat.com>, stable@dpdk.org Subject: [dpdk-dev] [PATCH 2/2] net/mlx4: fix PCI probe error flow Date: Wed, 13 Jan 2021 16:28:53 +0000 Message-ID: <1610555333-18961-3-git-send-email-michaelba@nvidia.com> (raw) In-Reply-To: <1610555333-18961-1-git-send-email-michaelba@nvidia.com> In mlx4 PCI probing, there are some validations for the Ethernet device configuration. From each PCI device the function creates one or two Ethernet devices. When one of validations fails during the creation of the second device, the first device is not freed what caused a memory leak. Free it. Fixes: 7fae69eeff13 ("mlx4: new poll mode driver") Cc: stable@dpdk.org Signed-off-by: Michael Baum <michaelba@nvidia.com> Acked-by: Matan Azrad <matan@nvidia.com> --- drivers/net/mlx4/mlx4.c | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/drivers/net/mlx4/mlx4.c b/drivers/net/mlx4/mlx4.c index 7460afa..92b0427 100644 --- a/drivers/net/mlx4/mlx4.c +++ b/drivers/net/mlx4/mlx4.c @@ -860,6 +860,7 @@ struct mlx4_conf { struct ibv_pd *pd = NULL; struct mlx4_priv *priv = NULL; struct rte_eth_dev *eth_dev = NULL; + struct rte_eth_dev *prev_dev = NULL; struct rte_ether_addr mac; char name[RTE_ETH_NAME_MAX_LEN]; @@ -880,7 +881,7 @@ struct mlx4_conf { ERROR("can not attach rte ethdev"); rte_errno = ENOMEM; err = rte_errno; - goto error; + goto err_secondary; } priv = eth_dev->data->dev_private; if (!priv->verbs_alloc_ctx.enabled) { @@ -889,24 +890,24 @@ struct mlx4_conf { " from Verbs"); rte_errno = ENOTSUP; err = rte_errno; - goto error; + goto err_secondary; } eth_dev->device = &pci_dev->device; eth_dev->dev_ops = &mlx4_dev_sec_ops; err = mlx4_proc_priv_init(eth_dev); if (err) - goto error; + goto err_secondary; /* Receive command fd from primary process. */ err = mlx4_mp_req_verbs_cmd_fd(eth_dev); if (err < 0) { err = rte_errno; - goto error; + goto err_secondary; } /* Remap UAR for Tx queues. */ err = mlx4_tx_uar_init_secondary(eth_dev, err); if (err) { err = rte_errno; - goto error; + goto err_secondary; } /* * Ethdev pointer is still required as input since @@ -918,7 +919,14 @@ struct mlx4_conf { claim_zero(mlx4_glue->close_device(ctx)); rte_eth_copy_pci_info(eth_dev, pci_dev); rte_eth_dev_probing_finish(eth_dev); + prev_dev = eth_dev; continue; +err_secondary: + claim_zero(mlx4_glue->close_device(ctx)); + rte_eth_dev_release_port(eth_dev); + if (prev_dev) + rte_eth_dev_release_port(prev_dev); + break; } /* Check port status. */ err = mlx4_glue->query_port(ctx, port, &port_attr); @@ -1093,6 +1101,7 @@ struct mlx4_conf { priv, mem_event_cb); rte_rwlock_write_unlock(&mlx4_shared_data->mem_event_rwlock); rte_eth_dev_probing_finish(eth_dev); + prev_dev = eth_dev; continue; port_error: rte_free(priv); @@ -1107,14 +1116,10 @@ struct mlx4_conf { eth_dev->data->mac_addrs = NULL; rte_eth_dev_release_port(eth_dev); } + if (prev_dev) + mlx4_dev_close(prev_dev); break; } - /* - * XXX if something went wrong in the loop above, there is a resource - * leak (ctx, pd, priv, dpdk ethdev) but we can do nothing about it as - * long as the dpdk does not provide a way to deallocate a ethdev and a - * way to enumerate the registered ethdevs to free the previous ones. - */ error: if (attr_ctx) claim_zero(mlx4_glue->close_device(attr_ctx)); -- 1.8.3.1
prev parent reply other threads:[~2021-01-13 16:29 UTC|newest] Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-01-13 16:28 [dpdk-dev] [PATCH 0/2] net/mlx4: fix PCI probe and remove functions Michael Baum 2021-01-13 16:28 ` [dpdk-dev] [PATCH 1/2] net/mlx4: fix device detach Michael Baum 2021-01-14 8:32 ` David Marchand 2021-01-14 10:41 ` David Marchand 2021-01-20 8:14 ` [dpdk-dev] [PATCH v2 0/2] net/mlx4: fix PCI probe and remove functions Michael Baum 2021-01-20 8:14 ` [dpdk-dev] [PATCH v2 1/2] net/mlx4: fix device detach Michael Baum 2021-01-20 8:14 ` [dpdk-dev] [PATCH v2 2/2] net/mlx4: fix PCI probe error flow Michael Baum 2021-01-21 13:45 ` [dpdk-dev] [PATCH v2 0/2] net/mlx4: fix PCI probe and remove functions Raslan Darawsheh 2021-01-13 16:28 ` Michael Baum [this message]
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=1610555333-18961-3-git-send-email-michaelba@nvidia.com \ --to=michaelba@nvidia.com \ --cc=david.marchand@redhat.com \ --cc=dev@dpdk.org \ --cc=matan@nvidia.com \ --cc=rasland@nvidia.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
DPDK patches and discussions This inbox may be cloned and mirrored by anyone: git clone --mirror http://inbox.dpdk.org/dev/0 dev/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 dev dev/ http://inbox.dpdk.org/dev \ dev@dpdk.org public-inbox-index dev Example config snippet for mirrors. Newsgroup available over NNTP: nntp://inbox.dpdk.org/inbox.dpdk.dev AGPL code for this site: git clone https://public-inbox.org/public-inbox.git