fbnic: Fixup rtnl_lock and devl_lock handling related to mailbox code
authorAlexander Duyck <alexanderduyck@fb.com>
Mon, 25 Aug 2025 22:56:06 +0000 (15:56 -0700)
committerJakub Kicinski <kuba@kernel.org>
Thu, 28 Aug 2025 01:57:08 +0000 (18:57 -0700)
The exception handling path for the __fbnic_pm_resume function had a bug in
that it was taking the devlink lock and then exiting to exception handling
instead of waiting until after it released the lock to do so. In order to
handle that I am swapping the placement of the unlock and the exception
handling jump to label so that we don't trigger a deadlock by holding the
lock longer than we need to.

In addition this change applies the same ordering to the rtnl_lock/unlock
calls in the same function as it should make the code easier to follow if
it adheres to a consistent pattern.

Fixes: 82534f446daa ("eth: fbnic: Add devlink dev flash support")
Signed-off-by: Alexander Duyck <alexanderduyck@fb.com>
Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
Link: https://patch.msgid.link/175616256667.1963577.5543500806256052549.stgit@ahduyck-xeon-server.home.arpa
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/meta/fbnic/fbnic_pci.c

index b70e4cadb37bdf7bf9ed431a04ce3fcf8295c194..a7784deea88f0a67d70bb0d9d1d937dc4f3ebb30 100644 (file)
@@ -443,11 +443,10 @@ static int __fbnic_pm_resume(struct device *dev)
 
        /* Re-enable mailbox */
        err = fbnic_fw_request_mbx(fbd);
+       devl_unlock(priv_to_devlink(fbd));
        if (err)
                goto err_free_irqs;
 
-       devl_unlock(priv_to_devlink(fbd));
-
        /* Only send log history if log buffer is empty to prevent duplicate
         * log entries.
         */
@@ -464,20 +463,20 @@ static int __fbnic_pm_resume(struct device *dev)
 
        rtnl_lock();
 
-       if (netif_running(netdev)) {
+       if (netif_running(netdev))
                err = __fbnic_open(fbn);
-               if (err)
-                       goto err_free_mbx;
-       }
 
        rtnl_unlock();
+       if (err)
+               goto err_free_mbx;
 
        return 0;
 err_free_mbx:
        fbnic_fw_log_disable(fbd);
 
-       rtnl_unlock();
+       devl_lock(priv_to_devlink(fbd));
        fbnic_fw_free_mbx(fbd);
+       devl_unlock(priv_to_devlink(fbd));
 err_free_irqs:
        fbnic_free_irqs(fbd);
 err_invalidate_uc_addr: