By exposing this variable as a config option, conditional compilation in Rust code may rely on it to determine whether it should use a volatile read or call a C helper function to perform a READ_ONCE operation. This config option is also added on alpha for consistency, even if Rust does not support alpha right now. Signed-off-by: Alice Ryhl --- arch/Kconfig | 11 +++++++++++ arch/alpha/Kconfig | 1 + arch/alpha/include/asm/rwonce.h | 4 ++-- arch/arm64/Kconfig | 1 + arch/arm64/include/asm/rwonce.h | 4 ++-- 5 files changed, 17 insertions(+), 4 deletions(-) diff --git a/arch/Kconfig b/arch/Kconfig index 31220f512b16d5cfbc259935c2d3675b60c1e25c..683176bb09e50e31f398bb92678283e5de66b282 100644 --- a/arch/Kconfig +++ b/arch/Kconfig @@ -229,6 +229,17 @@ config HAVE_EFFICIENT_UNALIGNED_ACCESS See Documentation/core-api/unaligned-memory-access.rst for more information on the topic of unaligned memory accesses. +config ARCH_USE_CUSTOM_READ_ONCE + bool + help + Some architectures reorder address-dependent volatile loads, + which means that the default implementation of READ_ONCE that + relies on a volatile load is not appropriate. + + This symbol should be selected by an architecture if it + redefines READ_ONCE to use a different implementation than a + volatile load. + config ARCH_USE_BUILTIN_BSWAP bool help diff --git a/arch/alpha/Kconfig b/arch/alpha/Kconfig index 80367f2cf821ceb4fc29485b7b21b37d5c310765..1d5d48153ba0087554221e9412a6af0c672d3f5c 100644 --- a/arch/alpha/Kconfig +++ b/arch/alpha/Kconfig @@ -11,6 +11,7 @@ config ALPHA select ARCH_NO_PREEMPT select ARCH_NO_SG_CHAIN select ARCH_USE_CMPXCHG_LOCKREF + select ARCH_USE_CUSTOM_READ_ONCE if SMP select FORCE_PCI select PCI_DOMAINS if PCI select PCI_SYSCALL if PCI diff --git a/arch/alpha/include/asm/rwonce.h b/arch/alpha/include/asm/rwonce.h index 35542bcf92b3a883df353784bcb2d243475ccd91..c9f21aa0764625b24e8957923926d09a2eb97e7c 100644 --- a/arch/alpha/include/asm/rwonce.h +++ b/arch/alpha/include/asm/rwonce.h @@ -5,7 +5,7 @@ #ifndef __ASM_RWONCE_H #define __ASM_RWONCE_H -#ifdef CONFIG_SMP +#ifdef CONFIG_ARCH_USE_CUSTOM_READ_ONCE #include @@ -28,7 +28,7 @@ (typeof(x))__x; \ }) -#endif /* CONFIG_SMP */ +#endif /* CONFIG_ARCH_USE_CUSTOM_READ_ONCE */ #include diff --git a/arch/arm64/Kconfig b/arch/arm64/Kconfig index 93173f0a09c7deb07b46ab4f16a1a0e4320dfbf1..cd16053c8302479458a05c23ba9cfb73ee50232c 100644 --- a/arch/arm64/Kconfig +++ b/arch/arm64/Kconfig @@ -89,6 +89,7 @@ config ARM64 select ARCH_KEEP_MEMBLOCK select ARCH_MHP_MEMMAP_ON_MEMORY_ENABLE select ARCH_USE_CMPXCHG_LOCKREF + select ARCH_USE_CUSTOM_READ_ONCE if LTO select ARCH_USE_GNU_PROPERTY select ARCH_USE_MEMTEST select ARCH_USE_QUEUED_RWLOCKS diff --git a/arch/arm64/include/asm/rwonce.h b/arch/arm64/include/asm/rwonce.h index 78beceec10cda47b319db29d9f79d2a5df35e92d..5da6b2d6a12399a520f7a3310014de723baa278a 100644 --- a/arch/arm64/include/asm/rwonce.h +++ b/arch/arm64/include/asm/rwonce.h @@ -5,7 +5,7 @@ #ifndef __ASM_RWONCE_H #define __ASM_RWONCE_H -#if defined(CONFIG_LTO) && !defined(__ASSEMBLER__) +#if defined(CONFIG_ARCH_USE_CUSTOM_READ_ONCE) && !defined(__ASSEMBLER__) #include #include @@ -62,7 +62,7 @@ }) #endif /* !BUILD_VDSO */ -#endif /* CONFIG_LTO && !__ASSEMBLER__ */ +#endif /* CONFIG_ARCH_USE_CUSTOM_READ_ONCE && !__ASSEMBLER__ */ #include -- 2.52.0.351.gbe84eed79e-goog