Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

x86: Simplify __HAVE_ARCH_CMPXCHG tests

Both the 32-bit and 64-bit cmpxchg.h header define __HAVE_ARCH_CMPXCHG
and there's ifdeffery which checks it. But since both bitness define it,
we can just as well move it up to the main cmpxchg header and simpify a
bit of code in doing that.

Signed-off-by: Borislav Petkov <bp@suse.de>
Link: http://lkml.kernel.org/r/20140711104338.GB17083@pd.tnic
Signed-off-by: H. Peter Anvin <hpa@linux.intel.com>

authored by

Borislav Petkov and committed by
H. Peter Anvin
b08ee5f7 89171579

+5 -25
+2 -2
arch/x86/include/asm/cmpxchg.h
··· 4 4 #include <linux/compiler.h> 5 5 #include <asm/alternative.h> /* Provides LOCK_PREFIX */ 6 6 7 + #define __HAVE_ARCH_CMPXCHG 1 8 + 7 9 /* 8 10 * Non-existant functions to indicate usage errors at link time 9 11 * (or compile-time if the compiler implements __compiletime_error(). ··· 145 143 # include <asm/cmpxchg_64.h> 146 144 #endif 147 145 148 - #ifdef __HAVE_ARCH_CMPXCHG 149 146 #define cmpxchg(ptr, old, new) \ 150 147 __cmpxchg(ptr, old, new, sizeof(*(ptr))) 151 148 ··· 153 152 154 153 #define cmpxchg_local(ptr, old, new) \ 155 154 __cmpxchg_local(ptr, old, new, sizeof(*(ptr))) 156 - #endif 157 155 158 156 /* 159 157 * xadd() adds "inc" to "*ptr" and atomically returns the previous
-2
arch/x86/include/asm/cmpxchg_32.h
··· 34 34 : "memory"); 35 35 } 36 36 37 - #define __HAVE_ARCH_CMPXCHG 1 38 - 39 37 #ifdef CONFIG_X86_CMPXCHG64 40 38 #define cmpxchg64(ptr, o, n) \ 41 39 ((__typeof__(*(ptr)))__cmpxchg64((ptr), (unsigned long long)(o), \
-2
arch/x86/include/asm/cmpxchg_64.h
··· 6 6 *ptr = val; 7 7 } 8 8 9 - #define __HAVE_ARCH_CMPXCHG 1 10 - 11 9 #define cmpxchg64(ptr, o, n) \ 12 10 ({ \ 13 11 BUILD_BUG_ON(sizeof(*(ptr)) != 8); \
+1 -1
arch/x86/include/asm/mc146818rtc.h
··· 13 13 #define RTC_ALWAYS_BCD 1 /* RTC operates in binary mode */ 14 14 #endif 15 15 16 - #if defined(CONFIG_X86_32) && defined(__HAVE_ARCH_CMPXCHG) 16 + #if defined(CONFIG_X86_32) 17 17 /* 18 18 * This lock provides nmi access to the CMOS/RTC registers. It has some 19 19 * special properties. It is owned by a CPU and stores the index register
+2 -14
arch/x86/include/asm/mutex_32.h
··· 100 100 static inline int __mutex_fastpath_trylock(atomic_t *count, 101 101 int (*fail_fn)(atomic_t *)) 102 102 { 103 - /* 104 - * We have two variants here. The cmpxchg based one is the best one 105 - * because it never induce a false contention state. It is included 106 - * here because architectures using the inc/dec algorithms over the 107 - * xchg ones are much more likely to support cmpxchg natively. 108 - * 109 - * If not we fall back to the spinlock based variant - that is 110 - * just as efficient (and simpler) as a 'destructive' probing of 111 - * the mutex state would be. 112 - */ 113 - #ifdef __HAVE_ARCH_CMPXCHG 103 + /* cmpxchg because it never induces a false contention state. */ 114 104 if (likely(atomic_cmpxchg(count, 1, 0) == 1)) 115 105 return 1; 106 + 116 107 return 0; 117 - #else 118 - return fail_fn(count); 119 - #endif 120 108 } 121 109 122 110 #endif /* _ASM_X86_MUTEX_32_H */
-4
arch/x86/kernel/acpi/boot.c
··· 74 74 static u64 acpi_lapic_addr __initdata = APIC_DEFAULT_PHYS_BASE; 75 75 #endif 76 76 77 - #ifndef __HAVE_ARCH_CMPXCHG 78 - #warning ACPI uses CMPXCHG, i486 and later hardware 79 - #endif 80 - 81 77 /* -------------------------------------------------------------------------- 82 78 Boot-time Configuration 83 79 -------------------------------------------------------------------------- */