[PATCH 1/3] lib/eal: add rte_atomic128_cmp_exchange compatible with MSVC
Andre Muezerie
andremue at linux.microsoft.com
Tue Dec 10 17:32:32 CET 2024
MSVC does not support inline assembly, which is used by the
implementation of rte_atomic128_cmp_exchange and is needed
by lib/stack.
Error printed by MSVC:
stack_rte_stack_lf.c.obj : error LNK2019:
unresolved external symbol rte_atomic128_cmp_exchange referenced
in function __rte_stack_lf_push_elems
Fix is to provide an implementation for rte_atomic128_cmp_exchange
which uses an intrinsic function, which is used when compiling with
MSVC. For other compilers the existing implementation continues to
be used.
Signed-off-by: Andre Muezerie <andremue at linux.microsoft.com>
---
lib/eal/x86/include/rte_atomic.h | 4 ++--
lib/eal/x86/include/rte_atomic_64.h | 18 ++++++++++++++++++
2 files changed, 20 insertions(+), 2 deletions(-)
diff --git a/lib/eal/x86/include/rte_atomic.h b/lib/eal/x86/include/rte_atomic.h
index c72c47c83e..e8e0e4c33c 100644
--- a/lib/eal/x86/include/rte_atomic.h
+++ b/lib/eal/x86/include/rte_atomic.h
@@ -288,12 +288,12 @@ static inline int rte_atomic32_dec_and_test(rte_atomic32_t *v)
#endif
+#endif /* RTE_TOOLCHAIN_MSVC */
+
#ifdef RTE_ARCH_I686
#include "rte_atomic_32.h"
#else
#include "rte_atomic_64.h"
#endif
-#endif
-
#endif /* _RTE_ATOMIC_X86_H_ */
diff --git a/lib/eal/x86/include/rte_atomic_64.h b/lib/eal/x86/include/rte_atomic_64.h
index 0a7a2131e0..26c87a2da6 100644
--- a/lib/eal/x86/include/rte_atomic_64.h
+++ b/lib/eal/x86/include/rte_atomic_64.h
@@ -182,6 +182,23 @@ static inline void rte_atomic64_clear(rte_atomic64_t *v)
/*------------------------ 128 bit atomic operations -------------------------*/
+#ifdef RTE_TOOLCHAIN_MSVC
+static inline int
+rte_atomic128_cmp_exchange(rte_int128_t *dst,
+ rte_int128_t *exp,
+ const rte_int128_t *src,
+ unsigned int weak,
+ int success,
+ int failure)
+{
+ return (int)_InterlockedCompareExchange128(
+ (int64_t volatile *) dst,
+ src->val[1], /* exchange high */
+ src->val[0], /* exchange low */
+ (int64_t *) exp /* comparand result */
+ );
+}
+#else
static inline int
rte_atomic128_cmp_exchange(rte_int128_t *dst,
rte_int128_t *exp,
@@ -212,5 +229,6 @@ rte_atomic128_cmp_exchange(rte_int128_t *dst,
return res;
}
+#endif /* RTE_TOOLCHAIN_MSVC */
#endif /* _RTE_ATOMIC_X86_64_H_ */
--
2.47.0.vfs.0.3
More information about the dev
mailing list