From: Andy Whitcroft 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 Cc: Christoph Lameter Signed-off-by: Andrew Morton --- include/linux/mmzone.h | 22 +++++++++++++++++----- 1 files changed, 17 insertions(+), 5 deletions(-) diff -puN include/linux/mmzone.h~optional-zone_dma-in-the-vm-tidy include/linux/mmzone.h --- a/include/linux/mmzone.h~optional-zone_dma-in-the-vm-tidy +++ a/include/linux/mmzone.h @@ -149,15 +149,27 @@ enum zone_type { * 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 */ _