[1/7] net/nfp: fix resource leak for device initialization
Checks
Commit Message
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.hershaw@corigine.com
Cc: chang.miao@corigine.com
Cc: stable@dpdk.org
Signed-off-by: Chaoyong He <chaoyong.he@corigine.com>
Reviewed-by: Long Wu <long.wu@corigine.com>
Reviewed-by: Peng Zhang <peng.zhang@corigine.com>
---
drivers/net/nfp/nfp_ethdev.c | 24 +++++++++++++++++-------
1 file changed, 17 insertions(+), 7 deletions(-)
@@ -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"