e1000: Use dma_wmb() instead of wmb() before doorbell writes
authorVenkatesh Srinivas <venkateshs@google.com>
Mon, 10 Jun 2019 21:27:50 +0000 (14:27 -0700)
committerJeff Kirsher <jeffrey.t.kirsher@intel.com>
Fri, 28 Jun 2019 22:59:43 +0000 (15:59 -0700)
e1000 writes to doorbells to post transmit descriptors and fill the
receive ring. After writing descriptors to memory but before
writing to doorbells, use dma_wmb() rather than wmb(). wmb() is more
heavyweight than necessary for a device to see descriptor writes.

On x86, this avoids SFENCEs before doorbell writes in both the
Tx and Rx paths. On ARM, this converts DSB ST -> DMB OSHST.

Tested: 82576EB / x86; QEMU (qemu emulates an 8257x)

Signed-off-by: Venkatesh Srinivas <venkateshs@google.com>
Tested-by: Aaron Brown <aaron.f.brown@intel.com>
Signed-off-by: Jeff Kirsher <jeffrey.t.kirsher@intel.com>
drivers/net/ethernet/intel/e1000/e1000_main.c

index 551de8c..f703fa5 100644 (file)
@@ -3019,7 +3019,7 @@ static void e1000_tx_queue(struct e1000_adapter *adapter,
         * applicable for weak-ordered memory model archs,
         * such as IA-64).
         */
-       wmb();
+       dma_wmb();
 
        tx_ring->next_to_use = i;
 }
@@ -4540,7 +4540,7 @@ e1000_alloc_jumbo_rx_buffers(struct e1000_adapter *adapter,
                 * applicable for weak-ordered memory model archs,
                 * such as IA-64).
                 */
-               wmb();
+               dma_wmb();
                writel(i, adapter->hw.hw_addr + rx_ring->rdt);
        }
 }
@@ -4655,7 +4655,7 @@ static void e1000_alloc_rx_buffers(struct e1000_adapter *adapter,
                 * applicable for weak-ordered memory model archs,
                 * such as IA-64).
                 */
-               wmb();
+               dma_wmb();
                writel(i, hw->hw_addr + rx_ring->rdt);
        }
 }