mm: use rlimit helpers
Make sure compiler won't do weird things with limits. E.g. fetching them
twice may return 2 different values after writable limits are implemented.
I.e. either use rlimit helpers added in
3e10e716ab
("resource: add helpers for
fetching rlimits") or ACCESS_ONCE if not applicable.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
06f9d8c2b5
commit
59e99e5b97
13
mm/mmap.c
13
mm/mmap.c
@ -265,7 +265,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk)
|
||||
* segment grow beyond its set limit the in case where the limit is
|
||||
* not page aligned -Ram Gupta
|
||||
*/
|
||||
rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur;
|
||||
rlim = rlimit(RLIMIT_DATA);
|
||||
if (rlim < RLIM_INFINITY && (brk - mm->start_brk) +
|
||||
(mm->end_data - mm->start_data) > rlim)
|
||||
goto out;
|
||||
@ -967,7 +967,7 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr,
|
||||
unsigned long locked, lock_limit;
|
||||
locked = len >> PAGE_SHIFT;
|
||||
locked += mm->locked_vm;
|
||||
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
|
||||
lock_limit = rlimit(RLIMIT_MEMLOCK);
|
||||
lock_limit >>= PAGE_SHIFT;
|
||||
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
|
||||
return -EAGAIN;
|
||||
@ -1594,7 +1594,7 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns
|
||||
return -ENOMEM;
|
||||
|
||||
/* Stack limit test */
|
||||
if (size > rlim[RLIMIT_STACK].rlim_cur)
|
||||
if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur))
|
||||
return -ENOMEM;
|
||||
|
||||
/* mlock limit tests */
|
||||
@ -1602,7 +1602,8 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns
|
||||
unsigned long locked;
|
||||
unsigned long limit;
|
||||
locked = mm->locked_vm + grow;
|
||||
limit = rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT;
|
||||
limit = ACCESS_ONCE(rlim[RLIMIT_MEMLOCK].rlim_cur);
|
||||
limit >>= PAGE_SHIFT;
|
||||
if (locked > limit && !capable(CAP_IPC_LOCK))
|
||||
return -ENOMEM;
|
||||
}
|
||||
@ -2067,7 +2068,7 @@ unsigned long do_brk(unsigned long addr, unsigned long len)
|
||||
unsigned long locked, lock_limit;
|
||||
locked = len >> PAGE_SHIFT;
|
||||
locked += mm->locked_vm;
|
||||
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
|
||||
lock_limit = rlimit(RLIMIT_MEMLOCK);
|
||||
lock_limit >>= PAGE_SHIFT;
|
||||
if (locked > lock_limit && !capable(CAP_IPC_LOCK))
|
||||
return -EAGAIN;
|
||||
@ -2281,7 +2282,7 @@ int may_expand_vm(struct mm_struct *mm, unsigned long npages)
|
||||
unsigned long cur = mm->total_vm; /* pages */
|
||||
unsigned long lim;
|
||||
|
||||
lim = current->signal->rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT;
|
||||
lim = rlimit(RLIMIT_AS) >> PAGE_SHIFT;
|
||||
|
||||
if (cur + npages > lim)
|
||||
return 0;
|
||||
|
Reference in New Issue
Block a user