Message ID | 20190910115643.391995-1-arnd@arndb.de |
---|---|
State | Accepted |
Commit | 920fdab7b3ce98c14c840261e364f490f3679a62 |
Headers | show |
Series | [v2] arm64: fix unreachable code issue with cmpxchg | expand |
On Tue, Sep 10, 2019 at 01:56:22PM +0200, Arnd Bergmann wrote: > On arm64 build with clang, sometimes the __cmpxchg_mb is not inlined > when CONFIG_OPTIMIZE_INLINING is set. > Clang then fails a compile-time assertion, because it cannot tell at > compile time what the size of the argument is: > > mm/memcontrol.o: In function `__cmpxchg_mb': > memcontrol.c:(.text+0x1a4c): undefined reference to `__compiletime_assert_175' > memcontrol.c:(.text+0x1a4c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `__compiletime_assert_175' > > Mark all of the cmpxchg() style functions as __always_inline to > ensure that the compiler can see the result. > > Acked-by: Nick Desaulniers <ndesaulniers@google.com> > Reported-by: Nathan Chancellor <natechancellor@gmail.com> > Link: https://github.com/ClangBuiltLinux/linux/issues/648 > Reviewed-by: Nathan Chancellor <natechancellor@gmail.com> > Tested-by: Nathan Chancellor <natechancellor@gmail.com> > Reviewed-by: Andrew Murray <andrew.murray@arm.com> > Tested-by: Andrew Murray <andrew.murray@arm.com> > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > --- > v2: skip unneeded changes, as suggested by Andrew Murray > --- > arch/arm64/include/asm/cmpxchg.h | 6 +++--- > 1 file changed, 3 insertions(+), 3 deletions(-) > > diff --git a/arch/arm64/include/asm/cmpxchg.h b/arch/arm64/include/asm/cmpxchg.h > index a1398f2f9994..f9bef42c1411 100644 > --- a/arch/arm64/include/asm/cmpxchg.h > +++ b/arch/arm64/include/asm/cmpxchg.h > @@ -62,7 +62,7 @@ __XCHG_CASE( , , mb_, 64, dmb ish, nop, , a, l, "memory") > #undef __XCHG_CASE > > #define __XCHG_GEN(sfx) \ > -static inline unsigned long __xchg##sfx(unsigned long x, \ > +static __always_inline unsigned long __xchg##sfx(unsigned long x, \ > volatile void *ptr, \ > int size) \ > { \ > @@ -148,7 +148,7 @@ __CMPXCHG_DBL(_mb) > #undef __CMPXCHG_DBL > > #define __CMPXCHG_GEN(sfx) \ > -static inline unsigned long __cmpxchg##sfx(volatile void *ptr, \ > +static __always_inline unsigned long __cmpxchg##sfx(volatile void *ptr, \ > unsigned long old, \ > unsigned long new, \ > int size) \ > @@ -255,7 +255,7 @@ __CMPWAIT_CASE( , , 64); > #undef __CMPWAIT_CASE > > #define __CMPWAIT_GEN(sfx) \ > -static inline void __cmpwait##sfx(volatile void *ptr, \ > +static __always_inline void __cmpwait##sfx(volatile void *ptr, \ > unsigned long val, \ > int size) \ > { \ > -- > 2.20.0 > Looks like the arm64 pull request happened without this patch so clang all{mod,yes}config builds are broken. Did the maintainers have any further comments on it or could this make it in with the next one? Cheers, Nathan
On Tue, Sep 17, 2019 at 01:34:25PM -0700, Nathan Chancellor wrote: > On Tue, Sep 10, 2019 at 01:56:22PM +0200, Arnd Bergmann wrote: > > On arm64 build with clang, sometimes the __cmpxchg_mb is not inlined > > when CONFIG_OPTIMIZE_INLINING is set. > > Clang then fails a compile-time assertion, because it cannot tell at > > compile time what the size of the argument is: > > > > mm/memcontrol.o: In function `__cmpxchg_mb': > > memcontrol.c:(.text+0x1a4c): undefined reference to `__compiletime_assert_175' > > memcontrol.c:(.text+0x1a4c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `__compiletime_assert_175' > > > > Mark all of the cmpxchg() style functions as __always_inline to > > ensure that the compiler can see the result. > > > > Acked-by: Nick Desaulniers <ndesaulniers@google.com> > > Reported-by: Nathan Chancellor <natechancellor@gmail.com> > > Link: https://github.com/ClangBuiltLinux/linux/issues/648 > > Reviewed-by: Nathan Chancellor <natechancellor@gmail.com> > > Tested-by: Nathan Chancellor <natechancellor@gmail.com> > > Reviewed-by: Andrew Murray <andrew.murray@arm.com> > > Tested-by: Andrew Murray <andrew.murray@arm.com> > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > > --- > > v2: skip unneeded changes, as suggested by Andrew Murray > > --- > > arch/arm64/include/asm/cmpxchg.h | 6 +++--- > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > diff --git a/arch/arm64/include/asm/cmpxchg.h b/arch/arm64/include/asm/cmpxchg.h > > index a1398f2f9994..f9bef42c1411 100644 > > --- a/arch/arm64/include/asm/cmpxchg.h > > +++ b/arch/arm64/include/asm/cmpxchg.h > > @@ -62,7 +62,7 @@ __XCHG_CASE( , , mb_, 64, dmb ish, nop, , a, l, "memory") > > #undef __XCHG_CASE > > > > #define __XCHG_GEN(sfx) \ > > -static inline unsigned long __xchg##sfx(unsigned long x, \ > > +static __always_inline unsigned long __xchg##sfx(unsigned long x, \ > > volatile void *ptr, \ > > int size) \ > > { \ > > @@ -148,7 +148,7 @@ __CMPXCHG_DBL(_mb) > > #undef __CMPXCHG_DBL > > > > #define __CMPXCHG_GEN(sfx) \ > > -static inline unsigned long __cmpxchg##sfx(volatile void *ptr, \ > > +static __always_inline unsigned long __cmpxchg##sfx(volatile void *ptr, \ > > unsigned long old, \ > > unsigned long new, \ > > int size) \ > > @@ -255,7 +255,7 @@ __CMPWAIT_CASE( , , 64); > > #undef __CMPWAIT_CASE > > > > #define __CMPWAIT_GEN(sfx) \ > > -static inline void __cmpwait##sfx(volatile void *ptr, \ > > +static __always_inline void __cmpwait##sfx(volatile void *ptr, \ > > unsigned long val, \ > > int size) \ > > { \ > > -- > > 2.20.0 > > > > Looks like the arm64 pull request happened without this patch so clang > all{mod,yes}config builds are broken. Did the maintainers have any > further comments on it or could this make it in with the next one? Fear not! I plan to send this with some other fixes we've got for -rc1. I just to get my CI scripts going again (new machine), but that shouldn't take long. Will
On Wed, Sep 18, 2019 at 10:02:41AM +0100, Will Deacon wrote: > On Tue, Sep 17, 2019 at 01:34:25PM -0700, Nathan Chancellor wrote: > > On Tue, Sep 10, 2019 at 01:56:22PM +0200, Arnd Bergmann wrote: > > > On arm64 build with clang, sometimes the __cmpxchg_mb is not inlined > > > when CONFIG_OPTIMIZE_INLINING is set. > > > Clang then fails a compile-time assertion, because it cannot tell at > > > compile time what the size of the argument is: > > > > > > mm/memcontrol.o: In function `__cmpxchg_mb': > > > memcontrol.c:(.text+0x1a4c): undefined reference to `__compiletime_assert_175' > > > memcontrol.c:(.text+0x1a4c): relocation truncated to fit: R_AARCH64_CALL26 against undefined symbol `__compiletime_assert_175' > > > > > > Mark all of the cmpxchg() style functions as __always_inline to > > > ensure that the compiler can see the result. > > > > > > Acked-by: Nick Desaulniers <ndesaulniers@google.com> > > > Reported-by: Nathan Chancellor <natechancellor@gmail.com> > > > Link: https://github.com/ClangBuiltLinux/linux/issues/648 > > > Reviewed-by: Nathan Chancellor <natechancellor@gmail.com> > > > Tested-by: Nathan Chancellor <natechancellor@gmail.com> > > > Reviewed-by: Andrew Murray <andrew.murray@arm.com> > > > Tested-by: Andrew Murray <andrew.murray@arm.com> > > > Signed-off-by: Arnd Bergmann <arnd@arndb.de> > > > --- > > > v2: skip unneeded changes, as suggested by Andrew Murray > > > --- > > > arch/arm64/include/asm/cmpxchg.h | 6 +++--- > > > 1 file changed, 3 insertions(+), 3 deletions(-) > > > > > > diff --git a/arch/arm64/include/asm/cmpxchg.h b/arch/arm64/include/asm/cmpxchg.h > > > index a1398f2f9994..f9bef42c1411 100644 > > > --- a/arch/arm64/include/asm/cmpxchg.h > > > +++ b/arch/arm64/include/asm/cmpxchg.h > > > @@ -62,7 +62,7 @@ __XCHG_CASE( , , mb_, 64, dmb ish, nop, , a, l, "memory") > > > #undef __XCHG_CASE > > > > > > #define __XCHG_GEN(sfx) \ > > > -static inline unsigned long __xchg##sfx(unsigned long x, \ > > > +static __always_inline unsigned long __xchg##sfx(unsigned long x, \ > > > volatile void *ptr, \ > > > int size) \ > > > { \ > > > @@ -148,7 +148,7 @@ __CMPXCHG_DBL(_mb) > > > #undef __CMPXCHG_DBL > > > > > > #define __CMPXCHG_GEN(sfx) \ > > > -static inline unsigned long __cmpxchg##sfx(volatile void *ptr, \ > > > +static __always_inline unsigned long __cmpxchg##sfx(volatile void *ptr, \ > > > unsigned long old, \ > > > unsigned long new, \ > > > int size) \ > > > @@ -255,7 +255,7 @@ __CMPWAIT_CASE( , , 64); > > > #undef __CMPWAIT_CASE > > > > > > #define __CMPWAIT_GEN(sfx) \ > > > -static inline void __cmpwait##sfx(volatile void *ptr, \ > > > +static __always_inline void __cmpwait##sfx(volatile void *ptr, \ > > > unsigned long val, \ > > > int size) \ > > > { \ > > > -- > > > 2.20.0 > > > > > > > Looks like the arm64 pull request happened without this patch so clang > > all{mod,yes}config builds are broken. Did the maintainers have any > > further comments on it or could this make it in with the next one? > > Fear not! I plan to send this with some other fixes we've got for -rc1. > I just to get my CI scripts going again (new machine), but that shouldn't > take long. > > Will Great, thank you! Cheers, Nathan
diff --git a/arch/arm64/include/asm/cmpxchg.h b/arch/arm64/include/asm/cmpxchg.h index a1398f2f9994..f9bef42c1411 100644 --- a/arch/arm64/include/asm/cmpxchg.h +++ b/arch/arm64/include/asm/cmpxchg.h @@ -62,7 +62,7 @@ __XCHG_CASE( , , mb_, 64, dmb ish, nop, , a, l, "memory") #undef __XCHG_CASE #define __XCHG_GEN(sfx) \ -static inline unsigned long __xchg##sfx(unsigned long x, \ +static __always_inline unsigned long __xchg##sfx(unsigned long x, \ volatile void *ptr, \ int size) \ { \ @@ -148,7 +148,7 @@ __CMPXCHG_DBL(_mb) #undef __CMPXCHG_DBL #define __CMPXCHG_GEN(sfx) \ -static inline unsigned long __cmpxchg##sfx(volatile void *ptr, \ +static __always_inline unsigned long __cmpxchg##sfx(volatile void *ptr, \ unsigned long old, \ unsigned long new, \ int size) \ @@ -255,7 +255,7 @@ __CMPWAIT_CASE( , , 64); #undef __CMPWAIT_CASE #define __CMPWAIT_GEN(sfx) \ -static inline void __cmpwait##sfx(volatile void *ptr, \ +static __always_inline void __cmpwait##sfx(volatile void *ptr, \ unsigned long val, \ int size) \ { \