Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5270 | serge | 1 | #ifndef __ASM_GENERIC_GETORDER_H |
2 | #define __ASM_GENERIC_GETORDER_H |
||
3 | |||
4 | #ifndef __ASSEMBLY__ |
||
5 | |||
6 | #include |
||
7 | #include |
||
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 | } |
||
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 */><>> |