public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] count defined zones to size ZONE_SHIFT
@ 2006-09-20 13:54 Andy Whitcroft
  0 siblings, 0 replies; only message in thread
From: Andy Whitcroft @ 2006-09-20 13:54 UTC (permalink / raw)
  To: Andrew Morton; +Cc: linux-kernel

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@shadowen.org>
---
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 */

^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2006-09-20 13:55 UTC | newest]

Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-09-20 13:54 [PATCH] count defined zones to size ZONE_SHIFT Andy Whitcroft

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox