Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 837a1dba authored by Alexander Duyck's avatar Alexander Duyck Committed by David S. Miller
Browse files

e1000, e1000e: Use dma_rmb instead of rmb for descriptor read ordering



This change replaces calls to rmb with dma_rmb in the case where we want to
order all follow-on descriptor reads after the check for the descriptor
status bit.

Signed-off-by: default avatarAlexander Duyck <alexander.h.duyck@redhat.com>
Acked-by: default avatarJeff Kirsher <jeffrey.t.kirsher@intel.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 03cc864a
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -3856,7 +3856,7 @@ static bool e1000_clean_tx_irq(struct e1000_adapter *adapter,
	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
	while ((eop_desc->upper.data & cpu_to_le32(E1000_TXD_STAT_DD)) &&
	       (count < tx_ring->count)) {
	       (count < tx_ring->count)) {
		bool cleaned = false;
		bool cleaned = false;
		rmb();	/* read buffer_info after eop_desc */
		dma_rmb();	/* read buffer_info after eop_desc */
		for ( ; !cleaned; count++) {
		for ( ; !cleaned; count++) {
			tx_desc = E1000_TX_DESC(*tx_ring, i);
			tx_desc = E1000_TX_DESC(*tx_ring, i);
			buffer_info = &tx_ring->buffer_info[i];
			buffer_info = &tx_ring->buffer_info[i];
@@ -4154,7 +4154,7 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_adapter *adapter,
		if (*work_done >= work_to_do)
		if (*work_done >= work_to_do)
			break;
			break;
		(*work_done)++;
		(*work_done)++;
		rmb(); /* read descriptor and rx_buffer_info after status DD */
		dma_rmb(); /* read descriptor and rx_buffer_info after status DD */


		status = rx_desc->status;
		status = rx_desc->status;


@@ -4375,7 +4375,7 @@ static bool e1000_clean_rx_irq(struct e1000_adapter *adapter,
		if (*work_done >= work_to_do)
		if (*work_done >= work_to_do)
			break;
			break;
		(*work_done)++;
		(*work_done)++;
		rmb(); /* read descriptor and rx_buffer_info after status DD */
		dma_rmb(); /* read descriptor and rx_buffer_info after status DD */


		status = rx_desc->status;
		status = rx_desc->status;
		length = le16_to_cpu(rx_desc->length);
		length = le16_to_cpu(rx_desc->length);
+4 −4
Original line number Original line Diff line number Diff line
@@ -947,7 +947,7 @@ static bool e1000_clean_rx_irq(struct e1000_ring *rx_ring, int *work_done,
		if (*work_done >= work_to_do)
		if (*work_done >= work_to_do)
			break;
			break;
		(*work_done)++;
		(*work_done)++;
		rmb();	/* read descriptor and rx_buffer_info after status DD */
		dma_rmb();	/* read descriptor and rx_buffer_info after status DD */


		skb = buffer_info->skb;
		skb = buffer_info->skb;
		buffer_info->skb = NULL;
		buffer_info->skb = NULL;
@@ -1232,7 +1232,7 @@ static bool e1000_clean_tx_irq(struct e1000_ring *tx_ring)
	       (count < tx_ring->count)) {
	       (count < tx_ring->count)) {
		bool cleaned = false;
		bool cleaned = false;


		rmb();		/* read buffer_info after eop_desc */
		dma_rmb();		/* read buffer_info after eop_desc */
		for (; !cleaned; count++) {
		for (; !cleaned; count++) {
			tx_desc = E1000_TX_DESC(*tx_ring, i);
			tx_desc = E1000_TX_DESC(*tx_ring, i);
			buffer_info = &tx_ring->buffer_info[i];
			buffer_info = &tx_ring->buffer_info[i];
@@ -1332,7 +1332,7 @@ static bool e1000_clean_rx_irq_ps(struct e1000_ring *rx_ring, int *work_done,
			break;
			break;
		(*work_done)++;
		(*work_done)++;
		skb = buffer_info->skb;
		skb = buffer_info->skb;
		rmb();	/* read descriptor and rx_buffer_info after status DD */
		dma_rmb();	/* read descriptor and rx_buffer_info after status DD */


		/* in the packet split case this is header only */
		/* in the packet split case this is header only */
		prefetch(skb->data - NET_IP_ALIGN);
		prefetch(skb->data - NET_IP_ALIGN);
@@ -1536,7 +1536,7 @@ static bool e1000_clean_jumbo_rx_irq(struct e1000_ring *rx_ring, int *work_done,
		if (*work_done >= work_to_do)
		if (*work_done >= work_to_do)
			break;
			break;
		(*work_done)++;
		(*work_done)++;
		rmb();	/* read descriptor and rx_buffer_info after status DD */
		dma_rmb();	/* read descriptor and rx_buffer_info after status DD */


		skb = buffer_info->skb;
		skb = buffer_info->skb;
		buffer_info->skb = NULL;
		buffer_info->skb = NULL;