diff options
Diffstat (limited to 'mm/compaction.c')
| -rw-r--r-- | mm/compaction.c | 20 | 
1 files changed, 13 insertions, 7 deletions
diff --git a/mm/compaction.c b/mm/compaction.c index b48c5259ea33..918577595ea8 100644 --- a/mm/compaction.c +++ b/mm/compaction.c @@ -251,7 +251,6 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,  {  	int nr_scanned = 0, total_isolated = 0;  	struct page *cursor, *valid_page = NULL; -	unsigned long nr_strict_required = end_pfn - blockpfn;  	unsigned long flags;  	bool locked = false; @@ -264,11 +263,12 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,  		nr_scanned++;  		if (!pfn_valid_within(blockpfn)) -			continue; +			goto isolate_fail; +  		if (!valid_page)  			valid_page = page;  		if (!PageBuddy(page)) -			continue; +			goto isolate_fail;  		/*  		 * The zone lock must be held to isolate freepages. @@ -289,12 +289,10 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,  		/* Recheck this is a buddy page under lock */  		if (!PageBuddy(page)) -			continue; +			goto isolate_fail;  		/* Found a free page, break it into order-0 pages */  		isolated = split_free_page(page); -		if (!isolated && strict) -			break;  		total_isolated += isolated;  		for (i = 0; i < isolated; i++) {  			list_add(&page->lru, freelist); @@ -305,7 +303,15 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,  		if (isolated) {  			blockpfn += isolated - 1;  			cursor += isolated - 1; +			continue;  		} + +isolate_fail: +		if (strict) +			break; +		else +			continue; +  	}  	trace_mm_compaction_isolate_freepages(nr_scanned, total_isolated); @@ -315,7 +321,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc,  	 * pages requested were isolated. If there were any failures, 0 is  	 * returned and CMA will fail.  	 */ -	if (strict && nr_strict_required > total_isolated) +	if (strict && blockpfn < end_pfn)  		total_isolated = 0;  	if (locked)  | 
