From: Steve Langasek Date: Wed, 8 Feb 2006 06:24:17 +0000 (+0100) Subject: [PATCH] __cmpxchg() must really always be inlined X-Git-Tag: v2.6.15.4~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c93e834ed994db3290c88391af4c2eea5e3f5f1e;p=thirdparty%2Fkernel%2Fstable.git [PATCH] __cmpxchg() must really always be inlined With the latest 2.6.15 kernel builds for alpha on Debian, we ran into a problem with undefined references to __cmpxchg_called_with_bad_pointer() in a couple of kernel modules (xfs.ko and drm.ko; see http://bugs.debian.org/347556). It looks like people have been trying to out-clever each other wrt the definition of "inline" on this architecture :), with the result that __cmpxchg(), which must be inlined so the compiler can see its argument is const, is not guaranteed to be inlined. Indeed, it was not being inlined when building with -Os. The attached patch fixes the issue by adding an __attribute__((always_inline)) explicitly to the definition of __cmpxchg() instead of relying on redefines of "inline" elsewhere to make this happen. Cc: Richard Henderson Cc: Ivan Kokshaysky Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds Signed-off-by: Chris Wright Signed-off-by: Greg Kroah-Hartman --- diff --git a/include/asm-alpha/system.h b/include/asm-alpha/system.h index 050e86d12891e..1f75e4de5db36 100644 --- a/include/asm-alpha/system.h +++ b/include/asm-alpha/system.h @@ -562,7 +562,7 @@ __cmpxchg_u64(volatile long *m, unsigned long old, unsigned long new) if something tries to do an invalid cmpxchg(). */ extern void __cmpxchg_called_with_bad_pointer(void); -static inline unsigned long +static __always_inline unsigned long __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) { switch (size) {