diff options
author | David Howells <dhowells@redhat.com> | 2006-12-08 05:37:51 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.osdl.org> | 2006-12-08 11:28:51 -0500 |
commit | 312a0c170945b49f319960afd2e492c05f9dd551 (patch) | |
tree | f3c122cc65d18bc647b45d89b3a8d0fb8492422b /include | |
parent | f0d1b0b30d250a07627ad8b9fbbb5c7cc08422e8 (diff) |
[PATCH] LOG2: Alter roundup_pow_of_two() so that it can use a ilog2() on a constant
Alter roundup_pow_of_two() so that it can make use of ilog2() on a constant to
produce a constant value, retaining the ability for an arch to override it in
the non-const case.
This permits the function to be used to initialise variables.
Signed-off-by: David Howells <dhowells@redhat.com>
Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Cc: Paul Mackerras <paulus@samba.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/kernel.h | 6 | ||||
-rw-r--r-- | include/linux/log2.h | 26 |
2 files changed, 26 insertions, 6 deletions
diff --git a/include/linux/kernel.h b/include/linux/kernel.h index 3710cce16642..e8bfac34d2ba 100644 --- a/include/linux/kernel.h +++ b/include/linux/kernel.h | |||
@@ -158,12 +158,6 @@ static inline int printk(const char *s, ...) { return 0; } | |||
158 | 158 | ||
159 | unsigned long int_sqrt(unsigned long); | 159 | unsigned long int_sqrt(unsigned long); |
160 | 160 | ||
161 | static inline unsigned long | ||
162 | __attribute_const__ roundup_pow_of_two(unsigned long x) | ||
163 | { | ||
164 | return 1UL << fls_long(x - 1); | ||
165 | } | ||
166 | |||
167 | extern int printk_ratelimit(void); | 161 | extern int printk_ratelimit(void); |
168 | extern int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst); | 162 | extern int __printk_ratelimit(int ratelimit_jiffies, int ratelimit_burst); |
169 | extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, | 163 | extern bool printk_timed_ratelimit(unsigned long *caller_jiffies, |
diff --git a/include/linux/log2.h b/include/linux/log2.h index 3979c60325ff..d02e1a547a7e 100644 --- a/include/linux/log2.h +++ b/include/linux/log2.h | |||
@@ -43,6 +43,15 @@ int __ilog2_u64(u64 n) | |||
43 | } | 43 | } |
44 | #endif | 44 | #endif |
45 | 45 | ||
46 | /* | ||
47 | * round up to nearest power of two | ||
48 | */ | ||
49 | static inline __attribute__((const)) | ||
50 | unsigned long __roundup_pow_of_two(unsigned long n) | ||
51 | { | ||
52 | return 1UL << fls_long(n - 1); | ||
53 | } | ||
54 | |||
46 | /** | 55 | /** |
47 | * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value | 56 | * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value |
48 | * @n - parameter | 57 | * @n - parameter |
@@ -128,4 +137,21 @@ int __ilog2_u64(u64 n) | |||
128 | __ilog2_u64(n) \ | 137 | __ilog2_u64(n) \ |
129 | ) | 138 | ) |
130 | 139 | ||
140 | /** | ||
141 | * roundup_pow_of_two - round the given value up to nearest power of two | ||
142 | * @n - parameter | ||
143 | * | ||
144 | * round the given balue up to the nearest power of two | ||
145 | * - the result is undefined when n == 0 | ||
146 | * - this can be used to initialise global variables from constant data | ||
147 | */ | ||
148 | #define roundup_pow_of_two(n) \ | ||
149 | ( \ | ||
150 | __builtin_constant_p(n) ? ( \ | ||
151 | (n == 1) ? 0 : \ | ||
152 | (1UL << (ilog2((n) - 1) + 1)) \ | ||
153 | ) : \ | ||
154 | __roundup_pow_of_two(n) \ | ||
155 | ) | ||
156 | |||
131 | #endif /* _LINUX_LOG2_H */ | 157 | #endif /* _LINUX_LOG2_H */ |