Michael Chan wrote:
diff -rup a/drivers/net/bnx2.c b/drivers/net/bnx2.c
--- a/drivers/net/bnx2.c        2005-08-19 10:46:53.000000000 -0700
+++ b/drivers/net/bnx2.c        2005-08-24 11:59:51.000000000 -0700
@@ -3975,12 +3975,17 @@ bnx2_reset_task(void *data)
 {
        struct bnx2 *bp = data;
+ if (!netif_running(bp->dev))
+               return;
+
+       bp->in_reset_task = 1;
        bnx2_netif_stop(bp);
bnx2_init_nic(bp); atomic_set(&bp->intr_sem, 1);
        bnx2_netif_start(bp);
+       bp->in_reset_task = 0;
 }
static void
@@ -4172,7 +4177,13 @@ bnx2_close(struct net_device *dev)
        struct bnx2 *bp = dev->priv;
        u32 reset_code;
- flush_scheduled_work();
+       /* Calling flush_scheduled_work() may deadlock because
+        * linkwatch_event() may be on the workqueue and it will try to get
+        * the rtnl_lock which we are holding.
+        */
+       while (bp->in_reset_task)
+               msleep(1);
+


My gut feeling says that we will revisit this code change in the future, since there are no wmb()'s or test_bit()/set_bit()/clear_bit() calls used for atomicity guarantees.

But since I don't see a specific case, I guess I should go ahead and ACK all five updated patches.

        Jeff


-
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to