diff options
Diffstat (limited to 'arch/x86/include/asm/bitops.h')
| -rw-r--r-- | arch/x86/include/asm/bitops.h | 14 | 
1 files changed, 10 insertions, 4 deletions
| diff --git a/arch/x86/include/asm/bitops.h b/arch/x86/include/asm/bitops.h index 9fa9dcdf344b..02b47a603fc8 100644 --- a/arch/x86/include/asm/bitops.h +++ b/arch/x86/include/asm/bitops.h @@ -3,6 +3,9 @@  /*   * Copyright 1992, Linus Torvalds. + * + * Note: inlines with more than a single statement should be marked + * __always_inline to avoid problems with older gcc's inlining heuristics.   */  #ifndef _LINUX_BITOPS_H @@ -53,7 +56,8 @@   * Note that @nr may be almost arbitrarily large; this function is not   * restricted to acting on a single-word quantity.   */ -static inline void set_bit(unsigned int nr, volatile unsigned long *addr) +static __always_inline void +set_bit(unsigned int nr, volatile unsigned long *addr)  {  	if (IS_IMMEDIATE(nr)) {  		asm volatile(LOCK_PREFIX "orb %1,%0" @@ -90,7 +94,8 @@ static inline void __set_bit(int nr, volatile unsigned long *addr)   * you should call smp_mb__before_clear_bit() and/or smp_mb__after_clear_bit()   * in order to ensure changes are visible on other processors.   */ -static inline void clear_bit(int nr, volatile unsigned long *addr) +static __always_inline void +clear_bit(int nr, volatile unsigned long *addr)  {  	if (IS_IMMEDIATE(nr)) {  		asm volatile(LOCK_PREFIX "andb %1,%0" @@ -204,7 +209,8 @@ static inline int test_and_set_bit(int nr, volatile unsigned long *addr)   *   * This is the same as test_and_set_bit on x86.   */ -static inline int test_and_set_bit_lock(int nr, volatile unsigned long *addr) +static __always_inline int +test_and_set_bit_lock(int nr, volatile unsigned long *addr)  {  	return test_and_set_bit(nr, addr);  } @@ -300,7 +306,7 @@ static inline int test_and_change_bit(int nr, volatile unsigned long *addr)  	return oldbit;  } -static inline int constant_test_bit(int nr, const volatile unsigned long *addr) +static __always_inline int constant_test_bit(unsigned int nr, const volatile unsigned long *addr)  {  	return ((1UL << (nr % BITS_PER_LONG)) &  		(((unsigned long *)addr)[nr / BITS_PER_LONG])) != 0; | 
