mirror of
https://github.com/torvalds/linux.git
synced 2026-06-05 13:06:59 +02:00
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: 746ea74241 ("octeontx2-af: Add RVU block LF provisioning support")
Signed-off-by: Ratheesh Kannoth <rkannoth@marvell.com>
Link: https://patch.msgid.link/20260121033934.1900761-1-rkannoth@marvell.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
e8ca461f7d
commit
19e4175e99
|
|
@ -1551,8 +1551,8 @@ 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,
|
||||
int num_lfs, struct rsrc_attach *attach)
|
||||
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);
|
||||
struct rvu_hwinfo *hw = rvu->hw;
|
||||
|
|
@ -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,
|
||||
attach->sso, attach);
|
||||
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,
|
||||
attach->ssow, attach);
|
||||
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,
|
||||
attach->timlfs, attach);
|
||||
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,
|
||||
attach->cptlfs, attach);
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user