From: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
To: stephen@networkplumber.org, "dev@dpdk.org" <dev@dpdk.org>
Cc: drc@linux.ibm.com, rileyf@linux.ibm.com, sunyuechi@iscas.ac.cn,
maobibo@loongson.cn, wathsala.vithanage@arm.com
Subject: Re: [PATCH v2 19/33] test/barrier: test sequentially consistent fence only
Date: Sun, 4 Oct 2026 13:57:57 +0100 [thread overview]
Message-ID: <cb765588-e72c-4a85-a1f4-3dc3ae4c5820@yandex.ru> (raw)
In-Reply-To: <20260920181347.747210-20-stephen@networkplumber.org>
> te_smp_mb() is removed by this series, leaving the barrier test with
> one case instead of two. Drop the use type enum and the barrier
> selector wrapper.
>
> Convert the Peterson lock to explicit atomic accesses with relaxed
> ordering, leaving rte_atomic_thread_fence(rte_memory_order_seq_cst)
> as the only thing preventing store-load reordering.
Run it on both x86 and arm boxes, both passed.
Other arch maintainers, pls review, test.
Acked-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
Tested-by: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
>
> Signed-off-by: Stephen Hemminger <stephen@networkplumber.org>
> ---
> app/test/test_barrier.c <https://inbox.dpdk.org/dev/20260920181347.747210-20-stephen@networkplumber.org/#Z31app:test:test_barrier.c> | 105 +++++++++++++---------------------------
> 1 file changed, 34 insertions(+), 71 deletions(-)
>
> diff
> <https://inbox.dpdk.org/dev/20260920181347.747210-20-stephen@networkplumber.org/#iZ31app:test:test_barrier.c>
> --git a/app/test/test_barrier.c b/app/test/test_barrier.c index
> 925a88b68a..cb876d8fda 100644 --- a/app/test/test_barrier.c +++
> b/app/test/test_barrier.c @@ -2,51 +2,41 @@ * Copyright(c) 2010-2018 Intel Corporation
> */
>
> - /* - * This is a simple functional test for rte_smp_mb()
> implementation. - * I.E. make sure that LOAD and STORE operations that
> precede the - * rte_smp_mb() call are globally visible across the
> lcores - * before the LOAD and STORE operations that follows it. - *
> The test uses simple implementation of Peterson's lock algorithm - *
> (https://en.wikipedia.org/wiki/Peterson%27s_algorithm) - * for two
> execution units to make sure that rte_smp_mb() prevents - * store-load
> reordering to happen. - * Also when executed on a single lcore could
> be used as a approximate - * estimation of number of cycles particular
> implementation of rte_smp_mb() - * will take. - */ +/* + * Functional
> test for rte_atomic_thread_fence(rte_memory_order_seq_cst). + * I.E.
> make sure that LOAD and STORE operations that precede the fence + *
> are globally visible across the lcores before the LOAD and STORE + *
> operations that follow it. + * The test uses a simple implementation
> of Peterson's lock algorithm + *
> (https://en.wikipedia.org/wiki/Peterson%27s_algorithm) + * for two
> execution units, since that algorithm only works if + * store-load
> reordering is prevented. + * Also when executed on a single lcore it
> can be used as an approximate + * estimate of the number of cycles a
> sequentially consistent fence takes. + */
> +#include <errno.h> #include <stdio.h>
> -#include <string.h> #include <stdint.h>
> +#include <stdlib.h> #include <inttypes.h>
>
> -#include <rte_memory.h> -#include <rte_per_lcore.h> #include <rte_launch.h>
> #include <rte_eal.h>
> #include <rte_lcore.h>
> #include <rte_pause.h>
> #include <rte_random.h>
> #include <rte_cycles.h>
> -#include <rte_vect.h> -#include <rte_debug.h> +#include
> <rte_stdatomic.h>
> #include "test.h"
>
> #define ADD_MAX 8
> #define ITER_MAX 0x1000000
>
> -enum plock_use_type { - USE_MB, - USE_SMP_MB, - USE_NUM -}; - struct plock {
> - volatile uint32_t flag[2]; - volatile uint32_t victim; - enum
> plock_use_type utype; + RTE_ATOMIC(uint32_t) flag[2]; +
> RTE_ATOMIC(uint32_t) victim; };
>
> /*
> @@ -69,19 +59,11 @@ struct lcore_plock_test { uint32_t lc; /* given lcore id */
> };
>
> -static inline void -store_load_barrier(uint32_t utype) -{ - if (utype
> == USE_MB) - rte_mb(); - else if (utype == USE_SMP_MB) - rte_smp_mb();
> - else - RTE_VERIFY(0); -} - /*
> * Peterson lock implementation.
> + * The stores below are relaxed on purpose: the sequentially
> consistent + * fence is the only thing keeping them ahead of the loads
> in the spin + * loop, so a broken fence shows up as two lcores in the
> critical section. */
> static void
> plock_lock(struct plock *l, uint32_t self)
> @@ -90,29 +72,22 @@ plock_lock(struct plock *l, uint32_t self)
> other = self ^ 1;
>
> - l->flag[self] = 1; - rte_smp_wmb(); - l->victim = self; +
> rte_atomic_store_explicit(&l->flag[self], 1,
> rte_memory_order_relaxed); + rte_atomic_store_explicit(&l->victim,
> self, rte_memory_order_relaxed);
> - store_load_barrier(l->utype); +
> rte_atomic_thread_fence(rte_memory_order_seq_cst);
> - while (l->flag[other] == 1 && l->victim == self) + while
> (rte_atomic_load_explicit(&l->flag[other], rte_memory_order_relaxed)
> == 1 && + rte_atomic_load_explicit(&l->victim,
> rte_memory_order_relaxed) == self) rte_pause();
> - rte_smp_rmb(); -}
> -static void -plock_unlock(struct plock *l, uint32_t self) -{ -
> rte_smp_wmb(); - l->flag[self] = 0; +
> rte_atomic_thread_fence(rte_memory_order_acquire); }
>
> static void
> -plock_reset(struct plock *l, enum plock_use_type utype)
> +plock_unlock(struct plock *l, uint32_t self) {
> - memset(l, 0, sizeof(*l)); - l->utype = utype; +
> rte_atomic_store_explicit(&l->flag[self], 0, rte_memory_order_release); }
>
> /*
> @@ -186,7 +161,7 @@ plock_test1_lcore(void *data) * and local data are the same.
> */
> static int
> -plock_test(uint64_t iter, enum plock_use_type utype)
> +plock_test(uint64_t iter) {
> int32_t rc;
> uint32_t i, lc, n;
> @@ -201,8 +176,7 @@ plock_test(uint64_t iter, enum plock_use_type utype) lpt = calloc(n, sizeof(*lpt));
> sum = calloc(n + 1, sizeof(*sum));
>
> - printf("%s(iter=%" PRIu64 ", utype=%u) started on %u lcores\n", -
> __func__, iter, utype, n); + printf("%s(iter=%" PRIu64 ") started on
> %u lcores\n", __func__, iter, n);
> if (pt == NULL || lpt == NULL || sum == NULL) {
> printf("%s: failed to allocate memory for %u lcores\n",
> @@ -213,9 +187,6 @@ plock_test(uint64_t iter, enum plock_use_type utype) return -ENOMEM;
> }
>
> - for (i = 0; i != n + 1; i++) - plock_reset(&pt[i].lock, utype); - i = 0;
> RTE_LCORE_FOREACH(lc) {
>
> @@ -263,26 +234,18 @@ plock_test(uint64_t iter, enum plock_use_type
> utype) free(lpt);
> free(sum);
>
> - printf("%s(utype=%u) returns %d\n", __func__, utype, rc); +
> printf("%s returns %d\n", __func__, rc); return rc;
> }
>
> static int
> test_barrier(void)
> {
> - int32_t i, ret, rc[USE_NUM]; - - for (i = 0; i != RTE_DIM(rc); i++)
> - rc[i] = plock_test(ITER_MAX, i); + int rc = plock_test(ITER_MAX);
> - ret = 0; - for (i = 0; i != RTE_DIM(rc); i++) { - printf("%s for
> utype=%d %s\n", - __func__, i, rc[i] == 0 ? "passed" : "failed"); -
> ret |= rc[i]; - } + printf("%s %s\n", __func__, rc == 0 ? "passed" :
> "failed");
> - return ret; + return rc; }
>
> REGISTER_PERF_TEST(barrier_autotest, test_barrier);
> --
> 2.53.0
next prev parent reply other threads:[~2026-10-04 12:58 UTC|newest]
Thread overview: 131+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-29 17:53 [RFC 00/32] remove rte_smp barrier functions Stephen Hemminger
2026-07-29 17:53 ` [RFC 01/32] bpf: replace deprecated SMP barriers with C11 fences Stephen Hemminger
2026-07-30 8:48 ` Marat Khalili
2026-07-30 11:19 ` Marat Khalili
2026-07-30 12:51 ` Konstantin Ananyev
2026-07-30 9:23 ` Konstantin Ananyev
2026-07-29 17:53 ` [RFC 02/32] test: remove test for rte_smp_mb Stephen Hemminger
2026-07-30 7:25 ` Konstantin Ananyev
2026-07-29 17:53 ` [RFC 03/32] bus/vmbus: fix ring buffer ordering on weakly ordered CPUs Stephen Hemminger
2026-08-05 1:22 ` [EXTERNAL] " Long Li
2026-07-29 17:53 ` [RFC 04/32] bus/vmbus: fix missing acquire on receive ring index Stephen Hemminger
2026-08-05 1:23 ` [EXTERNAL] " Long Li
2026-07-29 17:53 ` [RFC 05/32] bus/vmbus: replace SMP barriers with C11 memory fences Stephen Hemminger
2026-08-13 21:41 ` [EXTERNAL] " Long Li
2026-07-29 17:53 ` [RFC 06/32] baseband: convert rte_smp_rmb to fence Stephen Hemminger
2026-07-29 17:54 ` [RFC 07/32] net/hinic: replace rte_smp_rmb Stephen Hemminger
2026-07-29 17:54 ` [RFC 08/32] net/intel: " Stephen Hemminger
2026-08-13 10:17 ` Bruce Richardson
2026-07-29 17:54 ` [RFC 09/32] crypto_caam_jr: " Stephen Hemminger
2026-08-06 6:10 ` Hemant Agrawal
2026-07-29 17:54 ` [RFC 10/32] net/virtio: replcae rte_smp_rmb Stephen Hemminger
2026-07-29 17:54 ` [RFC 11/32] net/thunderx: replace rte_smp_rmb Stephen Hemminger
2026-07-29 17:54 ` [RFC 12/32] stack: always use C11 memory model implementation Stephen Hemminger
2026-07-31 14:53 ` Morten Brørup
2026-08-01 15:25 ` Stephen Hemminger
2026-08-01 17:01 ` Stephen Hemminger
2026-08-02 6:33 ` Morten Brørup
2026-07-29 17:54 ` [RFC 13/32] ring: replace SMP read barrier with C11 acquire fence Stephen Hemminger
2026-07-30 8:16 ` Konstantin Ananyev
2026-07-31 14:47 ` Morten Brørup
2026-07-29 17:54 ` [RFC 14/32] crypto/virtio: update comment reference to rte_smp_rmb Stephen Hemminger
2026-07-29 17:54 ` [RFC 15/32] event/sw: fix unlinks in progress counter races Stephen Hemminger
2026-08-13 10:38 ` Bruce Richardson
2026-07-29 17:54 ` [RFC 16/32] event/sw: replace SMP barriers with C11 atomics Stephen Hemminger
2026-07-29 17:54 ` [RFC 17/32] eal/x86: move optimized fence out of SMP barrier Stephen Hemminger
2026-07-30 7:27 ` Konstantin Ananyev
2026-07-29 17:54 ` [RFC 18/32] common/octeontx: remove redundant barrier in mbox Stephen Hemminger
2026-07-29 17:54 ` [RFC 19/32] crypto/caam_jr: use IO barrier before job ring doorbell Stephen Hemminger
2026-08-06 6:11 ` Hemant Agrawal
2026-07-29 17:54 ` [RFC 20/32] crypto/octeontx: use IO barrier before doorbell Stephen Hemminger
2026-07-29 17:54 ` [RFC 21/32] mempool/octeontx: use IO barrier in pool destroy Stephen Hemminger
2026-07-29 17:54 ` [RFC 22/32] event/octeontx: replace deprecated SMP barriers Stephen Hemminger
2026-07-29 17:54 ` [RFC 23/32] event/dpaa2: replace deprecated barrier in selftest Stephen Hemminger
2026-08-06 6:11 ` Hemant Agrawal
2026-07-29 17:54 ` [RFC 24/32] event/dsw: replace SMP barriers with release fences Stephen Hemminger
2026-07-31 4:37 ` Mattias Rönnblom
2026-07-29 17:54 ` [RFC 25/32] event/opdl: replace SMP barriers with C11 atomics Stephen Hemminger
2026-07-29 17:54 ` [RFC 26/32] net/netvsc: replace SMP barrier in RNDIS response Stephen Hemminger
2026-07-29 17:54 ` [RFC 27/32] net/thunderx: replace deprecated SMP barriers Stephen Hemminger
2026-07-29 17:54 ` [RFC 28/32] net/virtio: replace deprecated barrier in avail index update Stephen Hemminger
2026-07-29 17:54 ` [RFC 29/32] eal: remove stale SMP barrier in rte_service Stephen Hemminger
2026-07-29 17:54 ` [RFC 30/32] eal: remove rte_smp_XX Stephen Hemminger
2026-07-29 17:54 ` [RFC 31/32] checkpatches: no longer warn about rte_smp_XX Stephen Hemminger
2026-07-29 17:54 ` [RFC 32/32] doc: update release notes about rte_smp_XX removal Stephen Hemminger
2026-09-20 18:09 ` [PATCH v2 00/33] remove rte_smp_XX barrier Stephen Hemminger
2026-09-20 18:09 ` [PATCH v2 01/33] bpf: replace deprecated SMP barriers with C11 fences Stephen Hemminger
2026-09-21 8:36 ` Marat Khalili
2026-09-23 9:49 ` Konstantin Ananyev
2026-09-20 18:09 ` [PATCH v2 02/33] bus/vmbus: remove packed attribute from ring buffer Stephen Hemminger
2026-09-21 8:37 ` [EXTERNAL] " Wei Hu
2026-09-20 18:09 ` [PATCH v2 03/33] bus/vmbus: fix ring buffer ordering on weakly ordered CPUs Stephen Hemminger
2026-09-21 8:39 ` [EXTERNAL] " Wei Hu
2026-09-20 18:09 ` [PATCH v2 04/33] bus/vmbus: fix missing acquire on receive ring index Stephen Hemminger
2026-09-21 8:40 ` [EXTERNAL] " Wei Hu
2026-09-20 18:09 ` [PATCH v2 05/33] bus/vmbus: replace SMP barriers with C11 memory fences Stephen Hemminger
2026-09-21 8:40 ` [EXTERNAL] " Wei Hu
2026-09-20 18:09 ` [PATCH v2 06/33] drivers/baseband: convert rte_smp_rmb to fence Stephen Hemminger
2026-09-20 18:09 ` [PATCH v2 07/33] net/hinic: replace rte_smp_rmb Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 08/33] net/intel: " Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 09/33] net/virtio: " Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 10/33] net/thunderx: " Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 11/33] stack: always use C11 memory model implementation Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 12/33] ring: replace SMP read barrier with C11 acquire fence Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 13/33] crypto/virtio: update comment reference to rte_smp_rmb Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 14/33] crypto/caam_jr: replace rte_smp_rmb Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 15/33] crypto/caam_jr: use IO barrier before job ring doorbell Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 16/33] crypto/octeontx: use IO barrier before doorbell Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 17/33] event/sw: fix unlinks in progress counter races Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 18/33] event/sw: replace SMP barriers with C11 atomics Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 19/33] test/barrier: test sequentially consistent fence only Stephen Hemminger
2026-10-04 12:57 ` Konstantin Ananyev [this message]
2026-10-05 13:45 ` Sun Yuechi
2026-09-20 18:10 ` [PATCH v2 20/33] eal/x86: move optimized fence out of SMP barrier Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 21/33] common/octeontx: remove redundant barrier in mbox Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 22/33] mempool/octeontx: use IO barrier in pool destroy Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 23/33] event/octeontx: replace deprecated SMP barriers Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 24/33] event/dpaa2: replace deprecated barrier in selftest Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 25/33] event/dsw: replace SMP barriers with release fences Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 26/33] event/opdl: replace SMP barriers with C11 atomics Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 27/33] net/netvsc: replace SMP barrier in RNDIS response Stephen Hemminger
2026-09-21 9:00 ` [EXTERNAL] " Wei Hu
2026-09-20 18:10 ` [PATCH v2 28/33] net/thunderx: replace deprecated SMP barriers Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 29/33] net/virtio: replace deprecated barrier in avail index update Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 30/33] eal: remove stale SMP barrier in rte_service Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 31/33] eal: remove rte_smp_XX Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 32/33] checkpatches: no longer warn about rte_smp_XX Stephen Hemminger
2026-09-20 18:10 ` [PATCH v2 33/33] doc: update release notes about rte_smp_XX removal Stephen Hemminger
2026-10-07 15:29 ` [PATCH v2 00/33] remove rte_smp_XX barrier David Marchand
2026-10-08 23:34 ` [PATCH v3 00/29] remove rte_smp_XX barriers Stephen Hemminger
2026-10-08 23:34 ` [PATCH v3 01/29] bpf: replace deprecated SMP barriers with C11 fences Stephen Hemminger
2026-10-09 6:05 ` Wathsala Vithanage
2026-10-09 15:48 ` Stephen Hemminger
2026-10-08 23:34 ` [PATCH v3 02/29] bus/vmbus: remove packed attribute from ring buffer Stephen Hemminger
2026-10-08 23:34 ` [PATCH v3 03/29] bus/vmbus: fix ring buffer ordering on weakly ordered CPUs Stephen Hemminger
2026-10-08 23:34 ` [PATCH v3 04/29] bus/vmbus: fix missing acquire on receive ring index Stephen Hemminger
2026-10-08 23:34 ` [PATCH v3 05/29] bus/vmbus: replace SMP barriers with C11 memory fences Stephen Hemminger
2026-10-08 23:34 ` [PATCH v3 06/29] drivers/baseband: convert rte_smp_rmb to fence Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 07/29] net/hinic: replace rte_smp_rmb Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 08/29] net/intel: " Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 09/29] net/virtio: " Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 10/29] net/thunderx: replace deprecated SMP barriers Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 11/29] stack: always use C11 memory model implementation Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 12/29] ring: replace SMP read barrier with C11 acquire fence Stephen Hemminger
2026-10-09 4:05 ` Wathsala Vithanage
2026-10-08 23:35 ` [PATCH v3 13/29] crypto/virtio: update comment reference to rte_smp_rmb Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 14/29] crypto/caam_jr: replace rte_smp_rmb Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 15/29] crypto/caam_jr: use IO barrier before job ring doorbell Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 16/29] crypto/octeontx: use IO barrier before doorbell Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 17/29] event/sw: fix unlinks in progress counter races Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 18/29] event/sw: replace SMP barriers with C11 atomics Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 19/29] test/barrier: convert to " Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 20/29] eal/x86: move optimized fence out of SMP barrier Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 21/29] common/octeontx: remove redundant barrier in mbox Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 22/29] mempool/octeontx: use IO barrier in pool destroy Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 23/29] event/octeontx: replace deprecated SMP barriers Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 24/29] event/dpaa2: replace deprecated barrier in selftest Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 25/29] event/dsw: replace SMP barriers with release fences Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 26/29] event/opdl: replace SMP barriers with C11 atomics Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 27/29] net/virtio: replace deprecated barrier in avail index update Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 28/29] eal: remove stale SMP barrier in rte_service Stephen Hemminger
2026-10-08 23:35 ` [PATCH v3 29/29] eal: remove rte_smp_XX Stephen Hemminger
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=cb765588-e72c-4a85-a1f4-3dc3ae4c5820@yandex.ru \
--to=konstantin.v.ananyev@yandex.ru \
--cc=dev@dpdk.org \
--cc=drc@linux.ibm.com \
--cc=maobibo@loongson.cn \
--cc=rileyf@linux.ibm.com \
--cc=stephen@networkplumber.org \
--cc=sunyuechi@iscas.ac.cn \
--cc=wathsala.vithanage@arm.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox