]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-client.git/commitdiff
RDMA/bng_re: Unwind bng_re_dev_init properly
authorSiva Reddy Kallam <siva.kallam@broadcom.com>
Wed, 18 Feb 2026 09:12:46 +0000 (09:12 +0000)
committerLeon Romanovsky <leonro@nvidia.com>
Tue, 24 Feb 2026 08:56:28 +0000 (03:56 -0500)
Fix below smatch warning:
drivers/infiniband/hw/bng_re/bng_dev.c:270
bng_re_dev_init() warn: missing unwind goto?

Current bng_re_dev_init function is not having clear unwinding code.
So, added proper unwinding with ladder.

Fixes: 4f830cd8d7fe ("RDMA/bng_re: Add infrastructure for enabling Firmware channel")
Reported-by: Simon Horman <horms@kernel.org>
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <error27@gmail.com>
Closes: https://lore.kernel.org/r/202601010413.sWadrQel-lkp@intel.com/
Signed-off-by: Siva Reddy Kallam <siva.kallam@broadcom.com>
Link: https://patch.msgid.link/20260218091246.1764808-3-siva.kallam@broadcom.com
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
drivers/infiniband/hw/bng_re/bng_dev.c

index b8df807c3a642e5a41f56cc4b064cc99a2d7ca65..d34b5f88cd40b4c378078950bf15aa32fb6f3c4a 100644 (file)
@@ -285,7 +285,7 @@ static int bng_re_dev_init(struct bng_re_dev *rdev)
        if (rc) {
                ibdev_err(&rdev->ibdev,
                                "Failed to register with netedev: %#x\n", rc);
-               return -EINVAL;
+               goto reg_netdev_fail;
        }
 
        set_bit(BNG_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
@@ -294,19 +294,16 @@ static int bng_re_dev_init(struct bng_re_dev *rdev)
                ibdev_err(&rdev->ibdev,
                          "RoCE requires minimum 2 MSI-X vectors, but only %d reserved\n",
                          rdev->aux_dev->auxr_info->msix_requested);
-               bnge_unregister_dev(rdev->aux_dev);
-               clear_bit(BNG_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
-               return -EINVAL;
+               rc = -EINVAL;
+               goto msix_ctx_fail;
        }
        ibdev_dbg(&rdev->ibdev, "Got %d MSI-X vectors\n",
                  rdev->aux_dev->auxr_info->msix_requested);
 
        rc = bng_re_setup_chip_ctx(rdev);
        if (rc) {
-               bnge_unregister_dev(rdev->aux_dev);
-               clear_bit(BNG_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
                ibdev_err(&rdev->ibdev, "Failed to get chip context\n");
-               return -EINVAL;
+               goto msix_ctx_fail;
        }
 
        bng_re_query_hwrm_version(rdev);
@@ -315,16 +312,14 @@ static int bng_re_dev_init(struct bng_re_dev *rdev)
        if (rc) {
                ibdev_err(&rdev->ibdev,
                          "Failed to allocate RCFW Channel: %#x\n", rc);
-               goto fail;
+               goto alloc_fw_chl_fail;
        }
 
        /* Allocate nq record memory */
        rdev->nqr = kzalloc_obj(*rdev->nqr);
        if (!rdev->nqr) {
-               bng_re_destroy_chip_ctx(rdev);
-               bnge_unregister_dev(rdev->aux_dev);
-               clear_bit(BNG_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
-               return -ENOMEM;
+               rc = -ENOMEM;
+               goto nq_alloc_fail;
        }
 
        rdev->nqr->num_msix = rdev->aux_dev->auxr_info->msix_requested;
@@ -393,9 +388,15 @@ disable_rcfw:
 free_ring:
        bng_re_net_ring_free(rdev, rdev->rcfw.creq.ring_id, type);
 free_rcfw:
+       kfree(rdev->nqr);
+nq_alloc_fail:
        bng_re_free_rcfw_channel(&rdev->rcfw);
-fail:
-       bng_re_dev_uninit(rdev);
+alloc_fw_chl_fail:
+       bng_re_destroy_chip_ctx(rdev);
+msix_ctx_fail:
+       bnge_unregister_dev(rdev->aux_dev);
+       clear_bit(BNG_RE_FLAG_NETDEV_REGISTERED, &rdev->flags);
+reg_netdev_fail:
        return rc;
 }