diff options
Diffstat (limited to 'mm/page_isolation.c')
| -rw-r--r-- | mm/page_isolation.c | 25 | 
1 files changed, 14 insertions, 11 deletions
diff --git a/mm/page_isolation.c b/mm/page_isolation.c index 9d73dc38e3d7..eb3a68ca92ad 100644 --- a/mm/page_isolation.c +++ b/mm/page_isolation.c @@ -288,6 +288,7 @@ __first_valid_page(unsigned long pfn, unsigned long nr_pages)   * @isolate_before:	isolate the pageblock before the boundary_pfn   * @skip_isolation:	the flag to skip the pageblock isolation in second   *			isolate_single_pageblock() + * @migratetype:	migrate type to set in error recovery.   *   * Free and in-use pages can be as big as MAX_ORDER-1 and contain more than one   * pageblock. When not all pageblocks within a page are isolated at the same @@ -302,9 +303,9 @@ __first_valid_page(unsigned long pfn, unsigned long nr_pages)   * the in-use page then splitting the free page.   */  static int isolate_single_pageblock(unsigned long boundary_pfn, int flags, -			gfp_t gfp_flags, bool isolate_before, bool skip_isolation) +			gfp_t gfp_flags, bool isolate_before, bool skip_isolation, +			int migratetype)  { -	unsigned char saved_mt;  	unsigned long start_pfn;  	unsigned long isolate_pageblock;  	unsigned long pfn; @@ -328,13 +329,13 @@ static int isolate_single_pageblock(unsigned long boundary_pfn, int flags,  	start_pfn  = max(ALIGN_DOWN(isolate_pageblock, MAX_ORDER_NR_PAGES),  				      zone->zone_start_pfn); -	saved_mt = get_pageblock_migratetype(pfn_to_page(isolate_pageblock)); +	if (skip_isolation) { +		int mt = get_pageblock_migratetype(pfn_to_page(isolate_pageblock)); -	if (skip_isolation) -		VM_BUG_ON(!is_migrate_isolate(saved_mt)); -	else { -		ret = set_migratetype_isolate(pfn_to_page(isolate_pageblock), saved_mt, flags, -				isolate_pageblock, isolate_pageblock + pageblock_nr_pages); +		VM_BUG_ON(!is_migrate_isolate(mt)); +	} else { +		ret = set_migratetype_isolate(pfn_to_page(isolate_pageblock), migratetype, +				flags, isolate_pageblock, isolate_pageblock + pageblock_nr_pages);  		if (ret)  			return ret; @@ -475,7 +476,7 @@ static int isolate_single_pageblock(unsigned long boundary_pfn, int flags,  failed:  	/* restore the original migratetype */  	if (!skip_isolation) -		unset_migratetype_isolate(pfn_to_page(isolate_pageblock), saved_mt); +		unset_migratetype_isolate(pfn_to_page(isolate_pageblock), migratetype);  	return -EBUSY;  } @@ -537,7 +538,8 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn,  	bool skip_isolation = false;  	/* isolate [isolate_start, isolate_start + pageblock_nr_pages) pageblock */ -	ret = isolate_single_pageblock(isolate_start, flags, gfp_flags, false, skip_isolation); +	ret = isolate_single_pageblock(isolate_start, flags, gfp_flags, false, +			skip_isolation, migratetype);  	if (ret)  		return ret; @@ -545,7 +547,8 @@ int start_isolate_page_range(unsigned long start_pfn, unsigned long end_pfn,  		skip_isolation = true;  	/* isolate [isolate_end - pageblock_nr_pages, isolate_end) pageblock */ -	ret = isolate_single_pageblock(isolate_end, flags, gfp_flags, true, skip_isolation); +	ret = isolate_single_pageblock(isolate_end, flags, gfp_flags, true, +			skip_isolation, migratetype);  	if (ret) {  		unset_migratetype_isolate(pfn_to_page(isolate_start), migratetype);  		return ret;  |