Index: linux-2.6.17-mm6/mm/vmstat.c =================================================================== --- linux-2.6.17-mm6.orig/mm/vmstat.c 2006-07-07 16:51:50.428110300 -0700 +++ linux-2.6.17-mm6/mm/vmstat.c 2006-07-10 10:44:34.732585901 -0700 @@ -268,6 +268,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.17-mm6/mm/page_alloc.c =================================================================== --- linux-2.6.17-mm6.orig/mm/page_alloc.c 2006-07-10 10:21:32.507743432 -0700 +++ linux-2.6.17-mm6/mm/page_alloc.c 2006-07-10 10:43:55.527007303 -0700 @@ -668,6 +668,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; @@ -694,6 +697,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; @@ -1931,6 +1937,11 @@ static int __cpuinit process_zones(int c for_each_zone(zone) { + if (!populated(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)) @@ -2475,6 +2486,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;