Commit:     469665459d26da8d0b46c70d070da1e192e48e46
Parent:     db3d99c090e0cdb34b1274767e062bfddbb384bc
Author:     Michael Chan <[EMAIL PROTECTED]>
AuthorDate: Wed Jul 11 19:47:19 2007 -0700
Committer:  David S. Miller <[EMAIL PROTECTED]>
CommitDate: Wed Jul 11 19:47:19 2007 -0700

    [TG3]: Fix irq_sync race condition.
    Gagan Arneja <[EMAIL PROTECTED]> pointed out that tg3_reset_task()
    could potentially race with another thread calling tg3_full_lock()
    such as the ethtool_set_xxx() functions.  This may trigger the
    BUG_ON() in tg3_irq_quiesce() or cause the irq_sync flag to be out-
    I think the easiest way to fix this is to get the tp->lock first
    before setting the irq_sync flag.  This is safe to do because the
    tp->lock is never grabbed by the irq handler.  This change will
    guarantee that the irq_sync flag updates will be serialized.  We also
    have to change one spot to call tg3_netif_start() (which clears the
    irq_sync flag) before releasing the tp->lock.
    Signed-off-by: Michael Chan <[EMAIL PROTECTED]>
    Signed-off-by: David S. Miller <[EMAIL PROTECTED]>
 drivers/net/tg3.c |    6 +++---
 1 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/net/tg3.c b/drivers/net/tg3.c
index 3a43426..314f5cf 100644
--- a/drivers/net/tg3.c
+++ b/drivers/net/tg3.c
@@ -3512,9 +3512,9 @@ static inline int tg3_irq_sync(struct tg3 *tp)
 static inline void tg3_full_lock(struct tg3 *tp, int irq_sync)
+       spin_lock_bh(&tp->lock);
        if (irq_sync)
-       spin_lock_bh(&tp->lock);
 static inline void tg3_full_unlock(struct tg3 *tp)
@@ -9116,10 +9116,10 @@ static void tg3_vlan_rx_register(struct net_device 
*dev, struct vlan_group *grp)
        /* Update RX_MODE_KEEP_VLAN_TAG bit in RX_MODE register. */
-       tg3_full_unlock(tp);
        if (netif_running(dev))
+       tg3_full_unlock(tp);
To unsubscribe from this list: send the line "unsubscribe git-commits-head" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at

Reply via email to