bnxt_en: Check devlink allocation and registration status
authorLeon Romanovsky <leonro@nvidia.com>
Thu, 23 Sep 2021 18:12:48 +0000 (21:12 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Nov 2021 18:16:25 +0000 (19:16 +0100)
[ Upstream commit e624c70e1131e145bd0510b8a700b5e2d112e377 ]

devlink is a software interface that doesn't depend on any hardware
capabilities. The failure in SW means memory issues, wrong parameters,
programmer error e.t.c.

Like any other such interface in the kernel, the returned status of
devlink APIs should be checked and propagated further and not ignored.

Fixes: 4ab0c6a8ffd7 ("bnxt_en: add support to enable VF-representors")
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Reviewed-by: Edwin Peer <edwin.peer@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.c
drivers/net/ethernet/broadcom/bnxt/bnxt_devlink.h

index 62f84cc91e4d10b504b439f93c11c453930077d7..0fba01db336cc7d44e1e7e81753bc0f6dab9fb3d 100644 (file)
@@ -13370,7 +13370,9 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
        }
 
        bnxt_inv_fw_health_reg(bp);
-       bnxt_dl_register(bp);
+       rc = bnxt_dl_register(bp);
+       if (rc)
+               goto init_err_dl;
 
        rc = register_netdev(dev);
        if (rc)
@@ -13390,6 +13392,7 @@ static int bnxt_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
 
 init_err_cleanup:
        bnxt_dl_unregister(bp);
+init_err_dl:
        bnxt_shutdown_tc(bp);
        bnxt_clear_int_mode(bp);
 
index 9576547df4aba20c2d2d7459af6de3d8c557551b..2a80882971e3dad8170b8336feb977de989203bb 100644 (file)
@@ -134,7 +134,7 @@ void bnxt_dl_fw_reporters_create(struct bnxt *bp)
 {
        struct bnxt_fw_health *health = bp->fw_health;
 
-       if (!bp->dl || !health)
+       if (!health)
                return;
 
        if (!(bp->fw_cap & BNXT_FW_CAP_HOT_RESET) || health->fw_reset_reporter)
@@ -188,7 +188,7 @@ void bnxt_dl_fw_reporters_destroy(struct bnxt *bp, bool all)
 {
        struct bnxt_fw_health *health = bp->fw_health;
 
-       if (!bp->dl || !health)
+       if (!health)
                return;
 
        if ((all || !(bp->fw_cap & BNXT_FW_CAP_HOT_RESET)) &&
@@ -781,6 +781,7 @@ int bnxt_dl_register(struct bnxt *bp)
 {
        const struct devlink_ops *devlink_ops;
        struct devlink_port_attrs attrs = {};
+       struct bnxt_dl *bp_dl;
        struct devlink *dl;
        int rc;
 
@@ -795,7 +796,9 @@ int bnxt_dl_register(struct bnxt *bp)
                return -ENOMEM;
        }
 
-       bnxt_link_bp_to_dl(bp, dl);
+       bp->dl = dl;
+       bp_dl = devlink_priv(dl);
+       bp_dl->bp = bp;
 
        /* Add switchdev eswitch mode setting, if SRIOV supported */
        if (pci_find_ext_capability(bp->pdev, PCI_EXT_CAP_ID_SRIOV) &&
@@ -833,7 +836,6 @@ err_dl_port_unreg:
 err_dl_unreg:
        devlink_unregister(dl);
 err_dl_free:
-       bnxt_link_bp_to_dl(bp, NULL);
        devlink_free(dl);
        return rc;
 }
@@ -842,9 +844,6 @@ void bnxt_dl_unregister(struct bnxt *bp)
 {
        struct devlink *dl = bp->dl;
 
-       if (!dl)
-               return;
-
        if (BNXT_PF(bp)) {
                bnxt_dl_params_unregister(bp);
                devlink_port_unregister(&bp->dl_port);
index d889f240da2b2ce1ce52d9708cb7addda60492e0..406dc655a5fc9083285c3c7625d8429572c9a65e 100644 (file)
@@ -20,19 +20,6 @@ static inline struct bnxt *bnxt_get_bp_from_dl(struct devlink *dl)
        return ((struct bnxt_dl *)devlink_priv(dl))->bp;
 }
 
-/* To clear devlink pointer from bp, pass NULL dl */
-static inline void bnxt_link_bp_to_dl(struct bnxt *bp, struct devlink *dl)
-{
-       bp->dl = dl;
-
-       /* add a back pointer in dl to bp */
-       if (dl) {
-               struct bnxt_dl *bp_dl = devlink_priv(dl);
-
-               bp_dl->bp = bp;
-       }
-}
-
 #define NVM_OFF_MSIX_VEC_PER_PF_MAX    108
 #define NVM_OFF_MSIX_VEC_PER_PF_MIN    114
 #define NVM_OFF_IGNORE_ARI             164