mirror of
				https://github.com/torvalds/linux.git
				synced 2025-10-31 16:48:26 +02:00 
			
		
		
		
	mm/compaction: correctly return failure with bogus compound_order in strict mode
In strict mode, we should return 0 if there is any hole in pageblock.  If
we successfully isolated pages at beginning at pageblock and then have a
bogus compound_order outside pageblock in next page.  We will abort search
loop with blockpfn > end_pfn.  Although we will limit blockpfn to end_pfn,
we will treat it as a successful isolation in strict mode as blockpfn is
not < end_pfn and return partial isolated pages.  Then
isolate_freepages_range may success unexpectly with hole in isolated
range.
Link: https://lkml.kernel.org/r/20230901155141.249860-4-shikemeng@huaweicloud.com
Fixes: 9fcd6d2e05 ("mm, compaction: skip compound pages by order in free scanner")
Signed-off-by: Kemeng Shi <shikemeng@huaweicloud.com>
Reviewed-by: Baolin Wang <baolin.wang@linux.alibaba.com>
Acked-by: Mel Gorman <mgorman@techsingularity.net>
Cc: David Hildenbrand <david@redhat.com>
Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
			
			
This commit is contained in:
		
							parent
							
								
									4c17989116
								
							
						
					
					
						commit
						3da0272a4c
					
				
					 1 changed files with 3 additions and 3 deletions
				
			
		|  | @ -626,11 +626,12 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, | |||
| 		if (PageCompound(page)) { | ||||
| 			const unsigned int order = compound_order(page); | ||||
| 
 | ||||
| 			if (likely(order <= MAX_ORDER)) { | ||||
| 			if (blockpfn + (1UL << order) <= end_pfn) { | ||||
| 				blockpfn += (1UL << order) - 1; | ||||
| 				page += (1UL << order) - 1; | ||||
| 				nr_scanned += (1UL << order) - 1; | ||||
| 			} | ||||
| 
 | ||||
| 			goto isolate_fail; | ||||
| 		} | ||||
| 
 | ||||
|  | @ -678,8 +679,7 @@ static unsigned long isolate_freepages_block(struct compact_control *cc, | |||
| 		spin_unlock_irqrestore(&cc->zone->lock, flags); | ||||
| 
 | ||||
| 	/*
 | ||||
| 	 * There is a tiny chance that we have read bogus compound_order(), | ||||
| 	 * so be careful to not go outside of the pageblock. | ||||
| 	 * Be careful to not go outside of the pageblock. | ||||
| 	 */ | ||||
| 	if (unlikely(blockpfn > end_pfn)) | ||||
| 		blockpfn = end_pfn; | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue
	
	 Kemeng Shi
						Kemeng Shi