Commit 19e4175e authored by Ratheesh Kannoth's avatar Ratheesh Kannoth Committed by Jakub Kicinski
Browse files

octeontx2-af: Fix error handling



This commit adds error handling and rollback logic to
rvu_mbox_handler_attach_resources() to properly clean up partially
attached resources when rvu_attach_block() fails.

Fixes: 746ea742 ("octeontx2-af: Add RVU block LF provisioning support")
Signed-off-by: default avatarRatheesh Kannoth <rkannoth@marvell.com>
Link: https://patch.msgid.link/20260121033934.1900761-1-rkannoth@marvell.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent e8ca461f
Loading
Loading
Loading
Loading
+64 −22
Original line number Diff line number Diff line
@@ -1551,7 +1551,7 @@ static int rvu_get_attach_blkaddr(struct rvu *rvu, int blktype,
	return -ENODEV;
}

static void rvu_attach_block(struct rvu *rvu, int pcifunc, int blktype,
static int rvu_attach_block(struct rvu *rvu, int pcifunc, int blktype,
			    int num_lfs, struct rsrc_attach *attach)
{
	struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, pcifunc);
@@ -1562,21 +1562,21 @@ static void rvu_attach_block(struct rvu *rvu, int pcifunc, int blktype,
	u64 cfg;

	if (!num_lfs)
		return;
		return -EINVAL;

	blkaddr = rvu_get_attach_blkaddr(rvu, blktype, pcifunc, attach);
	if (blkaddr < 0)
		return;
		return -EFAULT;

	block = &hw->block[blkaddr];
	if (!block->lf.bmap)
		return;
		return -ESRCH;

	for (slot = 0; slot < num_lfs; slot++) {
		/* Allocate the resource */
		lf = rvu_alloc_rsrc(&block->lf);
		if (lf < 0)
			return;
			return -EFAULT;

		cfg = (1ULL << 63) | (pcifunc << 8) | slot;
		rvu_write64(rvu, blkaddr, block->lfcfg_reg |
@@ -1587,6 +1587,8 @@ static void rvu_attach_block(struct rvu *rvu, int pcifunc, int blktype,
		/* Set start MSIX vector for this LF within this PF/VF */
		rvu_set_msix_offset(rvu, pfvf, block, lf);
	}

	return 0;
}

static int rvu_check_rsrc_availability(struct rvu *rvu,
@@ -1724,22 +1726,31 @@ int rvu_mbox_handler_attach_resources(struct rvu *rvu,
	int err;

	/* If first request, detach all existing attached resources */
	if (!attach->modify)
		rvu_detach_rsrcs(rvu, NULL, pcifunc);
	if (!attach->modify) {
		err = rvu_detach_rsrcs(rvu, NULL, pcifunc);
		if (err)
			return err;
	}

	mutex_lock(&rvu->rsrc_lock);

	/* Check if the request can be accommodated */
	err = rvu_check_rsrc_availability(rvu, attach, pcifunc);
	if (err)
		goto exit;
		goto fail1;

	/* Now attach the requested resources */
	if (attach->npalf)
		rvu_attach_block(rvu, pcifunc, BLKTYPE_NPA, 1, attach);
	if (attach->npalf) {
		err = rvu_attach_block(rvu, pcifunc, BLKTYPE_NPA, 1, attach);
		if (err)
			goto fail1;
	}

	if (attach->nixlf)
		rvu_attach_block(rvu, pcifunc, BLKTYPE_NIX, 1, attach);
	if (attach->nixlf) {
		err = rvu_attach_block(rvu, pcifunc, BLKTYPE_NIX, 1, attach);
		if (err)
			goto fail2;
	}

	if (attach->sso) {
		/* RVU func doesn't know which exact LF or slot is attached
@@ -1749,33 +1760,64 @@ int rvu_mbox_handler_attach_resources(struct rvu *rvu,
		 */
		if (attach->modify)
			rvu_detach_block(rvu, pcifunc, BLKTYPE_SSO);
		rvu_attach_block(rvu, pcifunc, BLKTYPE_SSO,
		err = rvu_attach_block(rvu, pcifunc, BLKTYPE_SSO,
				       attach->sso, attach);
		if (err)
			goto fail3;
	}

	if (attach->ssow) {
		if (attach->modify)
			rvu_detach_block(rvu, pcifunc, BLKTYPE_SSOW);
		rvu_attach_block(rvu, pcifunc, BLKTYPE_SSOW,
		err = rvu_attach_block(rvu, pcifunc, BLKTYPE_SSOW,
				       attach->ssow, attach);
		if (err)
			goto fail4;
	}

	if (attach->timlfs) {
		if (attach->modify)
			rvu_detach_block(rvu, pcifunc, BLKTYPE_TIM);
		rvu_attach_block(rvu, pcifunc, BLKTYPE_TIM,
		err = rvu_attach_block(rvu, pcifunc, BLKTYPE_TIM,
				       attach->timlfs, attach);
		if (err)
			goto fail5;
	}

	if (attach->cptlfs) {
		if (attach->modify &&
		    rvu_attach_from_same_block(rvu, BLKTYPE_CPT, attach))
			rvu_detach_block(rvu, pcifunc, BLKTYPE_CPT);
		rvu_attach_block(rvu, pcifunc, BLKTYPE_CPT,
		err = rvu_attach_block(rvu, pcifunc, BLKTYPE_CPT,
				       attach->cptlfs, attach);
		if (err)
			goto fail6;
	}

exit:
	mutex_unlock(&rvu->rsrc_lock);
	return 0;

fail6:
	if (attach->timlfs)
		rvu_detach_block(rvu, pcifunc, BLKTYPE_TIM);

fail5:
	if (attach->ssow)
		rvu_detach_block(rvu, pcifunc, BLKTYPE_SSOW);

fail4:
	if (attach->sso)
		rvu_detach_block(rvu, pcifunc, BLKTYPE_SSO);

fail3:
	if (attach->nixlf)
		rvu_detach_block(rvu, pcifunc, BLKTYPE_NIX);

fail2:
	if (attach->npalf)
		rvu_detach_block(rvu, pcifunc, BLKTYPE_NPA);

fail1:
	mutex_unlock(&rvu->rsrc_lock);
	return err;
}