When mana_per_port_queue_reset_work_handler() runs, it unconditionally
calls mana_detach() which attempts to tear down queues that are already
freed, leading to NULL pointer dereferences on apc->tx_qp and
apc->rxqs.

Check netif_device_present() in the reset handler and skip
mana_detach() when the port is already in detached state. This avoids
the redundant teardown and goes directly to mana_attach() to retry
bringing the port back up.

Fixes: 3b194343c250 ("net: mana: Implement ndo_tx_timeout and serialize queue 
resets per port.")
Reviewed-by: Haiyang Zhang <[email protected]>
Signed-off-by: Dipayaan Roy <[email protected]>
---
 drivers/net/ethernet/microsoft/mana/mana_en.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/drivers/net/ethernet/microsoft/mana/mana_en.c 
b/drivers/net/ethernet/microsoft/mana/mana_en.c
index 0582803907a8..907efadf6fd6 100644
--- a/drivers/net/ethernet/microsoft/mana/mana_en.c
+++ b/drivers/net/ethernet/microsoft/mana/mana_en.c
@@ -316,12 +316,19 @@ static void mana_per_port_queue_reset_work_handler(struct 
work_struct *work)
                goto out;
        }
 
+       /* If already detached (indicates detach succeeded but attach failed
+        * previously). Now skip mana detach and just retry mana_attach.
+        */
+       if (!netif_device_present(ndev))
+               goto attach;
+
        err = mana_detach(ndev, false);
        if (err) {
                netdev_err(ndev, "mana_detach failed: %d\n", err);
                goto dealloc_pre_rxbufs;
        }
 
+attach:
        err = mana_attach(ndev);
        if (err)
                netdev_err(ndev, "mana_attach failed: %d\n", err);
-- 
2.43.0


Reply via email to