diff options
| author | Ingo Molnar <mingo@elte.hu> | 2009-08-29 09:30:41 +0200 | 
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-08-29 09:31:47 +0200 | 
| commit | eebc57f73d42095b778e899f6aa90ad050c72655 (patch) | |
| tree | 2ba80c75e9284093e6d7606dbb1b6a4bb752a2a5 /mm/page_alloc.c | |
| parent | d3a247bfb2c26f5b67367d58af7ad8c2efbbc6c1 (diff) | |
| parent | 2a4ab640d3c28c2952967e5f63ea495555bf2a5f (diff) | |
Merge branch 'for-ingo' of git://git.kernel.org/pub/scm/linux/kernel/git/lenb/linux-sfi-2.6 into x86/apic
Merge reason: the SFI (Simple Firmware Interface) feature in the ACPI
              tree needs this cleanup, pull it into the APIC branch as
	      well so that there's no interactions.
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 25 | 
1 files changed, 19 insertions, 6 deletions
| diff --git a/mm/page_alloc.c b/mm/page_alloc.c index caa92689aac9..5cc986eb9f6f 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -882,7 +882,7 @@ retry_reserve:   */  static int rmqueue_bulk(struct zone *zone, unsigned int order,   			unsigned long count, struct list_head *list, -			int migratetype) +			int migratetype, int cold)  {  	int i; @@ -901,7 +901,10 @@ static int rmqueue_bulk(struct zone *zone, unsigned int order,  		 * merge IO requests if the physical pages are ordered  		 * properly.  		 */ -		list_add(&page->lru, list); +		if (likely(cold == 0)) +			list_add(&page->lru, list); +		else +			list_add_tail(&page->lru, list);  		set_page_private(page, migratetype);  		list = &page->lru;  	} @@ -1119,7 +1122,8 @@ again:  		local_irq_save(flags);  		if (!pcp->count) {  			pcp->count = rmqueue_bulk(zone, 0, -					pcp->batch, &pcp->list, migratetype); +					pcp->batch, &pcp->list, +					migratetype, cold);  			if (unlikely(!pcp->count))  				goto failed;  		} @@ -1138,7 +1142,8 @@ again:  		/* Allocate more to the pcp list if necessary */  		if (unlikely(&page->lru == &pcp->list)) {  			pcp->count += rmqueue_bulk(zone, 0, -					pcp->batch, &pcp->list, migratetype); +					pcp->batch, &pcp->list, +					migratetype, cold);  			page = list_entry(pcp->list.next, struct page, lru);  		} @@ -1740,8 +1745,10 @@ __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,  	 * be using allocators in order of preference for an area that is  	 * too large.  	 */ -	if (WARN_ON_ONCE(order >= MAX_ORDER)) +	if (order >= MAX_ORDER) { +		WARN_ON_ONCE(!(gfp_mask & __GFP_NOWARN));  		return NULL; +	}  	/*  	 * GFP_THISNODE (meaning __GFP_THISNODE, __GFP_NORETRY and @@ -1789,6 +1796,10 @@ rebalance:  	if (p->flags & PF_MEMALLOC)  		goto nopage; +	/* Avoid allocations with no watermarks from looping endlessly */ +	if (test_thread_flag(TIF_MEMDIE) && !(gfp_mask & __GFP_NOFAIL)) +		goto nopage; +  	/* Try direct reclaim and then allocating */  	page = __alloc_pages_direct_reclaim(gfp_mask, order,  					zonelist, high_zoneidx, @@ -2533,7 +2544,6 @@ static void build_zonelists(pg_data_t *pgdat)  	prev_node = local_node;  	nodes_clear(used_mask); -	memset(node_load, 0, sizeof(node_load));  	memset(node_order, 0, sizeof(node_order));  	j = 0; @@ -2642,6 +2652,9 @@ static int __build_all_zonelists(void *dummy)  {  	int nid; +#ifdef CONFIG_NUMA +	memset(node_load, 0, sizeof(node_load)); +#endif  	for_each_online_node(nid) {  		pg_data_t *pgdat = NODE_DATA(nid); | 
