diff options
Diffstat (limited to 'mm/mmap.c')
| -rw-r--r-- | mm/mmap.c | 42 | 
1 files changed, 18 insertions, 24 deletions
diff --git a/mm/mmap.c b/mm/mmap.c index 71e4ffc83bcd..d681a20eb4ea 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -195,8 +195,6 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)  	bool downgraded = false;  	LIST_HEAD(uf); -	brk = untagged_addr(brk); -  	if (down_write_killable(&mm->mmap_sem))  		return -EINTR; @@ -1270,26 +1268,22 @@ static struct anon_vma *reusable_anon_vma(struct vm_area_struct *old, struct vm_   */  struct anon_vma *find_mergeable_anon_vma(struct vm_area_struct *vma)  { -	struct anon_vma *anon_vma; -	struct vm_area_struct *near; - -	near = vma->vm_next; -	if (!near) -		goto try_prev; - -	anon_vma = reusable_anon_vma(near, vma, near); -	if (anon_vma) -		return anon_vma; -try_prev: -	near = vma->vm_prev; -	if (!near) -		goto none; - -	anon_vma = reusable_anon_vma(near, near, vma); -	if (anon_vma) -		return anon_vma; -none: +	struct anon_vma *anon_vma = NULL; + +	/* Try next first. */ +	if (vma->vm_next) { +		anon_vma = reusable_anon_vma(vma->vm_next, vma, vma->vm_next); +		if (anon_vma) +			return anon_vma; +	} + +	/* Try prev next. */ +	if (vma->vm_prev) +		anon_vma = reusable_anon_vma(vma->vm_prev, vma->vm_prev, vma); +  	/* +	 * We might reach here with anon_vma == NULL if we can't find +	 * any reusable anon_vma.  	 * There's no absolute need to look only at touching neighbours:  	 * we could search further afield for "compatible" anon_vmas.  	 * But it would probably just be a waste of time searching, @@ -1297,7 +1291,7 @@ none:  	 * We're trying to allow mprotect remerging later on,  	 * not trying to minimize memory used for anon_vmas.  	 */ -	return NULL; +	return anon_vma;  }  /* @@ -1561,8 +1555,6 @@ unsigned long ksys_mmap_pgoff(unsigned long addr, unsigned long len,  	struct file *file = NULL;  	unsigned long retval; -	addr = untagged_addr(addr); -  	if (!(flags & MAP_ANONYMOUS)) {  		audit_mmap_fd(fd, flags);  		file = fget(fd); @@ -3336,6 +3328,8 @@ static const struct vm_operations_struct special_mapping_vmops = {  	.fault = special_mapping_fault,  	.mremap = special_mapping_mremap,  	.name = special_mapping_name, +	/* vDSO code relies that VVAR can't be accessed remotely */ +	.access = NULL,  };  static const struct vm_operations_struct legacy_special_mapping_vmops = {  |