DPDK patches and discussions
 help / color / mirror / Atom feed
From: Thomas Monjalon <thomas@monjalon.net>
To: "Tyler Retzlaff" <roretzla@linux.microsoft.com>,
	"Morten Brørup" <mb@smartsharesystems.com>
Cc: Bruce Richardson <bruce.richardson@intel.com>,
	dev@dpdk.org, techboard@dpdk.org, david.marchand@redhat.com,
	Honnappa.Nagarahalli@arm.com
Subject: Re: C11 atomics adoption blocked
Date: Mon, 14 Aug 2023 15:46:18 +0200	[thread overview]
Message-ID: <3629940.iIbC2pHGDl@thomas> (raw)
In-Reply-To: <98CBD80474FA8B44BF855DF32C47DC35D87AD8@smartserver.smartshare.dk>

mercredi 9 août 2023, Morten Brørup:
> > From: Tyler Retzlaff [mailto:roretzla@linux.microsoft.com]
> > Sent: Tuesday, 8 August 2023 22.50
> > 
> > On Tue, Aug 08, 2023 at 10:22:09PM +0200, Morten Brørup wrote:
> > > > From: Tyler Retzlaff [mailto:roretzla@linux.microsoft.com]
> > > > Sent: Tuesday, 8 August 2023 21.20
> > > >
> > > > On Tue, Aug 08, 2023 at 07:23:41PM +0100, Bruce Richardson wrote:
> > > > > On Tue, Aug 08, 2023 at 10:53:03AM -0700, Tyler Retzlaff wrote:
> > > > > > Hi folks,
> > > > > >
> > > > > > Moving this discussion to the dev mailing list for broader
> > comment.
> > > > > >
> > > > > > Unfortunately, we've hit a roadblock with integrating C11
> > atomics
> > > > > > for DPDK.  The main issue is that GNU C++ prior to -std=c++23
> > > > explicitly
> > > > > > cannot be integrated with C11 stdatomic.h.  Basically, you can't
> > > > include
> > > > > > the header and you can't use `_Atomic' type specifier to declare
> > > > atomic
> > > > > > types. This is not a problem with LLVM or MSVC as they both
> > allow
> > > > > > integration with C11 stdatomic.h, but going forward with C11
> > atomics
> > > > > > would break using DPDK in C++ programs when building with GNU
> > g++.
> > > > > >
> > > > > > Essentially you cannot compile the following with g++.
> > > > > >
> > > > > >   #include <stdatomic.h>
> > > > > >
> > > > > >   int main(int argc, char *argv[]) { return 0; }
> > > > > >
> > > > > >   In file included from atomic.cpp:1:
> > > > > >   /usr/lib/gcc/x86_64-pc-cygwin/11/include/stdatomic.h:40:9:
> > error:
> > > > > >   ‘_Atomic’ does not name a type
> > > > > >      40 | typedef _Atomic _Bool atomic_bool;
> > > > > >
> > > > > >   ... more errors of same ...
> > > > > >
> > > > > > It's also acknowledged as something known and won't fix by GNU
> > g++
> > > > > > maintainers.
> > > > > >
> > > > > > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60932
> > > > > >
> > > > > > Given the timeframe I would like to propose the minimally
> > invasive,
> > > > > > lowest risk solution as follows.
> > > > > >
> > > > > > 1.  Adopt stdatomic.h for all Windows targets, leave all
> > Linux/BSD
> > > > targets
> > > > > >     using GCC builtin C++11 memory model atomics.
> > > > > > 2.  Introduce a macro that allows _Atomic type specifier to be
> > > > applied to
> > > > > >     function parameter, structure field types and variable
> > > > declarations.
> > > > > >
> > > > > >     * The macro would expand empty for Linux/BSD targets.
> > > > > >     * The macro would expand to C11 _Atomic keyword for Windows
> > > > targets.
> > > > > >
> > > > > > 3.  Introduce basic macro that allows __atomic_xxx  for
> > normalized
> > > > use
> > > > > >     internal to DPDK.
> > > > > >
> > > > > >     * The macro would not be defined for Linux/BSD targets.
> > > > > >     * The macro would expand __atomic_xxx to corresponding
> > > > stdatomic.h
> > > > > >       atomic_xxx operations for Windows targets.
> > > > > >
> > >
> > > Regarding naming of these macros (suggested in 2. and 3.), they should
> > probably bear the rte_ prefix instead of overlapping existing names, so
> > applications can also use them directly.
> > >
> > > E.g.:
> > > #define rte_atomic for _Atomic or nothing,
> > > #define rte_atomic_fetch_add() for atomic_fetch_add() or
> > __atomic_fetch_add(), and
> > > #define RTE_MEMORY_ORDER_SEQ_CST for memory_order_seq_cst or
> > __ATOMIC_SEQ_CST.
> > >
> > > Maybe that is what you meant already. I'm not sure of the scope and
> > details of your suggestion here.
> > 
> > I'm shy to do anything in the rte_ namespace because I don't want to
> > formalize it as an API.
> > 
> > I was envisioning the following.
> > 
> > Internally DPDK code just uses __atomic_fetch_add directly, the macros
> > are provided for Windows targets to expand to __atomic_fetch_add.
> > 
> > Externally DPDK applications that don't care about being portable may
> > use __atomic_fetch_add (BSD/Linux) or atomic_fetch_add (Windows)
> > directly.
> > 
> > Externally DPDK applications that care to be portable may do what is
> > done Internally and <<use>> the __atomic_fetch_add directly. By
> > including say rte_stdatomic.h indirectly (Windows) gets the macros
> > expanded to atomic_fetch_add and for BSD/Linux it's a noop include.
> > 
> > Basically I'm placing a little ugly into Windows built code and in trade
> > we don't end up with a bunch of rte_ APIs that were strongly objected to
> > previously.
> > 
> > It's a compromise.
> 
> OK, we probably need to offer a public header file to wrap the atomics, using either names prefixed with rte_ or names similar to the gcc builtin atomics.
> 
> I guess the objections were based on the assumption that we were switching to C11 atomics with DPDK 23.11, so the rte_ prefixed atomic APIs would be very short lived (DPDK 23.07 to 23.11 only). But with this new information about GNU C++ incompatibility, that seems not to be the case, so the naming discussion can be reopened.
> 
> If we don't introduce such a wrapper header, all portable code needs to surround the use of atomics with #ifdef USE_STDATOMIC_H.
> 
> BTW: Can the compilers that understand both builtin atomics and C11 stdatomics.h handle code with #define __atomic_fetch_add atomic_fetch_add and #define __ATOMIC_SEQ_CST memory_order_seq_cst? If not, then we need to use rte_ prefixed atomics.
> 
> And what about C++ atomics... Do we want (or need?) a third variant using C++ atomics, e.g. "atomic<int> x;" instead of "_Atomic int x;"? (I hope not!) For reference, the "atomic_int" type is "_Atomic int" in C, but "std::atomic<int>" in C++.
> 
> C++23 provides the C11 compatibility macro "_Atomic(T)", which means "_Atomic T" in C and "std::atomic<T>" in C++. Perhaps we can somewhat rely on this, and update our coding standards to require using e.g. "_Atomic(int)" for atomic types, and disallow using "_Atomic int".

You mean the syntax _Atomic(T) is working well in both C and C++?



  reply	other threads:[~2023-08-14 13:46 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-08-08 17:53 Tyler Retzlaff
2023-08-08 18:23 ` Bruce Richardson
2023-08-08 19:19   ` Tyler Retzlaff
2023-08-08 20:22     ` Morten Brørup
2023-08-08 20:49       ` Tyler Retzlaff
2023-08-09  8:48         ` Morten Brørup
2023-08-14 13:46           ` Thomas Monjalon [this message]
2023-08-14 15:13             ` Morten Brørup
2023-08-16 17:25               ` Tyler Retzlaff
2023-08-16 20:30                 ` Morten Brørup

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=3629940.iIbC2pHGDl@thomas \
    --to=thomas@monjalon.net \
    --cc=Honnappa.Nagarahalli@arm.com \
    --cc=bruce.richardson@intel.com \
    --cc=david.marchand@redhat.com \
    --cc=dev@dpdk.org \
    --cc=mb@smartsharesystems.com \
    --cc=roretzla@linux.microsoft.com \
    --cc=techboard@dpdk.org \
    /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).