Unroll actions of ice_init_pf() when it fails.
ice_deinit_pf() happens to be perfect to call here.

Signed-off-by: Przemek Kitszel <[email protected]>
---
 drivers/net/ethernet/intel/ice/ice_main.c | 21 +++++++++++----------
 1 file changed, 11 insertions(+), 10 deletions(-)

diff --git a/drivers/net/ethernet/intel/ice/ice_main.c 
b/drivers/net/ethernet/intel/ice/ice_main.c
index 3cf79afff1bd..f81603a754f9 100644
--- a/drivers/net/ethernet/intel/ice/ice_main.c
+++ b/drivers/net/ethernet/intel/ice/ice_main.c
@@ -3975,6 +3975,8 @@ u16 ice_get_avail_rxq_count(struct ice_pf *pf)
  */
 static void ice_deinit_pf(struct ice_pf *pf)
 {
+       /* note that we unroll also on ice_init_pf() failure here */
+
        mutex_destroy(&pf->lag_mutex);
        mutex_destroy(&pf->adev_mutex);
        mutex_destroy(&pf->sw_mutex);
@@ -4074,16 +4076,6 @@ static int ice_init_pf(struct ice_pf *pf)
        init_waitqueue_head(&pf->reset_wait_queue);
 
        mutex_init(&pf->avail_q_mutex);
-       pf->avail_txqs = bitmap_zalloc(pf->max_pf_txqs, GFP_KERNEL);
-       if (!pf->avail_txqs)
-               return -ENOMEM;
-
-       pf->avail_rxqs = bitmap_zalloc(pf->max_pf_rxqs, GFP_KERNEL);
-       if (!pf->avail_rxqs) {
-               bitmap_free(pf->avail_txqs);
-               pf->avail_txqs = NULL;
-               return -ENOMEM;
-       }
 
        mutex_init(&pf->vfs.table_lock);
        hash_init(pf->vfs.table);
@@ -4096,7 +4088,16 @@ static int ice_init_pf(struct ice_pf *pf)
        xa_init(&pf->dyn_ports);
        xa_init(&pf->sf_nums);
 
+       pf->avail_txqs = bitmap_zalloc(pf->max_pf_txqs, GFP_KERNEL);
+       pf->avail_rxqs = bitmap_zalloc(pf->max_pf_rxqs, GFP_KERNEL);
+       if (!pf->avail_txqs || !pf->avail_rxqs)
+               goto undo_init;
+
        return 0;
+undo_init:
+       /* deinit handles half-initialized pf just fine */
+       ice_deinit_pf(pf);
+       return -ENOMEM;
 }
 
 /**
-- 
2.39.3

Reply via email to