diff options
Diffstat (limited to 'include/linux/bitops.h')
| -rw-r--r-- | include/linux/bitops.h | 50 | 
1 files changed, 50 insertions, 0 deletions
diff --git a/include/linux/bitops.h b/include/linux/bitops.h index 26bf15e6cd35..5e62e2383b7f 100644 --- a/include/linux/bitops.h +++ b/include/linux/bitops.h @@ -4,6 +4,7 @@  #include <asm/types.h>  #include <linux/bits.h> +#include <linux/typecheck.h>  #include <uapi/linux/kernel.h> @@ -253,6 +254,55 @@ static __always_inline void __assign_bit(long nr, volatile unsigned long *addr,  		__clear_bit(nr, addr);  } +/** + * __ptr_set_bit - Set bit in a pointer's value + * @nr: the bit to set + * @addr: the address of the pointer variable + * + * Example: + *	void *p = foo(); + *	__ptr_set_bit(bit, &p); + */ +#define __ptr_set_bit(nr, addr)                         \ +	({                                              \ +		typecheck_pointer(*(addr));             \ +		__set_bit(nr, (unsigned long *)(addr)); \ +	}) + +/** + * __ptr_clear_bit - Clear bit in a pointer's value + * @nr: the bit to clear + * @addr: the address of the pointer variable + * + * Example: + *	void *p = foo(); + *	__ptr_clear_bit(bit, &p); + */ +#define __ptr_clear_bit(nr, addr)                         \ +	({                                                \ +		typecheck_pointer(*(addr));               \ +		__clear_bit(nr, (unsigned long *)(addr)); \ +	}) + +/** + * __ptr_test_bit - Test bit in a pointer's value + * @nr: the bit to test + * @addr: the address of the pointer variable + * + * Example: + *	void *p = foo(); + *	if (__ptr_test_bit(bit, &p)) { + *	        ... + *	} else { + *		... + *	} + */ +#define __ptr_test_bit(nr, addr)                       \ +	({                                             \ +		typecheck_pointer(*(addr));            \ +		test_bit(nr, (unsigned long *)(addr)); \ +	}) +  #ifdef __KERNEL__  #ifndef set_mask_bits  |