Re: [PATCH] Fix get_order() [try #2]

From: H. Peter Anvin
Date: Tue Mar 06 2007 - 13:43:11 EST


David Howells wrote:
/**
+ * ilog2_up - rounded up log of 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
+ * - the result is rounded up
+ * - the result is undefined when n < 1
+ *
+ * selects the appropriately-sized optimised version depending on sizeof(n)
+ */
+#define ilog2_up(n) ((n) == 1 ? 0 : ilog2((n) - 1) + 1)
+

Why not just make it ((n) < 1 ? 0 : ...) and make it well-defined for
n == 0?

+/**
* roundup_pow_of_two - round the given value up to nearest power of two
* @n - parameter
*
@@ -159,8 +175,8 @@ unsigned long __roundup_pow_of_two(unsigned long n)
#define roundup_pow_of_two(n) \
( \
__builtin_constant_p(n) ? ( \
- (n == 1) ? 0 : \
- (1UL << (ilog2((n) - 1) + 1)) \
+ (n == 1) ? 1 : \
+ (1UL << ilog2_up(n)) \
) : \

... then this can be just "1UL << ilog2_up(n)".

[Sorry about previous email. I got confused about what roundup_pow_of_two() actually does.]

-hpa
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/