|
@@ -709,19 +709,21 @@ SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len)
|
|
|
|
|
|
lru_add_drain_all(); /* flush pagevec */
|
|
|
|
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
len = PAGE_ALIGN(len + (start & ~PAGE_MASK));
|
|
|
start &= PAGE_MASK;
|
|
|
|
|
|
- locked = len >> PAGE_SHIFT;
|
|
|
- locked += current->mm->locked_vm;
|
|
|
-
|
|
|
lock_limit = rlimit(RLIMIT_MEMLOCK);
|
|
|
lock_limit >>= PAGE_SHIFT;
|
|
|
+ locked = len >> PAGE_SHIFT;
|
|
|
+
|
|
|
+ down_write(¤t->mm->mmap_sem);
|
|
|
+
|
|
|
+ locked += current->mm->locked_vm;
|
|
|
|
|
|
/* check against resource limits */
|
|
|
if ((locked <= lock_limit) || capable(CAP_IPC_LOCK))
|
|
|
error = do_mlock(start, len, 1);
|
|
|
+
|
|
|
up_write(¤t->mm->mmap_sem);
|
|
|
if (!error)
|
|
|
error = __mm_populate(start, len, 0);
|
|
@@ -732,11 +734,13 @@ SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
|
|
|
{
|
|
|
int ret;
|
|
|
|
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
len = PAGE_ALIGN(len + (start & ~PAGE_MASK));
|
|
|
start &= PAGE_MASK;
|
|
|
+
|
|
|
+ down_write(¤t->mm->mmap_sem);
|
|
|
ret = do_mlock(start, len, 0);
|
|
|
up_write(¤t->mm->mmap_sem);
|
|
|
+
|
|
|
return ret;
|
|
|
}
|
|
|
|
|
@@ -781,12 +785,12 @@ SYSCALL_DEFINE1(mlockall, int, flags)
|
|
|
if (flags & MCL_CURRENT)
|
|
|
lru_add_drain_all(); /* flush pagevec */
|
|
|
|
|
|
- down_write(¤t->mm->mmap_sem);
|
|
|
-
|
|
|
lock_limit = rlimit(RLIMIT_MEMLOCK);
|
|
|
lock_limit >>= PAGE_SHIFT;
|
|
|
|
|
|
ret = -ENOMEM;
|
|
|
+ down_write(¤t->mm->mmap_sem);
|
|
|
+
|
|
|
if (!(flags & MCL_CURRENT) || (current->mm->total_vm <= lock_limit) ||
|
|
|
capable(CAP_IPC_LOCK))
|
|
|
ret = do_mlockall(flags);
|