| Arnd Bergmann | 5b17e1c | 2009-05-13 22:56:30 +0000 | [diff] [blame] | 1 | #ifndef __ASM_GENERIC_GETORDER_H | 
|  | 2 | #define __ASM_GENERIC_GETORDER_H | 
|  | 3 |  | 
|  | 4 | #ifndef __ASSEMBLY__ | 
|  | 5 |  | 
|  | 6 | #include <linux/compiler.h> | 
| David Howells | d66acc3 | 2012-02-20 22:39:29 +0000 | [diff] [blame] | 7 | #include <linux/log2.h> | 
|  | 8 |  | 
|  | 9 | /* | 
|  | 10 | * Runtime evaluation of get_order() | 
|  | 11 | */ | 
|  | 12 | static inline __attribute_const__ | 
|  | 13 | int __get_order(unsigned long size) | 
|  | 14 | { | 
|  | 15 | int order; | 
|  | 16 |  | 
|  | 17 | size--; | 
|  | 18 | size >>= PAGE_SHIFT; | 
|  | 19 | #if BITS_PER_LONG == 32 | 
|  | 20 | order = fls(size); | 
|  | 21 | #else | 
|  | 22 | order = fls64(size); | 
|  | 23 | #endif | 
|  | 24 | return order; | 
|  | 25 | } | 
| Arnd Bergmann | 5b17e1c | 2009-05-13 22:56:30 +0000 | [diff] [blame] | 26 |  | 
| David Howells | e0891a9 | 2012-02-20 22:39:18 +0000 | [diff] [blame] | 27 | /** | 
|  | 28 | * get_order - Determine the allocation order of a memory size | 
|  | 29 | * @size: The size for which to get the order | 
|  | 30 | * | 
|  | 31 | * Determine the allocation order of a particular sized block of memory.  This | 
|  | 32 | * is on a logarithmic scale, where: | 
|  | 33 | * | 
|  | 34 | *	0 -> 2^0 * PAGE_SIZE and below | 
|  | 35 | *	1 -> 2^1 * PAGE_SIZE to 2^0 * PAGE_SIZE + 1 | 
|  | 36 | *	2 -> 2^2 * PAGE_SIZE to 2^1 * PAGE_SIZE + 1 | 
|  | 37 | *	3 -> 2^3 * PAGE_SIZE to 2^2 * PAGE_SIZE + 1 | 
|  | 38 | *	4 -> 2^4 * PAGE_SIZE to 2^3 * PAGE_SIZE + 1 | 
|  | 39 | *	... | 
|  | 40 | * | 
|  | 41 | * The order returned is used to find the smallest allocation granule required | 
|  | 42 | * to hold an object of the specified size. | 
|  | 43 | * | 
|  | 44 | * The result is undefined if the size is 0. | 
|  | 45 | * | 
|  | 46 | * This function may be used to initialise variables with compile time | 
|  | 47 | * evaluations of constants. | 
|  | 48 | */ | 
| David Howells | d66acc3 | 2012-02-20 22:39:29 +0000 | [diff] [blame] | 49 | #define get_order(n)						\ | 
|  | 50 | (								\ | 
|  | 51 | __builtin_constant_p(n) ? (				\ | 
| Joerg Roedel | b893485 | 2012-02-24 13:58:15 +0100 | [diff] [blame] | 52 | ((n) == 0UL) ? BITS_PER_LONG - PAGE_SHIFT :	\ | 
|  | 53 | (((n) < (1UL << PAGE_SHIFT)) ? 0 :		\ | 
| David Howells | d66acc3 | 2012-02-20 22:39:29 +0000 | [diff] [blame] | 54 | ilog2((n) - 1) - PAGE_SHIFT + 1)		\ | 
|  | 55 | ) :							\ | 
|  | 56 | __get_order(n)						\ | 
|  | 57 | ) | 
| Arnd Bergmann | 5b17e1c | 2009-05-13 22:56:30 +0000 | [diff] [blame] | 58 |  | 
|  | 59 | #endif	/* __ASSEMBLY__ */ | 
|  | 60 |  | 
|  | 61 | #endif	/* __ASM_GENERIC_GETORDER_H */ |