> -----Original Message-----
> From: Tyler Retzlaff <[email protected]>
> Sent: Thursday, October 26, 2023 6:38 AM
> To: Ruifeng Wang <[email protected]>
> Cc: [email protected]; Akhil Goyal <[email protected]>; Anatoly Burakov
> <[email protected]>; Andrew Rybchenko 
> <[email protected]>; Bruce
> Richardson <[email protected]>; Chenbo Xia <[email protected]>; 
> Ciara Power
> <[email protected]>; David Christensen <[email protected]>; David 
> Hunt
> <[email protected]>; Dmitry Kozlyuk <[email protected]>; Dmitry 
> Malloy
> <[email protected]>; Elena Agostini <[email protected]>; Erik Gabriel 
> Carrillo
> <[email protected]>; Fan Zhang <[email protected]>; Ferruh Yigit
> <[email protected]>; Harman Kalra <[email protected]>; Harry van Haaren
> <[email protected]>; Honnappa Nagarahalli 
> <[email protected]>;
> [email protected]; Konstantin Ananyev <[email protected]>; 
> Matan Azrad
> <[email protected]>; Maxime Coquelin <[email protected]>; Narcisa Ana 
> Maria Vasile
> <[email protected]>; Nicolas Chautru <[email protected]>; 
> Olivier Matz
> <[email protected]>; Ori Kam <[email protected]>; Pallavi Kadam
> <[email protected]>; Pavan Nikhilesh <[email protected]>; Reshma 
> Pattan
> <[email protected]>; Sameh Gobriel <[email protected]>; Shijith 
> Thotton
> <[email protected]>; Sivaprasad Tummala <[email protected]>; 
> Stephen Hemminger
> <[email protected]>; Suanming Mou <[email protected]>; Sunil 
> Kumar Kori
> <[email protected]>; [email protected]; Viacheslav Ovsiienko 
> <[email protected]>;
> Vladimir Medvedkin <[email protected]>; Yipeng Wang 
> <[email protected]>;
> nd <[email protected]>
> Subject: Re: [PATCH v2 09/19] rcu: use rte optional stdatomic API
> 
> On Wed, Oct 25, 2023 at 09:41:22AM +0000, Ruifeng Wang wrote:
> > > -----Original Message-----
> > > From: Tyler Retzlaff <[email protected]>
> > > Sent: Wednesday, October 18, 2023 4:31 AM
> > > To: [email protected]
> > > Cc: Akhil Goyal <[email protected]>; Anatoly Burakov
> > > <[email protected]>; Andrew Rybchenko
> > > <[email protected]>; Bruce Richardson
> > > <[email protected]>; Chenbo Xia <[email protected]>;
> > > Ciara Power <[email protected]>; David Christensen
> > > <[email protected]>; David Hunt <[email protected]>; Dmitry
> > > Kozlyuk <[email protected]>; Dmitry Malloy
> > > <[email protected]>; Elena Agostini <[email protected]>; Erik
> > > Gabriel Carrillo <[email protected]>; Fan Zhang
> > > <[email protected]>; Ferruh Yigit <[email protected]>;
> > > Harman Kalra <[email protected]>; Harry van Haaren
> > > <[email protected]>; Honnappa Nagarahalli
> > > <[email protected]>; [email protected]; Konstantin
> > > Ananyev <[email protected]>; Matan Azrad
> > > <[email protected]>; Maxime Coquelin <[email protected]>;
> > > Narcisa Ana Maria Vasile <[email protected]>; Nicolas
> > > Chautru <[email protected]>; Olivier Matz
> > > <[email protected]>; Ori Kam <[email protected]>; Pallavi Kadam
> > > <[email protected]>; Pavan Nikhilesh
> > > <[email protected]>; Reshma Pattan <[email protected]>;
> > > Sameh Gobriel <[email protected]>; Shijith Thotton
> > > <[email protected]>; Sivaprasad Tummala
> > > <[email protected]>; Stephen Hemminger
> > > <[email protected]>; Suanming Mou <[email protected]>;
> > > Sunil Kumar Kori <[email protected]>; [email protected];
> > > Viacheslav Ovsiienko <[email protected]>; Vladimir Medvedkin
> > > <[email protected]>; Yipeng Wang
> > > <[email protected]>; Tyler Retzlaff
> > > <[email protected]>
> > > Subject: [PATCH v2 09/19] rcu: use rte optional stdatomic API
> > >
> > > Replace the use of gcc builtin __atomic_xxx intrinsics with
> > > corresponding rte_atomic_xxx optional stdatomic API
> > >
> > > Signed-off-by: Tyler Retzlaff <[email protected]>
> > > ---
> > >  lib/rcu/rte_rcu_qsbr.c | 48 +++++++++++++++++------------------
> > >  lib/rcu/rte_rcu_qsbr.h | 68
> > > +++++++++++++++++++++++++-------------------------
> > >  2 files changed, 58 insertions(+), 58 deletions(-)
> > >
> > > diff --git a/lib/rcu/rte_rcu_qsbr.c b/lib/rcu/rte_rcu_qsbr.c index
> > > 17be93e..4dc7714 100644
> > > --- a/lib/rcu/rte_rcu_qsbr.c
> > > +++ b/lib/rcu/rte_rcu_qsbr.c
> > > @@ -102,21 +102,21 @@
> > >    * go out of sync. Hence, additional checks are required.
> > >    */
> > >   /* Check if the thread is already registered */
> > > - old_bmap = __atomic_load_n(__RTE_QSBR_THRID_ARRAY_ELM(v, i),
> > > -                                 __ATOMIC_RELAXED);
> > > + old_bmap = rte_atomic_load_explicit(__RTE_QSBR_THRID_ARRAY_ELM(v, i),
> > > +                                 rte_memory_order_relaxed);
> > >   if (old_bmap & 1UL << id)
> > >           return 0;
> > >
> > >   do {
> > >           new_bmap = old_bmap | (1UL << id);
> > > -         success = __atomic_compare_exchange(
> > > +         success = rte_atomic_compare_exchange_strong_explicit(
> > >                                   __RTE_QSBR_THRID_ARRAY_ELM(v, i),
> > > -                                 &old_bmap, &new_bmap, 0,
> > > -                                 __ATOMIC_RELEASE, __ATOMIC_RELAXED);
> > > +                                 &old_bmap, new_bmap,
> > > +                                 rte_memory_order_release, 
> > > rte_memory_order_relaxed);
> > >
> > >           if (success)
> > > -                 __atomic_fetch_add(&v->num_threads,
> > > -                                         1, __ATOMIC_RELAXED);
> > > +                 rte_atomic_fetch_add_explicit(&v->num_threads,
> > > +                                         1, rte_memory_order_relaxed);
> > >           else if (old_bmap & (1UL << id))
> > >                   /* Someone else registered this thread.
> > >                    * Counter should not be incremented.
> > > @@ -154,8 +154,8 @@
> > >    * go out of sync. Hence, additional checks are required.
> > >    */
> > >   /* Check if the thread is already unregistered */
> > > - old_bmap = __atomic_load_n(__RTE_QSBR_THRID_ARRAY_ELM(v, i),
> > > -                                 __ATOMIC_RELAXED);
> > > + old_bmap = rte_atomic_load_explicit(__RTE_QSBR_THRID_ARRAY_ELM(v, i),
> > > +                                 rte_memory_order_relaxed);
> > >   if (!(old_bmap & (1UL << id)))
> > >           return 0;
> > >
> > > @@ -165,14 +165,14 @@
> > >            * completed before removal of the thread from the list of
> > >            * reporting threads.
> > >            */
> > > -         success = __atomic_compare_exchange(
> > > +         success = rte_atomic_compare_exchange_strong_explicit(
> > >                                   __RTE_QSBR_THRID_ARRAY_ELM(v, i),
> > > -                                 &old_bmap, &new_bmap, 0,
> > > -                                 __ATOMIC_RELEASE, __ATOMIC_RELAXED);
> > > +                                 &old_bmap, new_bmap,
> > > +                                 rte_memory_order_release, 
> > > rte_memory_order_relaxed);
> > >
> > >           if (success)
> > > -                 __atomic_fetch_sub(&v->num_threads,
> > > -                                         1, __ATOMIC_RELAXED);
> > > +                 rte_atomic_fetch_sub_explicit(&v->num_threads,
> > > +                                         1, rte_memory_order_relaxed);
> > >           else if (!(old_bmap & (1UL << id)))
> > >                   /* Someone else unregistered this thread.
> > >                    * Counter should not be incremented.
> > > @@ -227,8 +227,8 @@
> > >
> > >   fprintf(f, "  Registered thread IDs = ");
> > >   for (i = 0; i < v->num_elems; i++) {
> > > -         bmap = __atomic_load_n(__RTE_QSBR_THRID_ARRAY_ELM(v, i),
> > > -                                 __ATOMIC_ACQUIRE);
> > > +         bmap = rte_atomic_load_explicit(__RTE_QSBR_THRID_ARRAY_ELM(v, 
> > > i),
> > > +                                 rte_memory_order_acquire);
> > >           id = i << __RTE_QSBR_THRID_INDEX_SHIFT;
> > >           while (bmap) {
> > >                   t = __builtin_ctzl(bmap);
> > > @@ -241,26 +241,26 @@
> > >   fprintf(f, "\n");
> > >
> > >   fprintf(f, "  Token = %" PRIu64 "\n",
> > > -                 __atomic_load_n(&v->token, __ATOMIC_ACQUIRE));
> > > +                 rte_atomic_load_explicit(&v->token, 
> > > rte_memory_order_acquire));
> > >
> > >   fprintf(f, "  Least Acknowledged Token = %" PRIu64 "\n",
> > > -                 __atomic_load_n(&v->acked_token, __ATOMIC_ACQUIRE));
> > > +                 rte_atomic_load_explicit(&v->acked_token,
> > > +rte_memory_order_acquire));
> > >
> > >   fprintf(f, "Quiescent State Counts for readers:\n");
> > >   for (i = 0; i < v->num_elems; i++) {
> > > -         bmap = __atomic_load_n(__RTE_QSBR_THRID_ARRAY_ELM(v, i),
> > > -                                 __ATOMIC_ACQUIRE);
> > > +         bmap = rte_atomic_load_explicit(__RTE_QSBR_THRID_ARRAY_ELM(v, 
> > > i),
> > > +                                 rte_memory_order_acquire);
> > >           id = i << __RTE_QSBR_THRID_INDEX_SHIFT;
> > >           while (bmap) {
> > >                   t = __builtin_ctzl(bmap);
> > >                   fprintf(f, "thread ID = %u, count = %" PRIu64 ", lock 
> > > count = %u\n",
> > >                           id + t,
> > > -                         __atomic_load_n(
> > > +                         rte_atomic_load_explicit(
> > >                                   &v->qsbr_cnt[id + t].cnt,
> > > -                                 __ATOMIC_RELAXED),
> > > -                         __atomic_load_n(
> > > +                                 rte_memory_order_relaxed),
> > > +                         rte_atomic_load_explicit(
> > >                                   &v->qsbr_cnt[id + t].lock_cnt,
> > > -                                 __ATOMIC_RELAXED));
> > > +                                 rte_memory_order_relaxed));
> > >                   bmap &= ~(1UL << t);
> > >           }
> > >   }
> > > diff --git a/lib/rcu/rte_rcu_qsbr.h b/lib/rcu/rte_rcu_qsbr.h index
> > > 87e1b55..9f4aed2 100644
> > > --- a/lib/rcu/rte_rcu_qsbr.h
> > > +++ b/lib/rcu/rte_rcu_qsbr.h
> > > @@ -63,11 +63,11 @@
> > >   * Given thread id needs to be converted to index into the array and
> > >   * the id within the array element.
> > >   */
> > > -#define __RTE_QSBR_THRID_ARRAY_ELM_SIZE (sizeof(uint64_t) * 8)
> > > +#define __RTE_QSBR_THRID_ARRAY_ELM_SIZE
> > > +(sizeof(RTE_ATOMIC(uint64_t)) *
> > > +8)
> > >  #define __RTE_QSBR_THRID_ARRAY_SIZE(max_threads) \
> > >   RTE_ALIGN(RTE_ALIGN_MUL_CEIL(max_threads, \
> > >           __RTE_QSBR_THRID_ARRAY_ELM_SIZE) >> 3, RTE_CACHE_LINE_SIZE)
> > > -#define __RTE_QSBR_THRID_ARRAY_ELM(v, i) ((uint64_t *) \
> > > +#define __RTE_QSBR_THRID_ARRAY_ELM(v, i) ((uint64_t __rte_atomic *)
> > > +\
> >
> > Is it equivalent to ((RTE_ATOMIC(uint64_t) *)?
> 
> i'm not sure if you're asking about the resultant type of the expression or 
> not?

I see other places are using specifier hence the question.

> 
> in this context we aren't specifying an atomic type but rather adding the 
> atomic qualifier
> to what should already be a variable that has an atomic specified type with a 
> cast which
> is why we use __rte_atomic.

I read from document [1] that atomic qualified type may have a different size 
from the original type.
If that is the case, the size difference could cause issue in bitmap array 
accessing.
Did I misunderstand?

[1] https://en.cppreference.com/w/c/language/atomic

> 
> >
> > >   ((struct rte_rcu_qsbr_cnt *)(v + 1) + v->max_threads) + i)
> > > #define __RTE_QSBR_THRID_INDEX_SHIFT 6  #define
> > > __RTE_QSBR_THRID_MASK 0x3f @@ -75,13 +75,13 @@
> > >
> >
> > <snip>

Reply via email to