From de843dbee36a4dabd2bffe2551273dd55c2caec4 Mon Sep 17 00:00:00 2001 From: Michael Chan Date: Mon, 19 Jul 2010 14:15:04 +0000 Subject: [PATCH] --- yaml --- r: 203647 b: refs/heads/master c: 11848b964777af9c68d9160582628c2eb11f46d5 h: refs/heads/master i: 203645: 366d2ec6c74063666737bfeedf73127311149735 203643: 172e0eca1502458f2fd27723b36af2d62b64004b 203639: c1ea419be42d42ddd6a81d15df78ac2202784718 203631: d698ba2e8d825e69446b19475c947cba2ab48d6d 203615: 656159f5cb24671af38ea246334c0e64b3def5f2 203583: 440d8e9edc8f16a1f8fc8d9945fd26aca883743b 203519: d7b61bed4698b3cdeec3420fd755d948ab3ffb8a v: v3 --- [refs] | 2 +- trunk/drivers/net/bnx2.c | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/[refs] b/[refs] index b3186ec586c8..c3ca1d6169ec 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 379b39a2ad613745bfbfe80256957d19689b7b94 +refs/heads/master: 11848b964777af9c68d9160582628c2eb11f46d5 diff --git a/trunk/drivers/net/bnx2.c b/trunk/drivers/net/bnx2.c index d44ecc30865f..2af570d7a2fb 100644 --- a/trunk/drivers/net/bnx2.c +++ b/trunk/drivers/net/bnx2.c @@ -253,7 +253,8 @@ static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr) { u32 diff; - smp_mb(); + /* Tell compiler to fetch tx_prod and tx_cons from memory. */ + barrier(); /* The ring uses 256 indices for 255 entries, one of them * needs to be skipped. @@ -6534,6 +6535,13 @@ bnx2_start_xmit(struct sk_buff *skb, struct net_device *dev) if (unlikely(bnx2_tx_avail(bp, txr) <= MAX_SKB_FRAGS)) { netif_tx_stop_queue(txq); + + /* netif_tx_stop_queue() must be done before checking + * tx index in bnx2_tx_avail() below, because in + * bnx2_tx_int(), we update tx index before checking for + * netif_tx_queue_stopped(). + */ + smp_mb(); if (bnx2_tx_avail(bp, txr) > bp->tx_wake_thresh) netif_tx_wake_queue(txq); }