fm10k/igb/ixgbe: Use dma_rmb on Rx descriptor reads
authorAlexander Duyck <alexander.h.duyck@redhat.com>
Thu, 11 Dec 2014 23:02:28 +0000 (15:02 -0800)
committerDavid S. Miller <davem@davemloft.net>
Fri, 12 Dec 2014 02:15:06 +0000 (21:15 -0500)
This change makes it so that dma_rmb is used when reading the Rx
descriptor.  The advantage of dma_rmb is that it allows for a much
lower cost barrier on x86, powerpc, arm, and arm64 architectures than a
traditional memory barrier when dealing with reads that only have to
synchronize to coherent memory.

In addition I have updated the code so that it just checks to see if any
bits have been set instead of just the DD bit since the DD bit will always
be set as a part of a descriptor write-back so we just need to check for a
non-zero value being present at that memory location rather than just
checking for any specific bit.  This allows the code itself to appear much
cleaner and allows the compiler more room to optimize.

Cc: Matthew Vick <matthew.vick@intel.com>
Cc: Don Skidmore <donald.c.skidmore@intel.com>
Acked-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: Alexander Duyck <alexander.h.duyck@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/intel/fm10k/fm10k_main.c
drivers/net/ethernet/intel/igb/igb_main.c
drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

index ee1ecb146df7de40e126cbffca7c80528254ef8e..eb088b129bc717ae786880b4d08d5d3260ddc1c7 100644 (file)
@@ -615,14 +615,14 @@ static bool fm10k_clean_rx_irq(struct fm10k_q_vector *q_vector,
 
                rx_desc = FM10K_RX_DESC(rx_ring, rx_ring->next_to_clean);
 
-               if (!fm10k_test_staterr(rx_desc, FM10K_RXD_STATUS_DD))
+               if (!rx_desc->d.staterr)
                        break;
 
                /* This memory barrier is needed to keep us from reading
                 * any other fields out of the rx_desc until we know the
-                * RXD_STATUS_DD bit is set
+                * descriptor has been written back
                 */
-               rmb();
+               dma_rmb();
 
                /* retrieve a buffer from the ring */
                skb = fm10k_fetch_rx_buffer(rx_ring, rx_desc, skb);
index 2e526d4904a6912638030297a9f60abd792d5f53..ff59897a946363442d657e84784962c6a600a45b 100644 (file)
@@ -6910,14 +6910,14 @@ static bool igb_clean_rx_irq(struct igb_q_vector *q_vector, const int budget)
 
                rx_desc = IGB_RX_DESC(rx_ring, rx_ring->next_to_clean);
 
-               if (!igb_test_staterr(rx_desc, E1000_RXD_STAT_DD))
+               if (!rx_desc->wb.upper.status_error)
                        break;
 
                /* This memory barrier is needed to keep us from reading
                 * any other fields out of the rx_desc until we know the
-                * RXD_STAT_DD bit is set
+                * descriptor has been written back
                 */
-               rmb();
+               dma_rmb();
 
                /* retrieve a buffer from the ring */
                skb = igb_fetch_rx_buffer(rx_ring, rx_desc, skb);
index 798b05556e1bcced693bc680ac076992e1a59e85..2ed2c7de230444f88c3f06451d7cc8a7167f5f05 100644 (file)
@@ -2009,15 +2009,14 @@ static int ixgbe_clean_rx_irq(struct ixgbe_q_vector *q_vector,
 
                rx_desc = IXGBE_RX_DESC(rx_ring, rx_ring->next_to_clean);
 
-               if (!ixgbe_test_staterr(rx_desc, IXGBE_RXD_STAT_DD))
+               if (!rx_desc->wb.upper.status_error)
                        break;
 
-               /*
-                * This memory barrier is needed to keep us from reading
+               /* This memory barrier is needed to keep us from reading
                 * any other fields out of the rx_desc until we know the
-                * RXD_STAT_DD bit is set
+                * descriptor has been written back
                 */
-               rmb();
+               dma_rmb();
 
                /* retrieve a buffer from the ring */
                skb = ixgbe_fetch_rx_buffer(rx_ring, rx_desc);