diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 18 | 
1 files changed, 11 insertions, 7 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 9f1f3125630a..779c4af4f8e8 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -17,6 +17,7 @@  #include <linux/pagemap.h>  #include <linux/bootmem.h>  #include <linux/slab.h> +#include <linux/compiler.h>  int nr_swap_pages;  int nr_active_pages; @@ -253,7 +254,7 @@ static struct page * balance_classzone(zone_t * classzone, unsigned int gfp_mask  		local_pages = ¤t->local_pages; -		if (__freed) { +		if (likely(__freed)) {  			/* pick from the last inserted so we're lifo */  			entry = local_pages->next;  			do { @@ -372,19 +373,21 @@ struct page * __alloc_pages(unsigned int gfp_mask, unsigned int order, zonelist_  		return page;  	zone = zonelist->zones; -	if (__builtin_expect(freed, 1)) { +	if (likely(freed)) {  		for (;;) {  			zone_t *z = *(zone++);  			if (!z)  				break; -			if (zone_free_pages(z, order) > (gfp_mask & __GFP_HIGH ? z->pages_min / 2 : z->pages_min)) { -				page = rmqueue(z, order); -				if (page) -					return page; -			} +			page = rmqueue(z, order); +			if (page) +				return page;  		}  	} else { +		/*  +		 * Check that no other task is been killed meanwhile, +		 * in such a case we can succeed the allocation. +		 */  		for (;;) {  			zone_t *z = *(zone++);  			if (!z) @@ -683,6 +686,7 @@ void __init free_area_init_core(int nid, pg_data_t *pgdat, struct page **gmap,  		zone->lock = SPIN_LOCK_UNLOCKED;  		zone->zone_pgdat = pgdat;  		zone->free_pages = 0; +		zone->need_balance = 0;  		if (!size)  			continue;  | 
