Single Zone Optimizations

If we only have a single zone then various macros can be optimized.

We do not need to protect higher zones, we know that zones are
always present, can remove useless data from /proc etc etc.

Signed-off-by: Christoph Lameter <clameter@sgi.com>

Index: linux-2.6.18-mm2/mm/vmstat.c
===================================================================
--- linux-2.6.18-mm2.orig/mm/vmstat.c	2006-09-28 15:29:48.000000000 -0500
+++ linux-2.6.18-mm2/mm/vmstat.c	2006-09-28 16:47:53.208512202 -0500
@@ -554,7 +554,7 @@ static int zoneinfo_show(struct seq_file
 		for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++)
 			seq_printf(m, "\n    %-12s %lu", vmstat_text[i],
 					zone_page_state(zone, i));
-
+#ifdef MULTI_ZONE
 		seq_printf(m,
 			   "\n        protection: (%lu",
 			   zone->lowmem_reserve[0]);
@@ -563,6 +563,7 @@ static int zoneinfo_show(struct seq_file
 		seq_printf(m,
 			   ")"
 			   "\n  pagesets");
+#endif
 		for_each_online_cpu(i) {
 			struct per_cpu_pageset *pageset;
 			int j;
Index: linux-2.6.18-mm2/mm/page_alloc.c
===================================================================
--- linux-2.6.18-mm2.orig/mm/page_alloc.c	2006-09-28 15:29:48.000000000 -0500
+++ linux-2.6.18-mm2/mm/page_alloc.c	2006-09-28 16:47:53.225115171 -0500
@@ -59,6 +59,7 @@ int percpu_pagelist_fraction;
 
 static void __free_pages_ok(struct page *page, unsigned int order);
 
+#ifdef MULTI_ZONE
 /*
  * results with 256, 32 in the lowmem_reserve sysctl:
  *	1G machine -> (16M dma, 800M-16M normal, 1G-800M high)
@@ -81,6 +82,7 @@ int sysctl_lowmem_reserve_ratio[MAX_NR_Z
 	 32
 #endif
 };
+#endif
 
 EXPORT_SYMBOL(totalram_pages);
 
@@ -920,8 +922,11 @@ int zone_watermark_ok(struct zone *z, in
 		min -= min / 2;
 	if (alloc_flags & ALLOC_HARDER)
 		min -= min / 4;
-
+#ifdef SINGLE_ZONE
+	if (free_pages <= min)
+#else
 	if (free_pages <= min + z->lowmem_reserve[classzone_idx])
+#endif
 		return 0;
 	for (o = 0; o < order; o++) {
 		/* At the next order, this order's pages become unavailable */
@@ -1462,10 +1467,12 @@ void show_free_areas(void)
 			zone->pages_scanned,
 			(zone->all_unreclaimable ? "yes" : "no")
 			);
+#ifdef MULTI_ZONE
 		printk("lowmem_reserve[]:");
 		for (i = 0; i < MAX_NR_ZONES; i++)
 			printk(" %lu", zone->lowmem_reserve[i]);
 		printk("\n");
+#endif
 	}
 
 	for_each_zone(zone) {
@@ -2863,12 +2870,13 @@ static void calculate_totalreserve_pages
 			struct zone *zone = pgdat->node_zones + i;
 			unsigned long max = 0;
 
+#ifdef MULTI_ZONE
 			/* Find valid and maximum lowmem_reserve in the zone */
 			for (j = i; j < MAX_NR_ZONES; j++) {
 				if (zone->lowmem_reserve[j] > max)
 					max = zone->lowmem_reserve[j];
 			}
-
+#endif
 			/* we treat pages_high as reserved pages. */
 			max += zone->pages_high;
 
@@ -2888,6 +2896,7 @@ static void calculate_totalreserve_pages
  */
 static void setup_per_zone_lowmem_reserve(void)
 {
+#ifdef MULTI_ZONE
 	struct pglist_data *pgdat;
 	enum zone_type j, idx;
 
@@ -2917,6 +2926,7 @@ static void setup_per_zone_lowmem_reserv
 
 	/* update totalreserve_pages */
 	calculate_totalreserve_pages();
+#endif
 }
 
 /*
@@ -3066,6 +3076,7 @@ int sysctl_min_slab_ratio_sysctl_handler
 }
 #endif
 
+#ifdef MULTI_ZONE
 /*
  * lowmem_reserve_ratio_sysctl_handler - just a wrapper around
  *	proc_dointvec() so that we can call setup_per_zone_lowmem_reserve()
@@ -3082,6 +3093,7 @@ int lowmem_reserve_ratio_sysctl_handler(
 	setup_per_zone_lowmem_reserve();
 	return 0;
 }
+#endif
 
 /*
  * percpu_pagelist_fraction - changes the pcp->high for each zone on each
Index: linux-2.6.18-mm2/kernel/sysctl.c
===================================================================
--- linux-2.6.18-mm2.orig/kernel/sysctl.c	2006-09-28 15:29:47.000000000 -0500
+++ linux-2.6.18-mm2/kernel/sysctl.c	2006-09-28 16:47:53.245624720 -0500
@@ -900,6 +900,7 @@ static ctl_table vm_table[] = {
 		.proc_handler	= &proc_dointvec,
 	 },
 #endif
+#ifdef MULTI_ZONE
 	{
 		.ctl_name	= VM_LOWMEM_RESERVE_RATIO,
 		.procname	= "lowmem_reserve_ratio",
@@ -909,6 +910,7 @@ static ctl_table vm_table[] = {
 		.proc_handler	= &lowmem_reserve_ratio_sysctl_handler,
 		.strategy	= &sysctl_intvec,
 	},
+#endif
 	{
 		.ctl_name	= VM_DROP_PAGECACHE,
 		.procname	= "drop_caches",
Index: linux-2.6.18-mm2/include/linux/mmzone.h
===================================================================
--- linux-2.6.18-mm2.orig/include/linux/mmzone.h	2006-09-28 15:29:43.000000000 -0500
+++ linux-2.6.18-mm2/include/linux/mmzone.h	2006-09-28 16:48:29.628588690 -0500
@@ -162,6 +162,7 @@ enum zone_type {
 )
 #if __ZONE_COUNT < 2
 #define ZONES_SHIFT 0
+#define SINGLE_ZONE
 #elif __ZONE_COUNT <= 2
 #define ZONES_SHIFT 1
 #elif __ZONE_COUNT <= 4
@@ -171,10 +172,15 @@ enum zone_type {
 #endif
 #undef __ZONE_COUNT
 
+#ifndef SINGLE_ZONE
+#define MULTI_ZONE
+#endif
+
 struct zone {
 	/* Fields commonly accessed by the page allocator */
 	unsigned long		free_pages;
 	unsigned long		pages_min, pages_low, pages_high;
+#ifdef MULTI_ZONE
 	/*
 	 * We don't know if the memory that we're going to allocate will be freeable
 	 * or/and it will be released eventually, so to avoid totally wasting several
@@ -184,6 +190,7 @@ struct zone {
 	 * sysctl_lowmem_reserve_ratio sysctl changes.
 	 */
 	unsigned long		lowmem_reserve[MAX_NR_ZONES];
+#endif
 
 #ifdef CONFIG_NUMA
 	int node;
@@ -420,11 +427,19 @@ unsigned long __init node_memmap_size_by
 /*
  * zone_idx() returns 0 for the ZONE_DMA zone, 1 for the ZONE_NORMAL zone, etc.
  */
+#ifdef MULTI_ZONE
 #define zone_idx(zone)		((zone) - (zone)->zone_pgdat->node_zones)
+#else
+#define zone_idx(zone)		ZONE_NORMAL
+#endif
 
 static inline int populated_zone(struct zone *zone)
 {
+#ifdef MULTI_ZONE
 	return (!!zone->present_pages);
+#else
+	return 1;
+#endif
 }
 
 static inline int is_highmem_idx(enum zone_type idx)
@@ -438,7 +453,11 @@ static inline int is_highmem_idx(enum zo
 
 static inline int is_normal_idx(enum zone_type idx)
 {
+#ifdef MULTI_ZONE
 	return (idx == ZONE_NORMAL);
+#else
+	return 1;
+#endif
 }
 
 /**
@@ -458,7 +477,11 @@ static inline int is_highmem(struct zone
 
 static inline int is_normal(struct zone *zone)
 {
+#ifdef MULTI_ZONE
 	return zone == zone->zone_pgdat->node_zones + ZONE_NORMAL;
+#else
+	return 1;
+#endif
 }
 
 static inline int is_dma32(struct zone *zone)
@@ -484,9 +507,11 @@ struct ctl_table;
 struct file;
 int min_free_kbytes_sysctl_handler(struct ctl_table *, int, struct file *, 
 					void __user *, size_t *, loff_t *);
+#ifdef MULTI_ZONE
 extern int sysctl_lowmem_reserve_ratio[MAX_NR_ZONES-1];
 int lowmem_reserve_ratio_sysctl_handler(struct ctl_table *, int, struct file *,
 					void __user *, size_t *, loff_t *);
+#endif
 int percpu_pagelist_fraction_sysctl_handler(struct ctl_table *, int, struct file *,
 					void __user *, size_t *, loff_t *);
 int sysctl_min_unmapped_ratio_sysctl_handler(struct ctl_table *, int,