diff options
Diffstat (limited to 'arch/x86/include/asm/percpu.h')
| -rw-r--r-- | arch/x86/include/asm/percpu.h | 29 | 
1 files changed, 28 insertions, 1 deletions
diff --git a/arch/x86/include/asm/percpu.h b/arch/x86/include/asm/percpu.h index d475b4398d8..53278b0dfdf 100644 --- a/arch/x86/include/asm/percpu.h +++ b/arch/x86/include/asm/percpu.h @@ -517,7 +517,7 @@ do {									\  	typeof(o2) __o2 = o2;						\  	typeof(o2) __n2 = n2;						\  	typeof(o2) __dummy;						\ -	alternative_io("call this_cpu_cmpxchg16b_emu\n\t" P6_NOP4,	\ +	alternative_io("call this_cpu_cmpxchg16b_emu\n\t" ASM_NOP4,	\  		       "cmpxchg16b " __percpu_prefix "(%%rsi)\n\tsetz %0\n\t",	\  		       X86_FEATURE_CX16,				\  		       ASM_OUTPUT2("=a"(__ret), "=d"(__dummy)),		\ @@ -542,6 +542,33 @@ do {									\  	old__;								\  }) +static __always_inline int x86_this_cpu_constant_test_bit(unsigned int nr, +                        const unsigned long __percpu *addr) +{ +	unsigned long __percpu *a = (unsigned long *)addr + nr / BITS_PER_LONG; + +	return ((1UL << (nr % BITS_PER_LONG)) & percpu_read(*a)) != 0; +} + +static inline int x86_this_cpu_variable_test_bit(int nr, +                        const unsigned long __percpu *addr) +{ +	int oldbit; + +	asm volatile("bt "__percpu_arg(2)",%1\n\t" +			"sbb %0,%0" +			: "=r" (oldbit) +			: "m" (*(unsigned long *)addr), "Ir" (nr)); + +	return oldbit; +} + +#define x86_this_cpu_test_bit(nr, addr)			\ +	(__builtin_constant_p((nr))			\ +	 ? x86_this_cpu_constant_test_bit((nr), (addr))	\ +	 : x86_this_cpu_variable_test_bit((nr), (addr))) + +  #include <asm-generic/percpu.h>  /* We can use this directly for local CPU (faster). */  |