diff options
Diffstat (limited to 'tools/testing/radix-tree/linux/bitops.h')
| -rw-r--r-- | tools/testing/radix-tree/linux/bitops.h | 40 | 
1 files changed, 25 insertions, 15 deletions
diff --git a/tools/testing/radix-tree/linux/bitops.h b/tools/testing/radix-tree/linux/bitops.h index 71d58427ab60..a13e9bc76eec 100644 --- a/tools/testing/radix-tree/linux/bitops.h +++ b/tools/testing/radix-tree/linux/bitops.h @@ -2,9 +2,14 @@  #define _ASM_GENERIC_BITOPS_NON_ATOMIC_H_  #include <linux/types.h> +#include <linux/bitops/find.h> +#include <linux/bitops/hweight.h> +#include <linux/kernel.h> -#define BITOP_MASK(nr)		(1UL << ((nr) % BITS_PER_LONG)) -#define BITOP_WORD(nr)		((nr) / BITS_PER_LONG) +#define BIT_MASK(nr)		(1UL << ((nr) % BITS_PER_LONG)) +#define BIT_WORD(nr)		((nr) / BITS_PER_LONG) +#define BITS_PER_BYTE		8 +#define BITS_TO_LONGS(nr)	DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long))  /**   * __set_bit - Set a bit in memory @@ -17,16 +22,16 @@   */  static inline void __set_bit(int nr, volatile unsigned long *addr)  { -	unsigned long mask = BITOP_MASK(nr); -	unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);  	*p  |= mask;  }  static inline void __clear_bit(int nr, volatile unsigned long *addr)  { -	unsigned long mask = BITOP_MASK(nr); -	unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);  	*p &= ~mask;  } @@ -42,8 +47,8 @@ static inline void __clear_bit(int nr, volatile unsigned long *addr)   */  static inline void __change_bit(int nr, volatile unsigned long *addr)  { -	unsigned long mask = BITOP_MASK(nr); -	unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);  	*p ^= mask;  } @@ -59,8 +64,8 @@ static inline void __change_bit(int nr, volatile unsigned long *addr)   */  static inline int __test_and_set_bit(int nr, volatile unsigned long *addr)  { -	unsigned long mask = BITOP_MASK(nr); -	unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);  	unsigned long old = *p;  	*p = old | mask; @@ -78,8 +83,8 @@ static inline int __test_and_set_bit(int nr, volatile unsigned long *addr)   */  static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr)  { -	unsigned long mask = BITOP_MASK(nr); -	unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);  	unsigned long old = *p;  	*p = old & ~mask; @@ -90,8 +95,8 @@ static inline int __test_and_clear_bit(int nr, volatile unsigned long *addr)  static inline int __test_and_change_bit(int nr,  					    volatile unsigned long *addr)  { -	unsigned long mask = BITOP_MASK(nr); -	unsigned long *p = ((unsigned long *)addr) + BITOP_WORD(nr); +	unsigned long mask = BIT_MASK(nr); +	unsigned long *p = ((unsigned long *)addr) + BIT_WORD(nr);  	unsigned long old = *p;  	*p = old ^ mask; @@ -105,7 +110,7 @@ static inline int __test_and_change_bit(int nr,   */  static inline int test_bit(int nr, const volatile unsigned long *addr)  { -	return 1UL & (addr[BITOP_WORD(nr)] >> (nr & (BITS_PER_LONG-1))); +	return 1UL & (addr[BIT_WORD(nr)] >> (nr & (BITS_PER_LONG-1)));  }  /** @@ -147,4 +152,9 @@ unsigned long find_next_bit(const unsigned long *addr,  			    unsigned long size,  			    unsigned long offset); +static inline unsigned long hweight_long(unsigned long w) +{ +	return sizeof(w) == 4 ? hweight32(w) : hweight64(w); +} +  #endif /* _ASM_GENERIC_BITOPS_NON_ATOMIC_H_ */  |