1 #ifndef __ASM_GENERIC_GETORDER_H 2 #define __ASM_GENERIC_GETORDER_H 3 4 #ifndef __ASSEMBLY__ 5 6 #include <linux/compiler.h> 7 #include <linux/log2.h> 8 9 /* 10 * Runtime evaluation of get_order() 11 */ 12 static inline __attribute_const__ __get_order(unsigned long size)13int __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 } 26 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 */ 49 #define get_order(n) \ 50 ( \ 51 __builtin_constant_p(n) ? ( \ 52 ((n) == 0UL) ? BITS_PER_LONG - PAGE_SHIFT : \ 53 (((n) < (1UL << PAGE_SHIFT)) ? 0 : \ 54 ilog2((n) - 1) - PAGE_SHIFT + 1) \ 55 ) : \ 56 __get_order(n) \ 57 ) 58 59 #endif /* __ASSEMBLY__ */ 60 61 #endif /* __ASM_GENERIC_GETORDER_H */ 62