All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next 0/4] r8169: improve memory barriers
@ 2020-04-19 17:38 Heiner Kallweit
  2020-04-19 17:39 ` [PATCH net-next 1/4] r8169: use smp_store_mb in rtl_tx Heiner Kallweit
                   ` (4 more replies)
  0 siblings, 5 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-04-19 17:38 UTC (permalink / raw)
  To: Realtek linux nic maintainers, David Miller; +Cc: netdev

This series includes improvements for (too heavy) memory barriers.
Tested on x86-64 with RTL8168g chip version.

Heiner Kallweit (4):
  r8169: use smp_store_mb in rtl_tx
  r8169: change wmb to dma-wmb in rtl8169_start_xmit
  r8169: replace dma_rmb with READ_ONCE in rtl_rx
  r8169: use WRITE_ONCE instead of dma_wmb in rtl8169_mark_to_asic

 drivers/net/ethernet/realtek/r8169_main.c | 26 ++++++++---------------
 1 file changed, 9 insertions(+), 17 deletions(-)

-- 
2.26.1


^ permalink raw reply	[flat|nested] 6+ messages in thread

* [PATCH net-next 1/4] r8169: use smp_store_mb in rtl_tx
  2020-04-19 17:38 [PATCH net-next 0/4] r8169: improve memory barriers Heiner Kallweit
@ 2020-04-19 17:39 ` Heiner Kallweit
  2020-04-19 17:41 ` [PATCH net-next 2/4] r8169: change wmb to dma_wmb in rtl8169_start_xmit Heiner Kallweit
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-04-19 17:39 UTC (permalink / raw)
  To: Realtek linux nic maintainers, David Miller; +Cc: netdev

Use helper smp_store_mb() instead of open-coding the functionality.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/ethernet/realtek/r8169_main.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 1bc415d00..dd6113fd7 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -4438,7 +4438,6 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
 		tp->tx_stats.bytes += bytes_compl;
 		u64_stats_update_end(&tp->tx_stats.syncp);
 
-		tp->dirty_tx = dirty_tx;
 		/* Sync with rtl8169_start_xmit:
 		 * - publish dirty_tx ring index (write barrier)
 		 * - refresh cur_tx ring index and queue status (read barrier)
@@ -4446,7 +4445,7 @@ static void rtl_tx(struct net_device *dev, struct rtl8169_private *tp,
 		 * a racing xmit thread can only have a right view of the
 		 * ring status.
 		 */
-		smp_mb();
+		smp_store_mb(tp->dirty_tx, dirty_tx);
 		if (netif_queue_stopped(dev) &&
 		    rtl_tx_slots_avail(tp, MAX_SKB_FRAGS)) {
 			netif_wake_queue(dev);
-- 
2.26.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 2/4] r8169: change wmb to dma_wmb in rtl8169_start_xmit
  2020-04-19 17:38 [PATCH net-next 0/4] r8169: improve memory barriers Heiner Kallweit
  2020-04-19 17:39 ` [PATCH net-next 1/4] r8169: use smp_store_mb in rtl_tx Heiner Kallweit
@ 2020-04-19 17:41 ` Heiner Kallweit
  2020-04-19 17:42 ` [PATCH net-next 3/4] r8169: replace dma_rmb with READ_ONCE in rtl_rx Heiner Kallweit
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-04-19 17:41 UTC (permalink / raw)
  To: Realtek linux nic maintainers, David Miller; +Cc: netdev

It's the typical dma_wmb() use case to finish descriptor writes before
ringing the device doorbell. Therefore switch to this lighter barrier.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/ethernet/realtek/r8169_main.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index dd6113fd7..038cd6fde 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -4259,7 +4259,7 @@ static netdev_tx_t rtl8169_start_xmit(struct sk_buff *skb,
 	txd_first->opts1 |= cpu_to_le32(DescOwn | FirstFrag);
 
 	/* Force all memory writes to complete before notifying device */
-	wmb();
+	dma_wmb();
 
 	tp->cur_tx += frags + 1;
 
-- 
2.26.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 3/4] r8169: replace dma_rmb with READ_ONCE in rtl_rx
  2020-04-19 17:38 [PATCH net-next 0/4] r8169: improve memory barriers Heiner Kallweit
  2020-04-19 17:39 ` [PATCH net-next 1/4] r8169: use smp_store_mb in rtl_tx Heiner Kallweit
  2020-04-19 17:41 ` [PATCH net-next 2/4] r8169: change wmb to dma_wmb in rtl8169_start_xmit Heiner Kallweit
@ 2020-04-19 17:42 ` Heiner Kallweit
  2020-04-19 17:44 ` [PATCH net-next 4/4] r8169: use WRITE_ONCE instead of dma_wmb in rtl8169_mark_to_asic Heiner Kallweit
  2020-04-19 18:11 ` [PATCH net-next 0/4] r8169: improve memory barriers Heiner Kallweit
  4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-04-19 17:42 UTC (permalink / raw)
  To: Realtek linux nic maintainers, David Miller; +Cc: netdev

We want to ensure that desc->opts1 is read before desc->opts2.
This doesn't require a full compiler barrier. READ_ONCE provides
the ordering guarantee we need.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/ethernet/realtek/r8169_main.c | 11 +++--------
 1 file changed, 3 insertions(+), 8 deletions(-)

diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index 038cd6fde..df788063e 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -1548,7 +1548,7 @@ static inline u32 rtl8169_tx_vlan_tag(struct sk_buff *skb)
 
 static void rtl8169_rx_vlan_tag(struct RxDesc *desc, struct sk_buff *skb)
 {
-	u32 opts2 = le32_to_cpu(desc->opts2);
+	u32 opts2 = le32_to_cpu(READ_ONCE(desc->opts2));
 
 	if (opts2 & RxVlanTag)
 		__vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), swab16(opts2 & 0xffff));
@@ -4490,16 +4490,11 @@ static int rtl_rx(struct net_device *dev, struct rtl8169_private *tp, u32 budget
 		struct RxDesc *desc = tp->RxDescArray + entry;
 		u32 status;
 
-		status = le32_to_cpu(desc->opts1);
+		/* Use READ_ONCE to order descriptor field reads */
+		status = le32_to_cpu(READ_ONCE(desc->opts1));
 		if (status & DescOwn)
 			break;
 
-		/* This barrier is needed to keep us from reading
-		 * any other fields out of the Rx descriptor until
-		 * we know the status of DescOwn
-		 */
-		dma_rmb();
-
 		if (unlikely(status & RxRES)) {
 			netif_info(tp, rx_err, dev, "Rx ERROR. status = %08x\n",
 				   status);
-- 
2.26.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* [PATCH net-next 4/4] r8169: use WRITE_ONCE instead of dma_wmb in rtl8169_mark_to_asic
  2020-04-19 17:38 [PATCH net-next 0/4] r8169: improve memory barriers Heiner Kallweit
                   ` (2 preceding siblings ...)
  2020-04-19 17:42 ` [PATCH net-next 3/4] r8169: replace dma_rmb with READ_ONCE in rtl_rx Heiner Kallweit
@ 2020-04-19 17:44 ` Heiner Kallweit
  2020-04-19 18:11 ` [PATCH net-next 0/4] r8169: improve memory barriers Heiner Kallweit
  4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-04-19 17:44 UTC (permalink / raw)
  To: Realtek linux nic maintainers, David Miller; +Cc: netdev

We want to ensure that desc->opts1 is written as last descriptor field.
This doesn't require a full compiler barrier, WRITE_ONCE provides the
ordering guarantee we need.

Signed-off-by: Heiner Kallweit <hkallweit1@gmail.com>
---
 drivers/net/ethernet/realtek/r8169_main.c | 10 ++++------
 1 file changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/net/ethernet/realtek/r8169_main.c b/drivers/net/ethernet/realtek/r8169_main.c
index df788063e..8e9944692 100644
--- a/drivers/net/ethernet/realtek/r8169_main.c
+++ b/drivers/net/ethernet/realtek/r8169_main.c
@@ -3892,11 +3892,9 @@ static inline void rtl8169_mark_to_asic(struct RxDesc *desc)
 {
 	u32 eor = le32_to_cpu(desc->opts1) & RingEnd;
 
-	desc->opts2 = 0;
-	/* Force memory writes to complete before releasing descriptor */
-	dma_wmb();
-
-	desc->opts1 = cpu_to_le32(DescOwn | eor | R8169_RX_BUF_SIZE);
+	/* Ensure ordering of writes */
+	WRITE_ONCE(desc->opts2, 0);
+	WRITE_ONCE(desc->opts1, cpu_to_le32(DescOwn | eor | R8169_RX_BUF_SIZE));
 }
 
 static struct page *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
@@ -3919,7 +3917,7 @@ static struct page *rtl8169_alloc_rx_data(struct rtl8169_private *tp,
 		return NULL;
 	}
 
-	desc->addr = cpu_to_le64(mapping);
+	WRITE_ONCE(desc->addr, cpu_to_le64(mapping));
 	rtl8169_mark_to_asic(desc);
 
 	return data;
-- 
2.26.1



^ permalink raw reply related	[flat|nested] 6+ messages in thread

* Re: [PATCH net-next 0/4] r8169: improve memory barriers
  2020-04-19 17:38 [PATCH net-next 0/4] r8169: improve memory barriers Heiner Kallweit
                   ` (3 preceding siblings ...)
  2020-04-19 17:44 ` [PATCH net-next 4/4] r8169: use WRITE_ONCE instead of dma_wmb in rtl8169_mark_to_asic Heiner Kallweit
@ 2020-04-19 18:11 ` Heiner Kallweit
  4 siblings, 0 replies; 6+ messages in thread
From: Heiner Kallweit @ 2020-04-19 18:11 UTC (permalink / raw)
  To: Realtek linux nic maintainers, David Miller; +Cc: netdev

On 19.04.2020 19:38, Heiner Kallweit wrote:
> This series includes improvements for (too heavy) memory barriers.
> Tested on x86-64 with RTL8168g chip version.
> 
> Heiner Kallweit (4):
>   r8169: use smp_store_mb in rtl_tx
>   r8169: change wmb to dma_wmb in rtl8169_start_xmit

I think I'll have to drip this patch from the series. These Realtek
chips are also used on non-x86 platforms, and these platforms may
not be coherent. I'll send a v2.

>   r8169: replace dma_rmb with READ_ONCE in rtl_rx
>   r8169: use WRITE_ONCE instead of dma_wmb in rtl8169_mark_to_asic
> 
>  drivers/net/ethernet/realtek/r8169_main.c | 26 ++++++++---------------
>  1 file changed, 9 insertions(+), 17 deletions(-)
> 


^ permalink raw reply	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-04-19 18:11 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-19 17:38 [PATCH net-next 0/4] r8169: improve memory barriers Heiner Kallweit
2020-04-19 17:39 ` [PATCH net-next 1/4] r8169: use smp_store_mb in rtl_tx Heiner Kallweit
2020-04-19 17:41 ` [PATCH net-next 2/4] r8169: change wmb to dma_wmb in rtl8169_start_xmit Heiner Kallweit
2020-04-19 17:42 ` [PATCH net-next 3/4] r8169: replace dma_rmb with READ_ONCE in rtl_rx Heiner Kallweit
2020-04-19 17:44 ` [PATCH net-next 4/4] r8169: use WRITE_ONCE instead of dma_wmb in rtl8169_mark_to_asic Heiner Kallweit
2020-04-19 18:11 ` [PATCH net-next 0/4] r8169: improve memory barriers Heiner Kallweit

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.