]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
octeontx2-af: Fix error handling
authorRatheesh Kannoth <rkannoth@marvell.com>
Wed, 21 Jan 2026 03:39:34 +0000 (09:09 +0530)
committerJakub Kicinski <kuba@kernel.org>
Thu, 22 Jan 2026 04:05:02 +0000 (20:05 -0800)
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: 746ea74241fa0 ("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>
drivers/net/ethernet/marvell/octeontx2/af/rvu.c

index 2d78e08f985f0c0eea355b2c1f1e686aa074ee25..747fbdf2a908f12805bc90e2daf2fdfd5a7d7cc4 100644 (file)
@@ -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;
 }