qede: Initialize lock and slowpath workqueue early
authorMintz, Yuval <Yuval.Mintz@cavium.com>
Mon, 20 Feb 2017 20:43:34 +0000 (22:43 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 20 Feb 2017 22:11:54 +0000 (17:11 -0500)
Need to make sure the slowpath workqueue and the qede lock
are ready for the registration of the netdevice, as once
registered there's no guarantee those wouldn't be used.

Signed-off-by: Yuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/qlogic/qede/qede_main.c

index d163e72aa2a6601ce634a50ce63313703364c8bc..7a8e07d0e01c376f64551fdef508c00ee5fcb19f 100644 (file)
@@ -854,6 +854,13 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
        if (rc)
                goto err3;
 
+       /* Prepare the lock prior to the registeration of the netdev,
+        * as once it's registered we might reach flows requiring it
+        * [it's even possible to reach a flow needing it directly
+        * from there, although it's unlikely].
+        */
+       INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task);
+       mutex_init(&edev->qede_lock);
        rc = register_netdev(edev->ndev);
        if (rc) {
                DP_NOTICE(edev, "Cannot register net-device\n");
@@ -878,8 +885,6 @@ static int __qede_probe(struct pci_dev *pdev, u32 dp_module, u8 dp_level,
                qede_set_dcbnl_ops(edev->ndev);
 #endif
 
-       INIT_DELAYED_WORK(&edev->sp_task, qede_sp_task);
-       mutex_init(&edev->qede_lock);
        edev->rx_copybreak = QEDE_RX_HDR_SIZE;
 
        DP_INFO(edev, "Ending successfully qede probe\n");