diff options
| author | Olof Johansson <olof@lixom.net> | 2013-02-04 22:56:41 -0800 | 
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2013-02-04 22:56:41 -0800 | 
| commit | 469da62096e23adc755c1268b00b5fc7a214151b (patch) | |
| tree | fefd055fdae584e38d551f44d1339eb22cee4ed9 /mm/page_alloc.c | |
| parent | 4227961650884a06757f80877d5dce0bddc723d4 (diff) | |
| parent | 88b62b915b0b7e25870eb0604ed9a92ba4bfc9f7 (diff) | |
| download | olio-linux-3.10-469da62096e23adc755c1268b00b5fc7a214151b.tar.xz olio-linux-3.10-469da62096e23adc755c1268b00b5fc7a214151b.zip  | |
Merge tag 'v3.8-rc6' into next/soc
Linux 3.8-rc6
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 37 | 
1 files changed, 9 insertions, 28 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index bc6cc0e913b..df2022ff0c8 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -1384,14 +1384,8 @@ void split_page(struct page *page, unsigned int order)  		set_page_refcounted(page + i);  } -/* - * Similar to the split_page family of functions except that the page - * required at the given order and being isolated now to prevent races - * with parallel allocators - */ -int capture_free_page(struct page *page, int alloc_order, int migratetype) +static int __isolate_free_page(struct page *page, unsigned int order)  { -	unsigned int order;  	unsigned long watermark;  	struct zone *zone;  	int mt; @@ -1399,7 +1393,6 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)  	BUG_ON(!PageBuddy(page));  	zone = page_zone(page); -	order = page_order(page);  	mt = get_pageblock_migratetype(page);  	if (mt != MIGRATE_ISOLATE) { @@ -1408,7 +1401,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)  		if (!zone_watermark_ok(zone, 0, watermark, 0, 0))  			return 0; -		__mod_zone_freepage_state(zone, -(1UL << alloc_order), mt); +		__mod_zone_freepage_state(zone, -(1UL << order), mt);  	}  	/* Remove page from free list */ @@ -1416,11 +1409,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)  	zone->free_area[order].nr_free--;  	rmv_page_order(page); -	if (alloc_order != order) -		expand(zone, page, alloc_order, order, -			&zone->free_area[order], migratetype); - -	/* Set the pageblock if the captured page is at least a pageblock */ +	/* Set the pageblock if the isolated page is at least a pageblock */  	if (order >= pageblock_order - 1) {  		struct page *endpage = page + (1 << order) - 1;  		for (; page < endpage; page += pageblock_nr_pages) { @@ -1431,7 +1420,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)  		}  	} -	return 1UL << alloc_order; +	return 1UL << order;  }  /* @@ -1449,10 +1438,9 @@ int split_free_page(struct page *page)  	unsigned int order;  	int nr_pages; -	BUG_ON(!PageBuddy(page));  	order = page_order(page); -	nr_pages = capture_free_page(page, order, 0); +	nr_pages = __isolate_free_page(page, order);  	if (!nr_pages)  		return 0; @@ -2136,8 +2124,6 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,  	bool *contended_compaction, bool *deferred_compaction,  	unsigned long *did_some_progress)  { -	struct page *page = NULL; -  	if (!order)  		return NULL; @@ -2149,16 +2135,12 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,  	current->flags |= PF_MEMALLOC;  	*did_some_progress = try_to_compact_pages(zonelist, order, gfp_mask,  						nodemask, sync_migration, -						contended_compaction, &page); +						contended_compaction);  	current->flags &= ~PF_MEMALLOC; -	/* If compaction captured a page, prep and use it */ -	if (page) { -		prep_new_page(page, order, gfp_mask); -		goto got_page; -	} -  	if (*did_some_progress != COMPACT_SKIPPED) { +		struct page *page; +  		/* Page migration frees to the PCP lists but we want merging */  		drain_pages(get_cpu());  		put_cpu(); @@ -2168,7 +2150,6 @@ __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,  				alloc_flags & ~ALLOC_NO_WATERMARKS,  				preferred_zone, migratetype);  		if (page) { -got_page:  			preferred_zone->compact_blockskip_flush = false;  			preferred_zone->compact_considered = 0;  			preferred_zone->compact_defer_shift = 0; @@ -5604,7 +5585,7 @@ static inline int pfn_to_bitidx(struct zone *zone, unsigned long pfn)  	pfn &= (PAGES_PER_SECTION-1);  	return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS;  #else -	pfn = pfn - zone->zone_start_pfn; +	pfn = pfn - round_down(zone->zone_start_pfn, pageblock_nr_pages);  	return (pfn >> pageblock_order) * NR_PAGEBLOCK_BITS;  #endif /* CONFIG_SPARSEMEM */  }  |