Merge branch 'x86/cpu' into x86/platform, to avoid conflict
[cascardo/linux.git] / mm / mlock.c
index 96f0010..ef8dc9f 100644 (file)
@@ -617,7 +617,7 @@ static int apply_vma_lock_flags(unsigned long start, size_t len,
        return error;
 }
 
-static int do_mlock(unsigned long start, size_t len, vm_flags_t flags)
+static __must_check int do_mlock(unsigned long start, size_t len, vm_flags_t flags)
 {
        unsigned long locked;
        unsigned long lock_limit;
@@ -635,7 +635,8 @@ static int do_mlock(unsigned long start, size_t len, vm_flags_t flags)
        lock_limit >>= PAGE_SHIFT;
        locked = len >> PAGE_SHIFT;
 
-       down_write(&current->mm->mmap_sem);
+       if (down_write_killable(&current->mm->mmap_sem))
+               return -EINTR;
 
        locked += current->mm->locked_vm;
 
@@ -678,7 +679,8 @@ SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
        len = PAGE_ALIGN(len + (offset_in_page(start)));
        start &= PAGE_MASK;
 
-       down_write(&current->mm->mmap_sem);
+       if (down_write_killable(&current->mm->mmap_sem))
+               return -EINTR;
        ret = apply_vma_lock_flags(start, len, 0);
        up_write(&current->mm->mmap_sem);
 
@@ -748,9 +750,10 @@ SYSCALL_DEFINE1(mlockall, int, flags)
        lock_limit = rlimit(RLIMIT_MEMLOCK);
        lock_limit >>= PAGE_SHIFT;
 
-       ret = -ENOMEM;
-       down_write(&current->mm->mmap_sem);
+       if (down_write_killable(&current->mm->mmap_sem))
+               return -EINTR;
 
+       ret = -ENOMEM;
        if (!(flags & MCL_CURRENT) || (current->mm->total_vm <= lock_limit) ||
            capable(CAP_IPC_LOCK))
                ret = apply_mlockall_flags(flags);
@@ -765,7 +768,8 @@ SYSCALL_DEFINE0(munlockall)
 {
        int ret;
 
-       down_write(&current->mm->mmap_sem);
+       if (down_write_killable(&current->mm->mmap_sem))
+               return -EINTR;
        ret = apply_mlockall_flags(0);
        up_write(&current->mm->mmap_sem);
        return ret;