[PATCH v10 03/10] compiler_types.h: Introduce 128-bit unqualified scalar type support

From: Suravee Suthikulpanit
Date: Wed Nov 13 2024 - 07:07:44 EST


From: Uros Bizjak <ubizjak@xxxxxxxxx>

Currently, __READ_ONCE() cannot support 128-bit data type due to the lack
of 128-bit support in __unqual_scalar_typeof() macro.

To ensure ordering for 128-bit data type when atomicity is not required,
introduce support for an unqualified scalar type __int128 if supported by
the architecture.

Cc: Arnd Bergmann <arnd@xxxxxxxx>
Cc: linux-arch@xxxxxxxxxxxxxxx
Reviewed-by: Jason Gunthorpe <jgg@xxxxxxxxxx>
Signed-off-by: Uros Bizjak <ubizjak@xxxxxxxxx>
Signed-off-by: Suravee Suthikulpanit <suravee.suthikulpanit@xxxxxxx>
---
include/linux/compiler_types.h | 13 +++++++++++++
1 file changed, 13 insertions(+)

diff --git a/include/linux/compiler_types.h b/include/linux/compiler_types.h
index 1a957ea2f4fe..394e0e60bb27 100644
--- a/include/linux/compiler_types.h
+++ b/include/linux/compiler_types.h
@@ -469,6 +469,7 @@ struct ftrace_likely_data {
unsigned type: (unsigned type)0, \
signed type: (signed type)0

+#if defined(CONFIG_ARCH_SUPPORTS_INT128) && defined(__SIZEOF_INT128__)
#define __unqual_scalar_typeof(x) typeof( \
_Generic((x), \
char: (char)0, \
@@ -477,7 +478,19 @@ struct ftrace_likely_data {
__scalar_type_to_expr_cases(int), \
__scalar_type_to_expr_cases(long), \
__scalar_type_to_expr_cases(long long), \
+ __scalar_type_to_expr_cases(__int128), \
default: (x)))
+#else
+#define __unqual_scalar_typeof(x) typeof( \
+ _Generic((x), \
+ char: (char)0, \
+ __scalar_type_to_expr_cases(char), \
+ __scalar_type_to_expr_cases(short), \
+ __scalar_type_to_expr_cases(int), \
+ __scalar_type_to_expr_cases(long), \
+ __scalar_type_to_expr_cases(long long), \
+ default: (x)))
+#endif

/* Is this type a native word size -- useful for atomic operations */
#define __native_word(t) \
--
2.34.1