If we don't clear mac_addrs, ethdev will double free it on cleanup. Fixes: e16adf08e54d ("ethdev: free all common data when releasing port") Cc: sta...@dpdk.org
Signed-off-by: David Marchand <david.march...@redhat.com> --- drivers/net/ark/ark_ethdev.c | 6 +++--- drivers/net/axgbe/axgbe_ethdev.c | 1 + drivers/net/i40e/i40e_ethdev.c | 1 + drivers/net/ice/ice_ethdev.c | 1 + drivers/net/thunderx/nicvf_ethdev.c | 1 + 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c index 7fd784c..86e500e 100644 --- a/drivers/net/ark/ark_ethdev.c +++ b/drivers/net/ark/ark_ethdev.c @@ -403,9 +403,9 @@ static void eth_ark_macaddr_remove(struct rte_eth_dev *dev, return ret; - error: - if (dev->data->mac_addrs) - rte_free(dev->data->mac_addrs); +error: + rte_free(dev->data->mac_addrs); + dev->data->mac_addrs = NULL; return -1; } diff --git a/drivers/net/axgbe/axgbe_ethdev.c b/drivers/net/axgbe/axgbe_ethdev.c index 6b3bc3e..cfb1720 100644 --- a/drivers/net/axgbe/axgbe_ethdev.c +++ b/drivers/net/axgbe/axgbe_ethdev.c @@ -700,6 +700,7 @@ static void axgbe_default_config(struct axgbe_port *pdata) ret = pdata->phy_if.phy_init(pdata); if (ret) { rte_free(eth_dev->data->mac_addrs); + eth_dev->data->mac_addrs = NULL; return ret; } diff --git a/drivers/net/i40e/i40e_ethdev.c b/drivers/net/i40e/i40e_ethdev.c index 3cf2c1b..69a9cff 100644 --- a/drivers/net/i40e/i40e_ethdev.c +++ b/drivers/net/i40e/i40e_ethdev.c @@ -1600,6 +1600,7 @@ static inline void i40e_config_automask(struct i40e_pf *pf) rte_free(pf->ethertype.hash_map); err_init_ethtype_filter_list: rte_free(dev->data->mac_addrs); + dev->data->mac_addrs = NULL; err_mac_alloc: i40e_vsi_release(pf->main_vsi); err_setup_pf_switch: diff --git a/drivers/net/ice/ice_ethdev.c b/drivers/net/ice/ice_ethdev.c index bdbceb4..a7de455 100644 --- a/drivers/net/ice/ice_ethdev.c +++ b/drivers/net/ice/ice_ethdev.c @@ -1466,6 +1466,7 @@ static int ice_load_pkg(struct rte_eth_dev *dev) ice_res_pool_destroy(&pf->msix_pool); err_msix_pool_init: rte_free(dev->data->mac_addrs); + dev->data->mac_addrs = NULL; err_init_mac: ice_sched_cleanup_all(hw); rte_free(hw->port_info); diff --git a/drivers/net/thunderx/nicvf_ethdev.c b/drivers/net/thunderx/nicvf_ethdev.c index eb2c11d..ec57692 100644 --- a/drivers/net/thunderx/nicvf_ethdev.c +++ b/drivers/net/thunderx/nicvf_ethdev.c @@ -2206,6 +2206,7 @@ static void nicvf_vf_stop(struct rte_eth_dev *dev, struct nicvf *nic, malloc_fail: rte_free(eth_dev->data->mac_addrs); + eth_dev->data->mac_addrs = NULL; alarm_fail: nicvf_periodic_alarm_stop(nicvf_interrupt, eth_dev); fail: -- 1.8.3.1