diff options
Diffstat (limited to 'mm/mmap.c')
| -rw-r--r-- | mm/mmap.c | 10 | 
1 files changed, 6 insertions, 4 deletions
diff --git a/mm/mmap.c b/mm/mmap.c index 2664a47cec9..033094ba62d 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -1306,7 +1306,9 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,  	}  	addr = mmap_region(file, addr, len, vm_flags, pgoff); -	if (!IS_ERR_VALUE(addr) && (vm_flags & VM_POPULATE)) +	if (!IS_ERR_VALUE(addr) && +	    ((vm_flags & VM_LOCKED) || +	     (flags & (MAP_POPULATE | MAP_NONBLOCK)) == MAP_POPULATE))  		*populate = len;  	return addr;  } @@ -1938,7 +1940,7 @@ struct vm_area_struct *find_vma(struct mm_struct *mm, unsigned long addr)  	/* Check the cache first. */  	/* (Cache hit rate is typically around 35%.) */ -	vma = mm->mmap_cache; +	vma = ACCESS_ONCE(mm->mmap_cache);  	if (!(vma && vma->vm_end > addr && vma->vm_start <= addr)) {  		struct rb_node *rb_node; @@ -2303,7 +2305,7 @@ static void unmap_region(struct mm_struct *mm,  	update_hiwater_rss(mm);  	unmap_vmas(&tlb, vma, start, end);  	free_pgtables(&tlb, vma, prev ? prev->vm_end : FIRST_USER_ADDRESS, -				 next ? next->vm_start : 0); +				 next ? next->vm_start : USER_PGTABLES_CEILING);  	tlb_finish_mmu(&tlb, start, end);  } @@ -2683,7 +2685,7 @@ void exit_mmap(struct mm_struct *mm)  	/* Use -1 here to ensure all VMAs in the mm are unmapped */  	unmap_vmas(&tlb, vma, 0, -1); -	free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, 0); +	free_pgtables(&tlb, vma, FIRST_USER_ADDRESS, USER_PGTABLES_CEILING);  	tlb_finish_mmu(&tlb, 0, -1);  	/*  |