From 8c1e5c658c24553d5f813adc8afed8910e6f5194 Mon Sep 17 00:00:00 2001 From: Yunjian Wang Date: Fri, 24 Dec 2021 19:26:38 +0800 Subject: [PATCH] net/ixgbe: check filter init failure The function ixgbe_fdir_filter_init() and ixgbe_l2_tn_filter_init() could return errors, the return value need to be checked and returned. Fixes: 080e3c0ee989 ("net/ixgbe: store flow director filter") Fixes: d0c0c416ef1f ("net/ixgbe: store L2 tunnel filter") Cc: stable@dpdk.org Signed-off-by: Yunjian Wang Acked-by: Haiyue Wang --- drivers/net/ixgbe/ixgbe_ethdev.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/drivers/net/ixgbe/ixgbe_ethdev.c b/drivers/net/ixgbe/ixgbe_ethdev.c index c8f0460440..2f4ebb4e59 100644 --- a/drivers/net/ixgbe/ixgbe_ethdev.c +++ b/drivers/net/ixgbe/ixgbe_ethdev.c @@ -1223,13 +1223,8 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused) /* initialize PF if max_vfs not zero */ ret = ixgbe_pf_host_init(eth_dev); - if (ret) { - rte_free(eth_dev->data->mac_addrs); - eth_dev->data->mac_addrs = NULL; - rte_free(eth_dev->data->hash_mac_addrs); - eth_dev->data->hash_mac_addrs = NULL; - return ret; - } + if (ret) + goto err_pf_host_init; ctrl_ext = IXGBE_READ_REG(hw, IXGBE_CTRL_EXT); /* let hardware know driver is loaded */ @@ -1268,10 +1263,14 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused) TAILQ_INIT(&filter_info->fivetuple_list); /* initialize flow director filter list & hash */ - ixgbe_fdir_filter_init(eth_dev); + ret = ixgbe_fdir_filter_init(eth_dev); + if (ret) + goto err_fdir_filter_init; /* initialize l2 tunnel filter list & hash */ - ixgbe_l2_tn_filter_init(eth_dev); + ret = ixgbe_l2_tn_filter_init(eth_dev); + if (ret) + goto err_l2_tn_filter_init; /* initialize flow filter lists */ ixgbe_filterlist_init(); @@ -1283,6 +1282,21 @@ eth_ixgbe_dev_init(struct rte_eth_dev *eth_dev, void *init_params __rte_unused) ixgbe_tm_conf_init(eth_dev); return 0; + +err_l2_tn_filter_init: + ixgbe_fdir_filter_uninit(eth_dev); +err_fdir_filter_init: + ixgbe_disable_intr(hw); + rte_intr_disable(intr_handle); + rte_intr_callback_unregister(intr_handle, + ixgbe_dev_interrupt_handler, eth_dev); + ixgbe_pf_host_uninit(eth_dev); +err_pf_host_init: + rte_free(eth_dev->data->mac_addrs); + eth_dev->data->mac_addrs = NULL; + rte_free(eth_dev->data->hash_mac_addrs); + eth_dev->data->hash_mac_addrs = NULL; + return ret; } static int -- 2.20.1