mm/hugetlb: add same zone check in pfn_range_valid_gigantic()
This patchset deals with some problematic sites that iterate pfn ranges. There is a system thats node's pfns are overlapped as follows: -----pfn--------> N0 N1 N2 N0 N1 N2 Therefore, we need to take care of this overlapping when iterating pfn range. I audit many iterating sites that uses pfn_valid(), pfn_valid_within(), zone_start_pfn and etc. and others looks safe to me. This is a preparation step for a new CMA implementation, ZONE_CMA (https://lkml.org/lkml/2015/2/12/95), because it would be easily overlapped with other zones. But, zone overlap check is also needed for the general case so I send it separately. This patch (of 5): alloc_gigantic_page() uses alloc_contig_range() and this requires that the requested range is in a single zone. To satisfy this requirement, add this check to pfn_range_valid_gigantic(). Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Acked-by: Vlastimil Babka <vbabka@suse.cz> Cc: Rik van Riel <riel@redhat.com> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Mel Gorman <mgorman@techsingularity.net> Cc: Laura Abbott <lauraa@codeaurora.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Marek Szyprowski <m.szyprowski@samsung.com> Cc: Michal Nazarewicz <mina86@mina86.com> Cc: "Aneesh Kumar K.V" <aneesh.kumar@linux.vnet.ibm.com> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Michael Ellerman <mpe@ellerman.id.au> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									1aa8aea535
								
							
						
					
					
						commit
						f44b2dda8b
					
				| @ -1031,8 +1031,8 @@ static int __alloc_gigantic_page(unsigned long start_pfn, | ||||
| 	return alloc_contig_range(start_pfn, end_pfn, MIGRATE_MOVABLE); | ||||
| } | ||||
| 
 | ||||
| static bool pfn_range_valid_gigantic(unsigned long start_pfn, | ||||
| 				unsigned long nr_pages) | ||||
| static bool pfn_range_valid_gigantic(struct zone *z, | ||||
| 			unsigned long start_pfn, unsigned long nr_pages) | ||||
| { | ||||
| 	unsigned long i, end_pfn = start_pfn + nr_pages; | ||||
| 	struct page *page; | ||||
| @ -1043,6 +1043,9 @@ static bool pfn_range_valid_gigantic(unsigned long start_pfn, | ||||
| 
 | ||||
| 		page = pfn_to_page(i); | ||||
| 
 | ||||
| 		if (page_zone(page) != z) | ||||
| 			return false; | ||||
| 
 | ||||
| 		if (PageReserved(page)) | ||||
| 			return false; | ||||
| 
 | ||||
| @ -1075,7 +1078,7 @@ static struct page *alloc_gigantic_page(int nid, unsigned int order) | ||||
| 
 | ||||
| 		pfn = ALIGN(z->zone_start_pfn, nr_pages); | ||||
| 		while (zone_spans_last_pfn(z, pfn, nr_pages)) { | ||||
| 			if (pfn_range_valid_gigantic(pfn, nr_pages)) { | ||||
| 			if (pfn_range_valid_gigantic(z, pfn, nr_pages)) { | ||||
| 				/*
 | ||||
| 				 * We release the zone lock here because | ||||
| 				 * alloc_contig_range() will also lock the zone | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user