Commit 363ee17f authored by Davidlohr Bueso's avatar Davidlohr Bueso Committed by Linus Torvalds

mm/mmap.c: add mlock_future_check() helper

Both do_brk and do_mmap_pgoff verify that we are actually capable of
locking future pages if the corresponding VM_LOCKED flags are used.
Encapsulate this logic into a single mlock_future_check() helper
function.
Signed-off-by: default avatarDavidlohr Bueso <davidlohr@hp.com>
Cc: Rik van Riel <riel@redhat.com>
Reviewed-by: default avatarMichel Lespinasse <walken@google.com>
Cc: Vlastimil Babka <vbabka@suse.cz>
Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 49f0ce5f
...@@ -1191,6 +1191,24 @@ static inline unsigned long round_hint_to_min(unsigned long hint) ...@@ -1191,6 +1191,24 @@ static inline unsigned long round_hint_to_min(unsigned long hint)
return hint; return hint;
} }
static inline int mlock_future_check(struct mm_struct *mm,
unsigned long flags,
unsigned long len)
{
unsigned long locked, lock_limit;
/* mlock MCL_FUTURE? */
if (flags & VM_LOCKED) {
locked = len >> PAGE_SHIFT;
locked += mm->locked_vm;
lock_limit = rlimit(RLIMIT_MEMLOCK);
lock_limit >>= PAGE_SHIFT;
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
return -EAGAIN;
}
return 0;
}
/* /*
* The caller must hold down_write(&current->mm->mmap_sem). * The caller must hold down_write(&current->mm->mmap_sem).
*/ */
...@@ -1252,16 +1270,8 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, ...@@ -1252,16 +1270,8 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
if (!can_do_mlock()) if (!can_do_mlock())
return -EPERM; return -EPERM;
/* mlock MCL_FUTURE? */ if (mlock_future_check(mm, vm_flags, len))
if (vm_flags & VM_LOCKED) { return -EAGAIN;
unsigned long locked, lock_limit;
locked = len >> PAGE_SHIFT;
locked += mm->locked_vm;
lock_limit = rlimit(RLIMIT_MEMLOCK);
lock_limit >>= PAGE_SHIFT;
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
return -EAGAIN;
}
if (file) { if (file) {
struct inode *inode = file_inode(file); struct inode *inode = file_inode(file);
...@@ -2592,18 +2602,9 @@ static unsigned long do_brk(unsigned long addr, unsigned long len) ...@@ -2592,18 +2602,9 @@ static unsigned long do_brk(unsigned long addr, unsigned long len)
if (error & ~PAGE_MASK) if (error & ~PAGE_MASK)
return error; return error;
/* error = mlock_future_check(mm, mm->def_flags, len);
* mlock MCL_FUTURE? if (error)
*/ return error;
if (mm->def_flags & VM_LOCKED) {
unsigned long locked, lock_limit;
locked = len >> PAGE_SHIFT;
locked += mm->locked_vm;
lock_limit = rlimit(RLIMIT_MEMLOCK);
lock_limit >>= PAGE_SHIFT;
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
return -EAGAIN;
}
/* /*
* mm->mmap_sem is required to protect against another thread * mm->mmap_sem is required to protect against another thread
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment