|
@@ -1191,6 +1191,24 @@ static inline unsigned long round_hint_to_min(unsigned long 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(¤t->mm->mmap_sem).
|
|
|
*/
|
|
@@ -1252,16 +1270,8 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
|
|
|
if (!can_do_mlock())
|
|
|
return -EPERM;
|
|
|
|
|
|
- /* mlock MCL_FUTURE? */
|
|
|
- if (vm_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;
|
|
|
- }
|
|
|
+ if (mlock_future_check(mm, vm_flags, len))
|
|
|
+ return -EAGAIN;
|
|
|
|
|
|
if (file) {
|
|
|
struct inode *inode = file_inode(file);
|
|
@@ -2592,18 +2602,9 @@ static unsigned long do_brk(unsigned long addr, unsigned long len)
|
|
|
if (error & ~PAGE_MASK)
|
|
|
return error;
|
|
|
|
|
|
- /*
|
|
|
- * mlock MCL_FUTURE?
|
|
|
- */
|
|
|
- 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;
|
|
|
- }
|
|
|
+ error = mlock_future_check(mm, mm->def_flags, len);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
|
|
|
/*
|
|
|
* mm->mmap_sem is required to protect against another thread
|