diff options
Diffstat (limited to 'mm/memory.c')
| -rw-r--r-- | mm/memory.c | 18 | 
1 files changed, 14 insertions, 4 deletions
diff --git a/mm/memory.c b/mm/memory.c index 6793b9c6810..1002f473f49 100644 --- a/mm/memory.c +++ b/mm/memory.c @@ -1789,7 +1789,7 @@ static int do_wp_page(struct mm_struct *mm, struct vm_area_struct *vma,  	 * not dirty accountable.  	 */  	if (PageAnon(old_page)) { -		if (!TestSetPageLocked(old_page)) { +		if (trylock_page(old_page)) {  			reuse = can_share_swap_page(old_page);  			unlock_page(old_page);  		} @@ -2765,16 +2765,26 @@ int make_pages_present(unsigned long addr, unsigned long end)  	vma = find_vma(current->mm, addr);  	if (!vma) -		return -1; +		return -ENOMEM;  	write = (vma->vm_flags & VM_WRITE) != 0;  	BUG_ON(addr >= end);  	BUG_ON(end > vma->vm_end);  	len = DIV_ROUND_UP(end, PAGE_SIZE) - addr/PAGE_SIZE;  	ret = get_user_pages(current, current->mm, addr,  			len, write, 0, NULL, NULL); -	if (ret < 0) +	if (ret < 0) { +		/* +		   SUS require strange return value to mlock +		    - invalid addr generate to ENOMEM. +		    - out of memory should generate EAGAIN. +		*/ +		if (ret == -EFAULT) +			ret = -ENOMEM; +		else if (ret == -ENOMEM) +			ret = -EAGAIN;  		return ret; -	return ret == len ? 0 : -1; +	} +	return ret == len ? 0 : -ENOMEM;  }  #if !defined(__HAVE_ARCH_GATE_AREA)  |