[PATCH] count defined zones to size ZONE_SHIFT

From: Andy Whitcroft
Date: Wed Sep 20 2006 - 09:55:34 EST


With the recent changes allowing ZONE_DMA etc to all be optional,
the ZONE_SHIFT calculation is very hard to follow. Playing with
the compiler, it seems that the following is portable and IMO
much easier to read and understand.

-apw

=== 8< ===
count defined zones to size ZONE_SHIFT

Simplify calculation of the number of bits we need for ZONES_SHIFT
by adding up the definitions of the defined zones. We make use of
the property of defined(X) that its value is one when X is defined
and zero otherwise. From the GCC manuals:

"defined name and defined (name) are both expressions whose
value is 1 if name is defined as a macro at the current point
in the program, and 0 otherwise."

Signed-off-by: Andy Whitcroft <apw@xxxxxxxxxxxx>
---
diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h
index b7836c5..9e339da 100644
--- a/include/linux/mmzone.h
+++ b/include/linux/mmzone.h
@@ -149,15 +149,27 @@ #endif
* match the requested limits. See gfp_zone() in include/linux/gfp.h
*/

-#if !defined(CONFIG_ZONE_DMA32) && !defined(CONFIG_HIGHMEM)
-#if !defined(CONFIG_ZONE_DMA)
+/*
+ * Count the active zones. Note that the use of defined(X) outside
+ * #if and family is not necessarily defined so ensure we cannot use
+ * it later. Use __ZONE_COUNT to work out how many shift bits we need.
+ */
+#define __ZONE_COUNT ( \
+ defined(CONFIG_ZONE_DMA) \
+ + defined(CONFIG_ZONE_DMA32) \
+ + 1 \
+ + defined(CONFIG_HIGHMEM) \
+)
+#if __ZONE_COUNT < 2
#define ZONES_SHIFT 0
-#else
+#elif __ZONE_COUNT <= 2
#define ZONES_SHIFT 1
-#endif
-#else
+#elif __ZONE_COUNT <= 4
#define ZONES_SHIFT 2
+#else
+#error ZONES_SHIFT -- too many zones configured adjust calculation
#endif
+#undef __ZONE_COUNT

struct zone {
/* Fields commonly accessed by the page allocator */
-
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/