qed: Don't ignore devlink allocation failures
authorLeon Romanovsky <leonro@nvidia.com>
Thu, 23 Sep 2021 18:12:53 +0000 (21:12 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Nov 2021 18:16:25 +0000 (19:16 +0100)
[ Upstream commit e6a54d6f221301347aaf9d83bb1f23129325c1c5 ]

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: 755f982bb1ff ("qed/qede: make devlink survive recovery")
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/qlogic/qede/qede_main.c
drivers/scsi/qedf/qedf_main.c

index 9837bdb89cd40300c579fbd5f4f0dbf0a79a5ea4..ee4c3bd28a934cfb667338f118dab9246b4b886e 100644 (file)
@@ -1176,19 +1176,17 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
                edev->devlink = qed_ops->common->devlink_register(cdev);
                if (IS_ERR(edev->devlink)) {
                        DP_NOTICE(edev, "Cannot register devlink\n");
+                       rc = PTR_ERR(edev->devlink);
                        edev->devlink = NULL;
-                       /* Go on, we can live without devlink */
+                       goto err3;
                }
        } else {
                struct net_device *ndev = pci_get_drvdata(pdev);
+               struct qed_devlink *qdl;
 
                edev = netdev_priv(ndev);
-
-               if (edev->devlink) {
-                       struct qed_devlink *qdl = devlink_priv(edev->devlink);
-
-                       qdl->cdev = cdev;
-               }
+               qdl = devlink_priv(edev->devlink);
+               qdl->cdev = cdev;
                edev->cdev = cdev;
                memset(&edev->stats, 0, sizeof(edev->stats));
                memcpy(&edev->dev_info, &dev_info, sizeof(dev_info));
index 42d0d941dba5c30bba493cd2f57df05da8aced1f..94ee08fab46a56c1dd4946a822015421157209dd 100644 (file)
@@ -3416,7 +3416,9 @@ retry_probe:
                qedf->devlink = qed_ops->common->devlink_register(qedf->cdev);
                if (IS_ERR(qedf->devlink)) {
                        QEDF_ERR(&qedf->dbg_ctx, "Cannot register devlink\n");
+                       rc = PTR_ERR(qedf->devlink);
                        qedf->devlink = NULL;
+                       goto err2;
                }
        }