Fix the resource leak problem in the abnormal logic of device initialize function.
Fixes: f26e82397f6d ("net/nfp: implement xstats") Fixes: 547137405be7 ("net/nfp: initialize IPsec related content") Cc: james.hers...@corigine.com Cc: chang.m...@corigine.com Cc: sta...@dpdk.org Signed-off-by: Chaoyong He <chaoyong...@corigine.com> Reviewed-by: Long Wu <long...@corigine.com> Reviewed-by: Peng Zhang <peng.zh...@corigine.com> --- drivers/net/nfp/nfp_ethdev.c | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/drivers/net/nfp/nfp_ethdev.c b/drivers/net/nfp/nfp_ethdev.c index f02caf8056..25feb8e394 100644 --- a/drivers/net/nfp/nfp_ethdev.c +++ b/drivers/net/nfp/nfp_ethdev.c @@ -590,9 +590,6 @@ nfp_net_init(struct rte_eth_dev *eth_dev) net_hw->mac_stats = net_hw->mac_stats_bar; } else { - if (pf_dev->ctrl_bar == NULL) - return -ENODEV; - /* Use port offset in pf ctrl_bar for this ports control bar */ hw->ctrl_bar = pf_dev->ctrl_bar + (port * NFP_NET_CFG_BAR_SZ); net_hw->mac_stats = app_fw_nic->ports[0]->mac_stats_bar + @@ -604,18 +601,19 @@ nfp_net_init(struct rte_eth_dev *eth_dev) err = nfp_net_common_init(pci_dev, net_hw); if (err != 0) - return err; + goto free_area; err = nfp_net_tlv_caps_parse(eth_dev); if (err != 0) { PMD_INIT_LOG(ERR, "Failed to parser TLV caps"); return err; + goto free_area; } err = nfp_ipsec_init(eth_dev); if (err != 0) { PMD_INIT_LOG(ERR, "Failed to init IPsec module"); - return err; + goto free_area; } nfp_net_ethdev_ops_mount(net_hw, eth_dev); @@ -625,7 +623,8 @@ nfp_net_init(struct rte_eth_dev *eth_dev) if (net_hw->eth_xstats_base == NULL) { PMD_INIT_LOG(ERR, "no memory for xstats base values on device %s!", pci_dev->device.name); - return -ENOMEM; + err = -ENOMEM; + goto ipsec_exit; } /* Work out where in the BAR the queues start. */ @@ -655,7 +654,8 @@ nfp_net_init(struct rte_eth_dev *eth_dev) eth_dev->data->mac_addrs = rte_zmalloc("mac_addr", RTE_ETHER_ADDR_LEN, 0); if (eth_dev->data->mac_addrs == NULL) { PMD_INIT_LOG(ERR, "Failed to space for MAC address"); - return -ENOMEM; + err = -ENOMEM; + goto xstats_free; } nfp_net_pf_read_mac(app_fw_nic, port); @@ -693,6 +693,16 @@ nfp_net_init(struct rte_eth_dev *eth_dev) nfp_net_stats_reset(eth_dev); return 0; + +xstats_free: + rte_free(net_hw->eth_xstats_base); +ipsec_exit: + nfp_ipsec_uninit(eth_dev); +free_area: + if (net_hw->mac_stats_area != NULL) + nfp_cpp_area_release_free(net_hw->mac_stats_area); + + return err; } #define DEFAULT_FW_PATH "/lib/firmware/netronome" -- 2.39.1