DPDK patches and discussions
 help / color / mirror / Atom feed
From: Tyler Retzlaff <roretzla@linux.microsoft.com>
To: "Morten Brørup" <mb@smartsharesystems.com>
Cc: dev@dpdk.org, david.marchand@redhat.com, thomas@monjalon.net,
	Honnappa.Nagarahalli@arm.com, bruce.richardson@intel.com
Subject: Re: [PATCH v2] eal: introduce atomics abstraction
Date: Thu, 9 Feb 2023 14:04:23 -0800	[thread overview]
Message-ID: <20230209220423.GA5398@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net> (raw)
In-Reply-To: <98CBD80474FA8B44BF855DF32C47DC35D87727@smartserver.smartshare.dk>

On Thu, Feb 09, 2023 at 08:19:14PM +0100, Morten Brørup wrote:
> > From: Tyler Retzlaff [mailto:roretzla@linux.microsoft.com]
> > Sent: Thursday, 9 February 2023 19.15
> > 
> > On Thu, Feb 09, 2023 at 09:05:46AM +0100, Morten Brørup wrote:
> > > > From: Tyler Retzlaff [mailto:roretzla@linux.microsoft.com]
> > > > Sent: Wednesday, 8 February 2023 22.44
> > > >
> > > > Introduce atomics abstraction that permits optional use of standard
> > C11
> > > > atomics when meson is provided the new enable_stdatomics=true
> > option.
> > > >
> > > > Signed-off-by: Tyler Retzlaff <roretzla@linux.microsoft.com>
> > > > ---
> > >
> > > Looks good. A few minor suggestions about implementation only.
> > >
> > > With or without suggested modifications,
> > >
> > > Acked-by: Morten Brørup <mb@smartsharesystems.com>
> 
> [...]
> 
> > > > diff --git a/lib/eal/include/generic/rte_atomic.h
> > > > b/lib/eal/include/generic/rte_atomic.h
> > > > index f5c49a9..392d928 100644
> > > > --- a/lib/eal/include/generic/rte_atomic.h
> > > > +++ b/lib/eal/include/generic/rte_atomic.h
> > > > @@ -110,6 +110,100 @@
> > > >
> > > >  #endif /* __DOXYGEN__ */
> > > >
> > > > +#ifdef RTE_STDC_ATOMICS
> > > > +
> > > > +#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 201112L ||
> > > > defined(__STDC_NO_ATOMICS__)
> > > > +#error compiler does not support C11 standard atomics
> > > > +#else
> > > > +#include <stdatomic.h>
> > > > +#endif
> > > > +
> > > > +#define __rte_atomic _Atomic
> > > > +
> > > > +typedef int rte_memory_order;
> > >
> > > I would prefer enum for rte_memory_order:
> > >
> > > typedef enum {
> > >     rte_memory_order_relaxed = memory_order_relaxed,
> > >     rte_memory_order_consume = memory_order_consume,
> > >     rte_memory_order_acquire = memory_order_acquire,
> > >     rte_memory_order_release = memory_order_release,
> > >     rte_memory_order_acq_rel = memory_order_acq_rel,
> > >     rte_memory_order_seq_cst = memory_order_seq_cst
> > > } rte_memory_order;
> > 
> > the reason for not using enum type is abi related. the c standard has
> > this little gem.
> > 
> >     ISO/IEC 9899:2011
> > 
> >     6.7.2.2 (4)
> >     Each enumerated type shall be compatible with char, a signed
> > integer
> >     type, or an unsigned integer type. The choice of type is
> >     implementation-defined, 128) but shall be capable of representing
> > the
> >     values of all the members of the enumeration.
> > 
> >     128) An implementation may delay the choice of which integer type
> > until
> >     all enumeration constants have been seen.
> > 
> > so i'm just being overly protective of maintaining the forward
> > compatibility of the abi.
> > 
> > probably i'm being super unnecessarily cautious in this case since i
> > think
> > in practice even if an implementation chose sizeof(char) i doubt very
> > much
> > that enough enumerated values would get added to this enumeration
> > within
> > the lifetime of the API to suddenly cause the compiler to choose >
> > sizeof(char).
> 
> I am under the impression that compilers usually instantiate enum as int, and you can make it use a smaller size by decorating it with the "packed" attribute - I have benefited from that in the past.

generally i think most implementations choose int as a default but i
think there is potential for char to get used if the compiler is asked
to optimize for size. not a likely optimization preference when using dpdk.

> 
> The only risk I am effectively trying to avoid is someone calling an rte_atomic() function with "order" being another value than one of these values. Probably not ever going to happen.
> 
> Your solution also addresses an academic risk (of the compiler using another type than int for the enum), which will have unwanted side effects - especially if the "order" parameter to the rte_atomic() functions becomes char instead of int.
> 
> I can now conclude that your proposed type (int) is stronger/safer than the type (enum) I suggested. So please keep what you have.
> 
> > 
> > incidentally this is also 
> > 
> 
> [...]
> 
> > > > +#define rte_atomic_compare_exchange_strong_explicit(obj, expected,
> > > > desired, success, fail) \
> > > > +	__atomic_compare_exchange_n(obj, expected, desired, 0, success,
> > > > fail)
> > >
> > > The type of the "weak" parameter to __atomic_compare_exchange_n() is
> > bool, not int, so use "false" instead of 0. There is probably no
> > practical difference, so I'll leave it up to you.
> > >
> > > You might need to include <stdbool.h> for this... I haven't checked.
> > 
> > strictly speaking you are correct the intrinsic does take bool
> > according
> > to documentation.
> > 
> >     ISO/IEC 9899:2011
> > 
> >     7.18 Boolean type and values <stdbool.h>
> >     (1) The header <stdbool.h> defines four macros.
> >     (2) The macro bool expands to _Bool.
> >     (3) The remaining three macros are suitable for use in #if
> > preprocessing
> > 	directives. They are `true' which expands to the integer constant
> > 1,
> > 	`false' which expands to the integer constant 0, and
> > 	__bool_true_false_are_defined which expands to the integer
> > constant 1.
> 
> Thank you for this reference. I wasn't aware that the two boolean values explicitly expanded to those two integer constants. I had never thought about it, but simply assumed that the constant "true" had the same meaning as "not false", like "if (123)" evaluates "123" as true.
> 
> So I learned something new today.
> 
> > 
> > so i could include the header, to expand a macro which expands to
> > integer constant 0 or 1 as appropriate for weak vs strong. do you think
> > i should? (serious question) if you answer yes, i'll make the change.
> 
> Then no. Please keep the 1's and 0's.

thanks! will leave it as is.

  reply	other threads:[~2023-02-09 22:04 UTC|newest]

Thread overview: 51+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-01-12 21:26 [PATCH] eal: abstract compiler atomics Tyler Retzlaff
2023-01-12 21:26 ` [PATCH] eal: introduce atomics abstraction Tyler Retzlaff
2023-01-31 22:42   ` Thomas Monjalon
2023-02-01  1:07     ` Honnappa Nagarahalli
2023-02-01  8:09       ` Morten Brørup
2023-02-01 21:41       ` Tyler Retzlaff
2023-02-02  8:43         ` Morten Brørup
2023-02-02 19:00           ` Tyler Retzlaff
2023-02-02 20:44             ` Morten Brørup
2023-02-03 13:56               ` Bruce Richardson
2023-02-03 14:25                 ` Morten Brørup
2023-02-03 12:19             ` Bruce Richardson
2023-02-03 20:49               ` Tyler Retzlaff
2023-02-07 15:16                 ` Morten Brørup
2023-02-07 21:58                   ` Tyler Retzlaff
2023-02-07 23:34         ` Honnappa Nagarahalli
2023-02-08  1:20           ` Tyler Retzlaff
2023-02-08  8:31             ` Morten Brørup
2023-02-08 16:35               ` Tyler Retzlaff
2023-02-09  0:16                 ` Honnappa Nagarahalli
2023-02-09  8:34                   ` Morten Brørup
2023-02-09 17:30                   ` Tyler Retzlaff
2023-02-10  5:30                     ` Honnappa Nagarahalli
2023-02-10 20:30                       ` Tyler Retzlaff
2023-02-13  5:04                         ` Honnappa Nagarahalli
2023-02-13 15:28                           ` Ben Magistro
2023-02-13 15:55                             ` Bruce Richardson
2023-02-13 16:46                               ` Ben Magistro
2023-02-13 17:49                                 ` Morten Brørup
2023-02-13 23:18                           ` Tyler Retzlaff
2023-01-31 21:33 ` [PATCH] eal: abstract compiler atomics Tyler Retzlaff
2023-02-08 21:43 ` [PATCH v2] " Tyler Retzlaff
2023-02-08 21:43   ` [PATCH v2] eal: introduce atomics abstraction Tyler Retzlaff
2023-02-09  8:05     ` Morten Brørup
2023-02-09 18:15       ` Tyler Retzlaff
2023-02-09 19:19         ` Morten Brørup
2023-02-09 22:04           ` Tyler Retzlaff [this message]
2023-04-03 21:17       ` Mattias Rönnblom
2023-02-09  9:04     ` Bruce Richardson
2023-02-09 12:53       ` Ferruh Yigit
2023-02-09 17:40         ` Tyler Retzlaff
2023-02-09 22:13           ` Ferruh Yigit
2023-02-10  0:36             ` Tyler Retzlaff
2023-02-09 17:38       ` Tyler Retzlaff
2023-04-03 21:32         ` Mattias Rönnblom
2023-04-03 21:11     ` Mattias Rönnblom
2023-04-03 21:25       ` Honnappa Nagarahalli
2023-04-04  2:24       ` Tyler Retzlaff
2023-02-22 18:09   ` [PATCH v2] eal: abstract compiler atomics Tyler Retzlaff
2023-02-22 20:07     ` Honnappa Nagarahalli
2023-02-23 19:11       ` Tyler Retzlaff

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=20230209220423.GA5398@linuxonhyperv3.guj3yctzbm1etfxqx2vob5hsef.xx.internal.cloudapp.net \
    --to=roretzla@linux.microsoft.com \
    --cc=Honnappa.Nagarahalli@arm.com \
    --cc=bruce.richardson@intel.com \
    --cc=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    --cc=mb@smartsharesystems.com \
    --cc=thomas@monjalon.net \
    /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;
as well as URLs for NNTP newsgroup(s).