ice_fdir_setup() returns directly when the filter list or counter
initialization fails, leaking the FDIR VSI, plus the filter hash table
and map in the counter case. Its other error paths release the queues
and the VSI, but not the hash table, hash map or counter pools.

As fdir_vsi is reset on failure, ice_fdir_teardown() cannot release
them later either. The hash table name also stays registered, so the
next FDIR setup for the device fails.

Release everything set up so far on all error paths.

Fixes: 1a2fc1799f09 ("net/ice: reject duplicated flow for flow director")
Fixes: 0f880c3df192 ("net/ice: add flow director counter resource init/release")
Fixes: 84dc7a95a2d3 ("net/ice: enable flow director engine")

Signed-off-by: Anurag Mandal <[email protected]>
---
 drivers/net/intel/ice/ice_fdir_filter.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/drivers/net/intel/ice/ice_fdir_filter.c 
b/drivers/net/intel/ice/ice_fdir_filter.c
index 2350bd5523..44604cfae6 100644
--- a/drivers/net/intel/ice/ice_fdir_filter.c
+++ b/drivers/net/intel/ice/ice_fdir_filter.c
@@ -477,13 +477,15 @@ ice_fdir_setup(struct ice_pf *pf)
        err = ice_fdir_init_filter_list(pf);
        if (err) {
                PMD_DRV_LOG(ERR, "Failed to init FDIR filter list.");
-               return -EINVAL;
+               err = -EINVAL;
+               goto fail_filter_list;
        }
 
        err = ice_fdir_counter_init(pf);
        if (err) {
                PMD_DRV_LOG(ERR, "Failed to init FDIR counter.");
-               return -EINVAL;
+               err = -EINVAL;
+               goto fail_counter;
        }
 
        /*Fdir tx queue setup*/
@@ -554,6 +556,10 @@ ice_fdir_setup(struct ice_pf *pf)
        ice_tx_queue_release(pf->fdir.txq);
        pf->fdir.txq = NULL;
 fail_setup_tx:
+       ice_fdir_counter_release(pf);
+fail_counter:
+       ice_fdir_release_filter_list(pf);
+fail_filter_list:
        ice_release_vsi(vsi);
        pf->fdir.fdir_vsi = NULL;
        return err;
-- 
2.25.1

Reply via email to