|
@@ -554,7 +554,8 @@ out:
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-static int do_mlock(unsigned long start, size_t len, int on)
|
|
|
|
|
|
+static int apply_vma_lock_flags(unsigned long start, size_t len,
|
|
|
|
+ vm_flags_t flags)
|
|
{
|
|
{
|
|
unsigned long nstart, end, tmp;
|
|
unsigned long nstart, end, tmp;
|
|
struct vm_area_struct * vma, * prev;
|
|
struct vm_area_struct * vma, * prev;
|
|
@@ -576,14 +577,11 @@ static int do_mlock(unsigned long start, size_t len, int on)
|
|
prev = vma;
|
|
prev = vma;
|
|
|
|
|
|
for (nstart = start ; ; ) {
|
|
for (nstart = start ; ; ) {
|
|
- vm_flags_t newflags;
|
|
|
|
-
|
|
|
|
- /* Here we know that vma->vm_start <= nstart < vma->vm_end. */
|
|
|
|
|
|
+ vm_flags_t newflags = vma->vm_flags & ~VM_LOCKED;
|
|
|
|
|
|
- newflags = vma->vm_flags & ~VM_LOCKED;
|
|
|
|
- if (on)
|
|
|
|
- newflags |= VM_LOCKED;
|
|
|
|
|
|
+ newflags |= flags;
|
|
|
|
|
|
|
|
+ /* Here we know that vma->vm_start <= nstart < vma->vm_end. */
|
|
tmp = vma->vm_end;
|
|
tmp = vma->vm_end;
|
|
if (tmp > end)
|
|
if (tmp > end)
|
|
tmp = end;
|
|
tmp = end;
|
|
@@ -605,7 +603,7 @@ static int do_mlock(unsigned long start, size_t len, int on)
|
|
return error;
|
|
return error;
|
|
}
|
|
}
|
|
|
|
|
|
-SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len)
|
|
|
|
|
|
+static int do_mlock(unsigned long start, size_t len, vm_flags_t flags)
|
|
{
|
|
{
|
|
unsigned long locked;
|
|
unsigned long locked;
|
|
unsigned long lock_limit;
|
|
unsigned long lock_limit;
|
|
@@ -629,7 +627,7 @@ SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len)
|
|
|
|
|
|
/* check against resource limits */
|
|
/* check against resource limits */
|
|
if ((locked <= lock_limit) || capable(CAP_IPC_LOCK))
|
|
if ((locked <= lock_limit) || capable(CAP_IPC_LOCK))
|
|
- error = do_mlock(start, len, 1);
|
|
|
|
|
|
+ error = apply_vma_lock_flags(start, len, flags);
|
|
|
|
|
|
up_write(¤t->mm->mmap_sem);
|
|
up_write(¤t->mm->mmap_sem);
|
|
if (error)
|
|
if (error)
|
|
@@ -641,6 +639,11 @@ SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len)
|
|
return 0;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len)
|
|
|
|
+{
|
|
|
|
+ return do_mlock(start, len, VM_LOCKED);
|
|
|
|
+}
|
|
|
|
+
|
|
SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
|
|
SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
|
|
{
|
|
{
|
|
int ret;
|
|
int ret;
|
|
@@ -649,13 +652,13 @@ SYSCALL_DEFINE2(munlock, unsigned long, start, size_t, len)
|
|
start &= PAGE_MASK;
|
|
start &= PAGE_MASK;
|
|
|
|
|
|
down_write(¤t->mm->mmap_sem);
|
|
down_write(¤t->mm->mmap_sem);
|
|
- ret = do_mlock(start, len, 0);
|
|
|
|
|
|
+ ret = apply_vma_lock_flags(start, len, 0);
|
|
up_write(¤t->mm->mmap_sem);
|
|
up_write(¤t->mm->mmap_sem);
|
|
|
|
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|
|
|
|
|
|
-static int do_mlockall(int flags)
|
|
|
|
|
|
+static int apply_mlockall_flags(int flags)
|
|
{
|
|
{
|
|
struct vm_area_struct * vma, * prev = NULL;
|
|
struct vm_area_struct * vma, * prev = NULL;
|
|
|
|
|
|
@@ -663,6 +666,7 @@ static int do_mlockall(int flags)
|
|
current->mm->def_flags |= VM_LOCKED;
|
|
current->mm->def_flags |= VM_LOCKED;
|
|
else
|
|
else
|
|
current->mm->def_flags &= ~VM_LOCKED;
|
|
current->mm->def_flags &= ~VM_LOCKED;
|
|
|
|
+
|
|
if (flags == MCL_FUTURE)
|
|
if (flags == MCL_FUTURE)
|
|
goto out;
|
|
goto out;
|
|
|
|
|
|
@@ -703,7 +707,7 @@ SYSCALL_DEFINE1(mlockall, int, flags)
|
|
|
|
|
|
if (!(flags & MCL_CURRENT) || (current->mm->total_vm <= lock_limit) ||
|
|
if (!(flags & MCL_CURRENT) || (current->mm->total_vm <= lock_limit) ||
|
|
capable(CAP_IPC_LOCK))
|
|
capable(CAP_IPC_LOCK))
|
|
- ret = do_mlockall(flags);
|
|
|
|
|
|
+ ret = apply_mlockall_flags(flags);
|
|
up_write(¤t->mm->mmap_sem);
|
|
up_write(¤t->mm->mmap_sem);
|
|
if (!ret && (flags & MCL_CURRENT))
|
|
if (!ret && (flags & MCL_CURRENT))
|
|
mm_populate(0, TASK_SIZE);
|
|
mm_populate(0, TASK_SIZE);
|
|
@@ -716,7 +720,7 @@ SYSCALL_DEFINE0(munlockall)
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
down_write(¤t->mm->mmap_sem);
|
|
down_write(¤t->mm->mmap_sem);
|
|
- ret = do_mlockall(0);
|
|
|
|
|
|
+ ret = apply_mlockall_flags(0);
|
|
up_write(¤t->mm->mmap_sem);
|
|
up_write(¤t->mm->mmap_sem);
|
|
return ret;
|
|
return ret;
|
|
}
|
|
}
|