bnx2: use READ_ONCE() instead of barrier()
authorEric Dumazet <edumazet@google.com>
Sat, 19 Nov 2016 22:57:11 +0000 (14:57 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 21 Nov 2016 16:32:34 +0000 (11:32 -0500)
barrier() is a big hammer compared to READ_ONCE(),
and requires comments explaining what is protected.

READ_ONCE() is more precise and compiler should generate
better overall code.

Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2.c

index 9960a9249dc0d0c8fb3494989e882a4c96e64970..d5d1026be4b70a320c48af7545a1891c74e19a47 100644 (file)
@@ -254,13 +254,10 @@ static inline u32 bnx2_tx_avail(struct bnx2 *bp, struct bnx2_tx_ring_info *txr)
 {
        u32 diff;
 
-       /* 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.
         */
-       diff = txr->tx_prod - txr->tx_cons;
+       diff = READ_ONCE(txr->tx_prod) - READ_ONCE(txr->tx_cons);
        if (unlikely(diff >= BNX2_TX_DESC_CNT)) {
                diff &= 0xffff;
                if (diff == BNX2_TX_DESC_CNT)
@@ -2839,10 +2836,8 @@ bnx2_get_hw_tx_cons(struct bnx2_napi *bnapi)
 {
        u16 cons;
 
-       /* Tell compiler that status block fields can change. */
-       barrier();
-       cons = *bnapi->hw_tx_cons_ptr;
-       barrier();
+       cons = READ_ONCE(*bnapi->hw_tx_cons_ptr);
+
        if (unlikely((cons & BNX2_MAX_TX_DESC_CNT) == BNX2_MAX_TX_DESC_CNT))
                cons++;
        return cons;
@@ -3141,10 +3136,8 @@ bnx2_get_hw_rx_cons(struct bnx2_napi *bnapi)
 {
        u16 cons;
 
-       /* Tell compiler that status block fields can change. */
-       barrier();
-       cons = *bnapi->hw_rx_cons_ptr;
-       barrier();
+       cons = READ_ONCE(*bnapi->hw_rx_cons_ptr);
+
        if (unlikely((cons & BNX2_MAX_RX_DESC_CNT) == BNX2_MAX_RX_DESC_CNT))
                cons++;
        return cons;