Index: linux-2.6.18-rc1-mm1/mm/vmstat.c =================================================================== --- linux-2.6.18-rc1-mm1.orig/mm/vmstat.c 2006-07-10 10:33:44.369581118 -0700 +++ linux-2.6.18-rc1-mm1/mm/vmstat.c 2006-07-10 10:46:04.156737703 -0700 @@ -269,6 +269,8 @@ void refresh_cpu_vm_stats(int cpu) struct per_cpu_pageset *pcp; pcp = zone_pcp(zone, cpu); + if (!pcp) + continue; for (i = 0; i < NR_VM_ZONE_STAT_ITEMS; i++) if (pcp->vm_stat_diff[i]) { Index: linux-2.6.18-rc1-mm1/mm/page_alloc.c =================================================================== --- linux-2.6.18-rc1-mm1.orig/mm/page_alloc.c 2006-07-10 10:33:44.352004083 -0700 +++ linux-2.6.18-rc1-mm1/mm/page_alloc.c 2006-07-10 10:47:40.420309927 -0700 @@ -660,6 +660,9 @@ void drain_node_pages(int nodeid) struct per_cpu_pageset *pset; pset = zone_pcp(zone, smp_processor_id()); + if (!pset) + continue; + for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) { struct per_cpu_pages *pcp; @@ -686,6 +689,9 @@ static void __drain_pages(unsigned int c struct per_cpu_pageset *pset; pset = zone_pcp(zone, cpu); + if (!pset) + continue; + for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) { struct per_cpu_pages *pcp; @@ -1909,6 +1915,11 @@ static int __cpuinit process_zones(int c for_each_zone(zone) { + if (!populated_zone(zone)) { + zone_pcp(zone, cpu) = NULL; + continue; + } + zone_pcp(zone, cpu) = kmalloc_node(sizeof(struct per_cpu_pageset), GFP_KERNEL, cpu_to_node(cpu)); if (!zone_pcp(zone, cpu)) @@ -2448,6 +2459,9 @@ int percpu_pagelist_fraction_sysctl_hand if (!write || (ret == -EINVAL)) return ret; for_each_zone(zone) { + if (!populated_zone(zone)) + continue; + for_each_online_cpu(cpu) { unsigned long high; high = zone->present_pages / percpu_pagelist_fraction;