diff options
| author | Paul Mackerras <paulus@samba.org> | 2007-05-10 21:08:37 +1000 | 
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2007-05-10 21:08:37 +1000 | 
| commit | 2ecf042ef530dd0943e41d84b6344f507941af3e (patch) | |
| tree | 73100361dd74e3f80f14c7c81ba4675948983f44 /mm/page_alloc.c | |
| parent | 32a56ebb24f23da1bbaf24292acf85b6c04526ab (diff) | |
| parent | de5603748af8bf7deac403e6ba92887f8d18e812 (diff) | |
Merge branch 'linux-2.6'
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 50 | 
1 files changed, 18 insertions, 32 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 6fd0b7455b0..f9b5d6d5f4d 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -691,43 +691,26 @@ static void __init setup_nr_node_ids(void) {}  #ifdef CONFIG_NUMA  /* - * Called from the slab reaper to drain pagesets on a particular node that - * belongs to the currently executing processor. + * Called from the vmstat counter updater to drain pagesets of this + * currently executing processor on remote nodes after they have + * expired. + *   * Note that this function must be called with the thread pinned to   * a single processor.   */ -void drain_node_pages(int nodeid) +void drain_zone_pages(struct zone *zone, struct per_cpu_pages *pcp)  { -	int i; -	enum zone_type z;  	unsigned long flags; +	int to_drain; -	for (z = 0; z < MAX_NR_ZONES; z++) { -		struct zone *zone = NODE_DATA(nodeid)->node_zones + z; -		struct per_cpu_pageset *pset; - -		if (!populated_zone(zone)) -			continue; - -		pset = zone_pcp(zone, smp_processor_id()); -		for (i = 0; i < ARRAY_SIZE(pset->pcp); i++) { -			struct per_cpu_pages *pcp; - -			pcp = &pset->pcp[i]; -			if (pcp->count) { -				int to_drain; - -				local_irq_save(flags); -				if (pcp->count >= pcp->batch) -					to_drain = pcp->batch; -				else -					to_drain = pcp->count; -				free_pages_bulk(zone, to_drain, &pcp->list, 0); -				pcp->count -= to_drain; -				local_irq_restore(flags); -			} -		} -	} +	local_irq_save(flags); +	if (pcp->count >= pcp->batch) +		to_drain = pcp->batch; +	else +		to_drain = pcp->count; +	free_pages_bulk(zone, to_drain, &pcp->list, 0); +	pcp->count -= to_drain; +	local_irq_restore(flags);  }  #endif @@ -2148,11 +2131,14 @@ static int __cpuinit pageset_cpuup_callback(struct notifier_block *nfb,  	switch (action) {  	case CPU_UP_PREPARE: +	case CPU_UP_PREPARE_FROZEN:  		if (process_zones(cpu))  			ret = NOTIFY_BAD;  		break;  	case CPU_UP_CANCELED: +	case CPU_UP_CANCELED_FROZEN:  	case CPU_DEAD: +	case CPU_DEAD_FROZEN:  		free_zone_pagesets(cpu);  		break;  	default: @@ -3012,7 +2998,7 @@ static int page_alloc_cpu_notify(struct notifier_block *self,  {  	int cpu = (unsigned long)hcpu; -	if (action == CPU_DEAD) { +	if (action == CPU_DEAD || action == CPU_DEAD_FROZEN) {  		local_irq_disable();  		__drain_pages(cpu);  		vm_events_fold_cpu(cpu);  | 
