mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	mm/nommu: use alloc_pages_exact() rather than its own implementation
do_mmap_private() in nommu.c try to allocate physically contiguous pages with arbitrary size in some cases and we now have good abstract function to do exactly same thing, alloc_pages_exact(). So, change to use it. There is no functional change. This is the preparation step for support page owner feature accurately. Signed-off-by: Joonsoo Kim <iamjoonsoo.kim@lge.com> Cc: Mel Gorman <mgorman@suse.de> Cc: Johannes Weiner <hannes@cmpxchg.org> Cc: Minchan Kim <minchan@kernel.org> Cc: Dave Hansen <dave@sr71.net> Cc: Michal Nazarewicz <mina86@mina86.com> Cc: Jungsoo Son <jungsoo.son@lge.com> Cc: Ingo Molnar <mingo@redhat.com> Cc: Joonsoo Kim <iamjoonsoo.kim@lge.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
		
							parent
							
								
									031bc5743f
								
							
						
					
					
						commit
						dbc8358c72
					
				
					 1 changed files with 11 additions and 22 deletions
				
			
		
							
								
								
									
										33
									
								
								mm/nommu.c
									
									
									
									
									
								
							
							
						
						
									
										33
									
								
								mm/nommu.c
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1149,8 +1149,7 @@ static int do_mmap_private(struct vm_area_struct *vma,
 | 
			
		|||
			   unsigned long len,
 | 
			
		||||
			   unsigned long capabilities)
 | 
			
		||||
{
 | 
			
		||||
	struct page *pages;
 | 
			
		||||
	unsigned long total, point, n;
 | 
			
		||||
	unsigned long total, point;
 | 
			
		||||
	void *base;
 | 
			
		||||
	int ret, order;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -1182,33 +1181,23 @@ static int do_mmap_private(struct vm_area_struct *vma,
 | 
			
		|||
	order = get_order(len);
 | 
			
		||||
	kdebug("alloc order %d for %lx", order, len);
 | 
			
		||||
 | 
			
		||||
	pages = alloc_pages(GFP_KERNEL, order);
 | 
			
		||||
	if (!pages)
 | 
			
		||||
		goto enomem;
 | 
			
		||||
 | 
			
		||||
	total = 1 << order;
 | 
			
		||||
	atomic_long_add(total, &mmap_pages_allocated);
 | 
			
		||||
 | 
			
		||||
	point = len >> PAGE_SHIFT;
 | 
			
		||||
 | 
			
		||||
	/* we allocated a power-of-2 sized page set, so we may want to trim off
 | 
			
		||||
	 * the excess */
 | 
			
		||||
	/* we don't want to allocate a power-of-2 sized page set */
 | 
			
		||||
	if (sysctl_nr_trim_pages && total - point >= sysctl_nr_trim_pages) {
 | 
			
		||||
		while (total > point) {
 | 
			
		||||
			order = ilog2(total - point);
 | 
			
		||||
			n = 1 << order;
 | 
			
		||||
			kdebug("shave %lu/%lu @%lu", n, total - point, total);
 | 
			
		||||
			atomic_long_sub(n, &mmap_pages_allocated);
 | 
			
		||||
			total -= n;
 | 
			
		||||
			set_page_refcounted(pages + total);
 | 
			
		||||
			__free_pages(pages + total, order);
 | 
			
		||||
		}
 | 
			
		||||
		total = point;
 | 
			
		||||
		kdebug("try to alloc exact %lu pages", total);
 | 
			
		||||
		base = alloc_pages_exact(len, GFP_KERNEL);
 | 
			
		||||
	} else {
 | 
			
		||||
		base = (void *)__get_free_pages(GFP_KERNEL, order);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	for (point = 1; point < total; point++)
 | 
			
		||||
		set_page_refcounted(&pages[point]);
 | 
			
		||||
	if (!base)
 | 
			
		||||
		goto enomem;
 | 
			
		||||
 | 
			
		||||
	atomic_long_add(total, &mmap_pages_allocated);
 | 
			
		||||
 | 
			
		||||
	base = page_address(pages);
 | 
			
		||||
	region->vm_flags = vma->vm_flags |= VM_MAPPED_COPY;
 | 
			
		||||
	region->vm_start = (unsigned long) base;
 | 
			
		||||
	region->vm_end   = region->vm_start + len;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue