diff options
Diffstat (limited to 'mm/page_alloc.c')
| -rw-r--r-- | mm/page_alloc.c | 64 | 
1 files changed, 9 insertions, 55 deletions
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 4ba5e37127fc..df2022ff0c8a 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -221,11 +221,6 @@ EXPORT_SYMBOL(nr_online_nodes);  int page_group_by_mobility_disabled __read_mostly; -/* - * NOTE: - * Don't use set_pageblock_migratetype(page, MIGRATE_ISOLATE) directly. - * Instead, use {un}set_pageblock_isolate. - */  void set_pageblock_migratetype(struct page *page, int migratetype)  { @@ -1389,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; @@ -1404,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) { @@ -1413,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 */ @@ -1421,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) { @@ -1436,7 +1420,7 @@ int capture_free_page(struct page *page, int alloc_order, int migratetype)  		}  	} -	return 1UL << alloc_order; +	return 1UL << order;  }  /* @@ -1454,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; @@ -1655,20 +1638,6 @@ static bool __zone_watermark_ok(struct zone *z, int order, unsigned long mark,  	return true;  } -#ifdef CONFIG_MEMORY_ISOLATION -static inline unsigned long nr_zone_isolate_freepages(struct zone *zone) -{ -	if (unlikely(zone->nr_pageblock_isolate)) -		return zone->nr_pageblock_isolate * pageblock_nr_pages; -	return 0; -} -#else -static inline unsigned long nr_zone_isolate_freepages(struct zone *zone) -{ -	return 0; -} -#endif -  bool zone_watermark_ok(struct zone *z, int order, unsigned long mark,  		      int classzone_idx, int alloc_flags)  { @@ -1684,14 +1653,6 @@ bool zone_watermark_ok_safe(struct zone *z, int order, unsigned long mark,  	if (z->percpu_drift_mark && free_pages < z->percpu_drift_mark)  		free_pages = zone_page_state_snapshot(z, NR_FREE_PAGES); -	/* -	 * If the zone has MIGRATE_ISOLATE type free pages, we should consider -	 * it.  nr_zone_isolate_freepages is never accurate so kswapd might not -	 * sleep although it could do so.  But this is more desirable for memory -	 * hotplug than sleeping which can cause a livelock in the direct -	 * reclaim path. -	 */ -	free_pages -= nr_zone_isolate_freepages(z);  	return __zone_watermark_ok(z, order, mark, classzone_idx, alloc_flags,  								free_pages);  } @@ -2163,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; @@ -2176,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(); @@ -2195,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; @@ -5631,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 */  }  |