[dpdk-stable] patch 'distributor: fix handshake synchronization' has been queued to LTS release 18.11.11

Kevin Traynor ktraynor at redhat.com
Wed Nov 18 17:35:04 CET 2020


Hi,

FYI, your patch has been queued to LTS release 18.11.11

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 11/24/20. So please
shout if anyone has objections.

Also note that after the patch there's a diff of the upstream commit vs the
patch applied to the branch. This will indicate if there was any rebasing
needed to apply to the stable branch. If there were code changes for rebasing
(ie: not only metadata diffs), please double check that the rebase was
correctly done.

Queued patches are on a temporary branch at:
https://github.com/kevintraynor/dpdk-stable-queue

This queued commit can be viewed at:
https://github.com/kevintraynor/dpdk-stable-queue/commit/7f43d9a52f6c913ae693f61c8f9d67aefd23282a

Thanks.

Kevin.

---
>From 7f43d9a52f6c913ae693f61c8f9d67aefd23282a Mon Sep 17 00:00:00 2001
From: Lukasz Wojciechowski <l.wojciechow at partner.samsung.com>
Date: Sat, 17 Oct 2020 05:06:45 +0200
Subject: [PATCH] distributor: fix handshake synchronization

[ upstream commit bea84d5592eb2658cf8c36214a9db75d398efa1c ]

rte_distributor_return_pkt function which is run on worker cores
must wait for distributor core to clear handshake on retptr64
before using those buffers. While the handshake is set distributor
core controls buffers and any operations on worker side might overwrite
buffers which are unread yet.
Same situation appears in the legacy single distributor. Function
rte_distributor_return_pkt_single shouldn't modify the bufptr64 until
handshake on it is cleared by distributor lcore.

Fixes: 775003ad2f96 ("distributor: add new burst-capable library")

Signed-off-by: Lukasz Wojciechowski <l.wojciechow at partner.samsung.com>
Acked-by: David Hunt <david.hunt at intel.com>
Reviewed-by: Honnappa Nagarahalli <honnappa.nagarahalli at arm.com>
---
 lib/librte_distributor/rte_distributor.c     | 12 ++++++++++++
 lib/librte_distributor/rte_distributor_v20.c |  4 ++++
 2 files changed, 16 insertions(+)

diff --git a/lib/librte_distributor/rte_distributor.c b/lib/librte_distributor/rte_distributor.c
index 62a7634049..a686d06f81 100644
--- a/lib/librte_distributor/rte_distributor.c
+++ b/lib/librte_distributor/rte_distributor.c
@@ -184,4 +184,16 @@ rte_distributor_return_pkt_v1705(struct rte_distributor *d,
 	}
 
+	/* Spin while handshake bits are set (scheduler clears it).
+	 * Sync with worker on GET_BUF flag.
+	 */
+	while (unlikely(__atomic_load_n(&(buf->retptr64[0]), __ATOMIC_RELAXED)
+			& RTE_DISTRIB_GET_BUF)) {
+		rte_pause();
+		uint64_t t = rte_rdtsc()+100;
+
+		while (rte_rdtsc() < t)
+			rte_pause();
+	}
+
 	/* Sync with distributor to acquire retptrs */
 	__atomic_thread_fence(__ATOMIC_ACQUIRE);
diff --git a/lib/librte_distributor/rte_distributor_v20.c b/lib/librte_distributor/rte_distributor_v20.c
index 35adc8ea84..5459ccb3f9 100644
--- a/lib/librte_distributor/rte_distributor_v20.c
+++ b/lib/librte_distributor/rte_distributor_v20.c
@@ -78,4 +78,8 @@ rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,
 	uint64_t req = (((int64_t)(uintptr_t)oldpkt) << RTE_DISTRIB_FLAG_BITS)
 			| RTE_DISTRIB_RETURN_BUF;
+	while (unlikely(__atomic_load_n(&buf->bufptr64, __ATOMIC_RELAXED)
+			& RTE_DISTRIB_FLAGS_MASK))
+		rte_pause();
+
 	/* Sync with distributor on RETURN_BUF flag. */
 	__atomic_store_n(&(buf->bufptr64), req, __ATOMIC_RELEASE);
-- 
2.26.2

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2020-11-18 16:33:38.319552303 +0000
+++ 0018-distributor-fix-handshake-synchronization.patch	2020-11-18 16:33:37.925215059 +0000
@@ -1 +1 @@
-From bea84d5592eb2658cf8c36214a9db75d398efa1c Mon Sep 17 00:00:00 2001
+From 7f43d9a52f6c913ae693f61c8f9d67aefd23282a Mon Sep 17 00:00:00 2001
@@ -5,0 +6,2 @@
+[ upstream commit bea84d5592eb2658cf8c36214a9db75d398efa1c ]
+
@@ -16 +17,0 @@
-Cc: stable at dpdk.org
@@ -22,2 +23,2 @@
- lib/librte_distributor/rte_distributor.c        | 12 ++++++++++++
- lib/librte_distributor/rte_distributor_single.c |  4 ++++
+ lib/librte_distributor/rte_distributor.c     | 12 ++++++++++++
+ lib/librte_distributor/rte_distributor_v20.c |  4 ++++
@@ -27 +28 @@
-index 1c047f065a..c6b19a3886 100644
+index 62a7634049..a686d06f81 100644
@@ -30 +31 @@
-@@ -170,4 +170,16 @@ rte_distributor_return_pkt(struct rte_distributor *d,
+@@ -184,4 +184,16 @@ rte_distributor_return_pkt_v1705(struct rte_distributor *d,
@@ -47,5 +48,5 @@
-diff --git a/lib/librte_distributor/rte_distributor_single.c b/lib/librte_distributor/rte_distributor_single.c
-index abaf7730c3..f4725b1d0b 100644
---- a/lib/librte_distributor/rte_distributor_single.c
-+++ b/lib/librte_distributor/rte_distributor_single.c
-@@ -75,4 +75,8 @@ rte_distributor_return_pkt_single(struct rte_distributor_single *d,
+diff --git a/lib/librte_distributor/rte_distributor_v20.c b/lib/librte_distributor/rte_distributor_v20.c
+index 35adc8ea84..5459ccb3f9 100644
+--- a/lib/librte_distributor/rte_distributor_v20.c
++++ b/lib/librte_distributor/rte_distributor_v20.c
+@@ -78,4 +78,8 @@ rte_distributor_return_pkt_v20(struct rte_distributor_v20 *d,



More information about the stable mailing list