[PATCH] count defined zones to size ZONE_SHIFT

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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 <[email protected]>
---
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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

[Index of Archives]     [Kernel Newbies]     [Netfilter]     [Bugtraq]     [Photo]     [Stuff]     [Gimp]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Video 4 Linux]     [Linux for the blind]     [Linux Resources]
  Powered by Linux