]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ice: ice_init_pf: destroy mutexes and xarrays on memory alloc failure
authorPrzemek Kitszel <przemyslaw.kitszel@intel.com>
Fri, 12 Sep 2025 13:06:22 +0000 (15:06 +0200)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Fri, 24 Oct 2025 20:24:00 +0000 (13:24 -0700)
Unroll actions of ice_init_pf() when it fails.
ice_deinit_pf() happens to be perfect to call here.

Signed-off-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: Aleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: Rinitha S <sx.rinitha@intel.com> (A Contingent worker at Intel)
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_main.c

index e00c282a8c18f1737fde9cf65cec08bb31b396b7..09dee43e48aab4f0468d61386bdcbcfb7c029d34 100644 (file)
@@ -3951,6 +3951,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);
@@ -4055,25 +4057,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;
-       }
-
-       pf->txtime_txqs = bitmap_zalloc(pf->max_pf_txqs, GFP_KERNEL);
-       if (!pf->txtime_txqs) {
-               bitmap_free(pf->avail_txqs);
-               pf->avail_txqs = NULL;
-               bitmap_free(pf->avail_rxqs);
-               pf->avail_rxqs = NULL;
-               return -ENOMEM;
-       }
 
        mutex_init(&pf->vfs.table_lock);
        hash_init(pf->vfs.table);
@@ -4086,7 +4069,17 @@ 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);
+       pf->txtime_txqs = bitmap_zalloc(pf->max_pf_txqs, GFP_KERNEL);
+       if (!pf->avail_txqs || !pf->avail_rxqs || !pf->txtime_txqs)
+               goto undo_init;
+
        return 0;
+undo_init:
+       /* deinit handles half-initialized pf just fine */
+       ice_deinit_pf(pf);
+       return -ENOMEM;
 }
 
 /**