patch 'eal: fix C++ build when stdatomics is set' has been queued to stable release 24.11.9

luca.boccassi at gmail.com luca.boccassi at gmail.com
Tue Oct 27 12:50:05 CET 2026


Hi,

FYI, your patch has been queued to stable release 24.11.9

Note it hasn't been pushed to http://dpdk.org/browse/dpdk-stable yet.
It will be pushed if I get no objections before 10/29/26. 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/bluca/dpdk-stable

This queued commit can be viewed at:
https://github.com/bluca/dpdk-stable/commit/f93d42d918964c6bbb27b035a6d68db7a025ce51

Thanks.

Luca Boccassi

---
>From f93d42d918964c6bbb27b035a6d68db7a025ce51 Mon Sep 17 00:00:00 2001
From: Bruce Richardson <bruce.richardson at intel.com>
Date: Fri, 25 Sep 2026 13:49:58 +0100
Subject: [PATCH] eal: fix C++ build when stdatomics is set
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

[ upstream commit 3171b278ca807344b9fb6192b96af730ab70a403 ]

When the DPDK build is configured to use stdatomics rather than compiler
builtin atomics, the C++ chkincs builds were failing

In file included from buildtools/chkincs/staging/generic/rte_atomic.h:18,
                 from lib/eal/x86/include/rte_atomic.h:12,
                 from buildtools/chkincs/chkincs-cpp.p/rte_atomic.cpp:1:
buildtools/chkincs/staging/rte_stdatomic.h:30:9: error:
‘memory_order’ does not name a type
   30 | typedef memory_order rte_memory_order;
      |         ^~~~~~~~~~~~

The cause is differences in atomics in C (C11) and C++ (e.g. C++17 as
supported by current GCC). As explained by AI analysis:

   _Atomic(T) is a C11 feature. In C++ mode, GCC 15 does not support it
   as a type specifier, and <stdatomic.h> in C++17 doesn't expose
   memory_order in the global namespace (that's only in C++23). DPDK
   headers also use _Atomic in anonymous unions and under extern "C",
   which are incompatible with C++'s std::atomic<T> mapping.

To fix this in a resilient manner we need to go from two blocks in
rte_atomic.h to three. We have the existing non-standard/builtin
atomics path, but the standard atomic path now needs to be split into C
compatible and C++ compatible blocks. This fixes the build issues with
C++ while keeping existing C builds unchanged.

Bugzilla ID: 1985
Fixes: 5c381a3587d1 ("eal: provide stdatomic API")

Signed-off-by: Bruce Richardson <bruce.richardson at intel.com>
---
 .ci/linux-build.sh              |  8 +++-
 lib/eal/include/rte_stdatomic.h | 75 +++++++++++++++++++++++++++++++++
 2 files changed, 81 insertions(+), 2 deletions(-)

diff --git a/.ci/linux-build.sh b/.ci/linux-build.sh
index fdb57876211..ce25aec4bfb 100755
--- a/.ci/linux-build.sh
+++ b/.ci/linux-build.sh
@@ -94,9 +94,13 @@ OPTS="$OPTS -Dplatform=generic"
 OPTS="$OPTS -Ddefault_library=$DEF_LIB"
 OPTS="$OPTS -Dbuildtype=$buildtype"
 if [ "$STDATOMIC" = "true" ]; then
-	OPTS="$OPTS -Denable_stdatomic=true"
+    OPTS="$OPTS -Denable_stdatomic=true"
+fi
+OPTS="$OPTS -Dcheck_includes=true"
+if [ "${CC%%clang}" != "$CC" ]; then
+    export CXX=clang++
 else
-	OPTS="$OPTS -Dcheck_includes=true"
+    export CXX=g++
 fi
 if [ "$MINI" = "true" ]; then
     OPTS="$OPTS -Denable_drivers=net/null"
diff --git a/lib/eal/include/rte_stdatomic.h b/lib/eal/include/rte_stdatomic.h
index 7258b393f1f..d31eb4bfab9 100644
--- a/lib/eal/include/rte_stdatomic.h
+++ b/lib/eal/include/rte_stdatomic.h
@@ -8,6 +8,8 @@
 #include <assert.h>
 
 #ifdef RTE_ENABLE_STDATOMIC
+
+#ifndef __cplusplus
 #ifndef _MSC_VER
 #ifdef __STDC_NO_ATOMICS__
 #error enable_stdatomic=true but atomics not supported by toolchain
@@ -114,6 +116,79 @@ static_assert(rte_memory_order_seq_cst == __ATOMIC_SEQ_CST,
 #define __rte_atomic_thread_fence(memorder) \
 	atomic_thread_fence(memorder)
 
+#else /* __cplusplus */
+
+/* C++ cannot use the C11 _Atomic member layout that DPDK public headers
+ * rely on, so keep the builtin-based implementation for C++ and continue
+ * to expose the existing rte_atomic_* API surface.
+ */
+#define RTE_ATOMIC(type) type
+
+#define __rte_atomic
+
+/* The memory order is an integer type in GCC built-ins,
+ * not an enumerated type like in C11.
+ */
+typedef int rte_memory_order;
+
+#define rte_memory_order_relaxed __ATOMIC_RELAXED
+#define rte_memory_order_consume __ATOMIC_CONSUME
+#define rte_memory_order_acquire __ATOMIC_ACQUIRE
+#define rte_memory_order_release __ATOMIC_RELEASE
+#define rte_memory_order_acq_rel __ATOMIC_ACQ_REL
+#define rte_memory_order_seq_cst __ATOMIC_SEQ_CST
+
+#define rte_atomic_load_explicit(ptr, memorder) \
+	__atomic_load_n(ptr, memorder)
+
+#define rte_atomic_store_explicit(ptr, val, memorder) \
+	__atomic_store_n(ptr, val, memorder)
+
+#define rte_atomic_exchange_explicit(ptr, val, memorder) \
+	__atomic_exchange_n(ptr, val, memorder)
+
+#define rte_atomic_compare_exchange_strong_explicit(ptr, expected, desired, \
+		succ_memorder, fail_memorder) \
+	__atomic_compare_exchange_n(ptr, expected, desired, 0, \
+		succ_memorder, fail_memorder)
+
+#define rte_atomic_compare_exchange_weak_explicit(ptr, expected, desired, \
+		succ_memorder, fail_memorder) \
+	__atomic_compare_exchange_n(ptr, expected, desired, 1, \
+		succ_memorder, fail_memorder)
+
+#define rte_atomic_fetch_add_explicit(ptr, val, memorder) \
+	__atomic_fetch_add(ptr, val, memorder)
+
+#define rte_atomic_fetch_sub_explicit(ptr, val, memorder) \
+	__atomic_fetch_sub(ptr, val, memorder)
+
+#define rte_atomic_fetch_and_explicit(ptr, val, memorder) \
+	__atomic_fetch_and(ptr, val, memorder)
+
+#define rte_atomic_fetch_xor_explicit(ptr, val, memorder) \
+	__atomic_fetch_xor(ptr, val, memorder)
+
+#define rte_atomic_fetch_or_explicit(ptr, val, memorder) \
+	__atomic_fetch_or(ptr, val, memorder)
+
+#define rte_atomic_fetch_nand_explicit(ptr, val, memorder) \
+	__atomic_fetch_nand(ptr, val, memorder)
+
+#define rte_atomic_flag_test_and_set_explicit(ptr, memorder) \
+	__atomic_test_and_set(ptr, memorder)
+
+#define rte_atomic_flag_clear_explicit(ptr, memorder) \
+	__atomic_clear(ptr, memorder)
+
+/* We provide internal macro here to allow conditional expansion
+ * in the body of the per-arch rte_atomic_thread_fence inline functions.
+ */
+#define __rte_atomic_thread_fence(memorder) \
+	__atomic_thread_fence(memorder)
+
+#endif /* __cplusplus */
+
 #else /* !RTE_ENABLE_STDATOMIC */
 
 #define RTE_ATOMIC(type) type
-- 
2.47.3

---
  Diff of the applied patch vs upstream commit (please double-check if non-empty:
---
--- -	2026-10-27 11:43:58.038756104 +0000
+++ 0111-eal-fix-C-build-when-stdatomics-is-set.patch	2026-10-27 11:43:53.646063535 +0000
@@ -1 +1 @@
-From 3171b278ca807344b9fb6192b96af730ab70a403 Mon Sep 17 00:00:00 2001
+From f93d42d918964c6bbb27b035a6d68db7a025ce51 Mon Sep 17 00:00:00 2001
@@ -8,0 +9,2 @@
+[ upstream commit 3171b278ca807344b9fb6192b96af730ab70a403 ]
+
@@ -37 +38,0 @@
-Cc: stable at dpdk.org
@@ -41 +42 @@
- .ci/linux-build.sh              | 11 +++--
+ .ci/linux-build.sh              |  8 +++-
@@ -43 +44 @@
- 2 files changed, 80 insertions(+), 6 deletions(-)
+ 2 files changed, 81 insertions(+), 2 deletions(-)
@@ -46 +47 @@
-index e0b914a1427..b09d72dd87a 100755
+index fdb57876211..ce25aec4bfb 100755
@@ -49 +50 @@
-@@ -111,13 +111,12 @@ OPTS="$OPTS -Dplatform=generic"
+@@ -94,9 +94,13 @@ OPTS="$OPTS -Dplatform=generic"
@@ -50,0 +52 @@
+ OPTS="$OPTS -Dbuildtype=$buildtype"
@@ -52 +54,2 @@
-     OPTS="$OPTS -Denable_stdatomic=true"
+-	OPTS="$OPTS -Denable_stdatomic=true"
++    OPTS="$OPTS -Denable_stdatomic=true"
@@ -58,6 +61 @@
--    OPTS="$OPTS -Dcheck_includes=true"
--    if [ "${CC%%clang}" != "$CC" ]; then
--        export CXX=clang++
--    else
--        export CXX=g++
--    fi
+-	OPTS="$OPTS -Dcheck_includes=true"


More information about the stable mailing list