diff options
Diffstat (limited to 'include/linux/log2.h')
| -rw-r--r-- | include/linux/log2.h | 35 | 
1 files changed, 24 insertions, 11 deletions
diff --git a/include/linux/log2.h b/include/linux/log2.h index 41a1ae010993..2af7f77866d0 100644 --- a/include/linux/log2.h +++ b/include/linux/log2.h @@ -72,16 +72,13 @@ unsigned long __rounddown_pow_of_two(unsigned long n)  }  /** - * ilog2 - log base 2 of 32-bit or a 64-bit unsigned value + * const_ilog2 - log base 2 of 32-bit or a 64-bit constant unsigned value   * @n: parameter   * - * constant-capable log of base 2 calculation - * - this can be used to initialise global variables from constant data, hence - * the massive ternary operator construction - * - * selects the appropriately-sized optimised version depending on sizeof(n) + * Use this where sparse expects a true constant expression, e.g. for array + * indices.   */ -#define ilog2(n)				\ +#define const_ilog2(n)				\  (						\  	__builtin_constant_p(n) ? (		\  		(n) < 2 ? 0 :			\ @@ -147,10 +144,26 @@ unsigned long __rounddown_pow_of_two(unsigned long n)  		(n) & (1ULL <<  4) ?  4 :	\  		(n) & (1ULL <<  3) ?  3 :	\  		(n) & (1ULL <<  2) ?  2 :	\ -		1 ) :				\ -	(sizeof(n) <= 4) ?			\ -	__ilog2_u32(n) :			\ -	__ilog2_u64(n)				\ +		1) :				\ +	-1) + +/** + * ilog2 - log base 2 of 32-bit or a 64-bit unsigned value + * @n: parameter + * + * constant-capable log of base 2 calculation + * - this can be used to initialise global variables from constant data, hence + * the massive ternary operator construction + * + * selects the appropriately-sized optimised version depending on sizeof(n) + */ +#define ilog2(n) \ +( \ +	__builtin_constant_p(n) ?	\ +	const_ilog2(n) :		\ +	(sizeof(n) <= 4) ?		\ +	__ilog2_u32(n) :		\ +	__ilog2_u64(n)			\   )  /**  |