Commit 71430451 authored by Przemek Kitszel's avatar Przemek Kitszel Committed by Tony Nguyen
Browse files

ice: ice_init_pf: destroy mutexes and xarrays on memory alloc failure



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

Signed-off-by: default avatarPrzemek Kitszel <przemyslaw.kitszel@intel.com>
Reviewed-by: default avatarAleksandr Loktionov <aleksandr.loktionov@intel.com>
Tested-by: Rinitha S <sx.rinitha@intel.com> (A Contingent worker at Intel)
Signed-off-by: default avatarTony Nguyen <anthony.l.nguyen@intel.com>
parent 2fe18288
Loading
Loading
Loading
Loading
+12 −19
Original line number Diff line number Diff line
@@ -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;
}

/**