diff options
author | Jiri Slaby <jslaby@suse.cz> | 2010-03-05 16:41:44 -0500 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-06 14:26:24 -0500 |
commit | 59e99e5b9706867f18d4a36c1e4645fbaacbec2e (patch) | |
tree | e977fb5eecccf1446296fd196072bd1287b0a92f /mm/mmap.c | |
parent | 06f9d8c2b50060543fb6e0af87ddb86e654dee6b (diff) |
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
3e10e716abf3c71bdb5d86b8f507f9e72236c9cd ("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>
Diffstat (limited to 'mm/mmap.c')
-rw-r--r-- | mm/mmap.c | 13 |
1 files changed, 7 insertions, 6 deletions
@@ -265,7 +265,7 @@ SYSCALL_DEFINE1(brk, unsigned long, brk) | |||
265 | * segment grow beyond its set limit the in case where the limit is | 265 | * segment grow beyond its set limit the in case where the limit is |
266 | * not page aligned -Ram Gupta | 266 | * not page aligned -Ram Gupta |
267 | */ | 267 | */ |
268 | rlim = current->signal->rlim[RLIMIT_DATA].rlim_cur; | 268 | rlim = rlimit(RLIMIT_DATA); |
269 | if (rlim < RLIM_INFINITY && (brk - mm->start_brk) + | 269 | if (rlim < RLIM_INFINITY && (brk - mm->start_brk) + |
270 | (mm->end_data - mm->start_data) > rlim) | 270 | (mm->end_data - mm->start_data) > rlim) |
271 | goto out; | 271 | goto out; |
@@ -967,7 +967,7 @@ unsigned long do_mmap_pgoff(struct file *file, unsigned long addr, | |||
967 | unsigned long locked, lock_limit; | 967 | unsigned long locked, lock_limit; |
968 | locked = len >> PAGE_SHIFT; | 968 | locked = len >> PAGE_SHIFT; |
969 | locked += mm->locked_vm; | 969 | locked += mm->locked_vm; |
970 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur; | 970 | lock_limit = rlimit(RLIMIT_MEMLOCK); |
971 | lock_limit >>= PAGE_SHIFT; | 971 | lock_limit >>= PAGE_SHIFT; |
972 | if (locked > lock_limit && !capable(CAP_IPC_LOCK)) | 972 | if (locked > lock_limit && !capable(CAP_IPC_LOCK)) |
973 | return -EAGAIN; | 973 | return -EAGAIN; |
@@ -1594,7 +1594,7 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns | |||
1594 | return -ENOMEM; | 1594 | return -ENOMEM; |
1595 | 1595 | ||
1596 | /* Stack limit test */ | 1596 | /* Stack limit test */ |
1597 | if (size > rlim[RLIMIT_STACK].rlim_cur) | 1597 | if (size > ACCESS_ONCE(rlim[RLIMIT_STACK].rlim_cur)) |
1598 | return -ENOMEM; | 1598 | return -ENOMEM; |
1599 | 1599 | ||
1600 | /* mlock limit tests */ | 1600 | /* mlock limit tests */ |
@@ -1602,7 +1602,8 @@ static int acct_stack_growth(struct vm_area_struct *vma, unsigned long size, uns | |||
1602 | unsigned long locked; | 1602 | unsigned long locked; |
1603 | unsigned long limit; | 1603 | unsigned long limit; |
1604 | locked = mm->locked_vm + grow; | 1604 | locked = mm->locked_vm + grow; |
1605 | limit = rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT; | 1605 | limit = ACCESS_ONCE(rlim[RLIMIT_MEMLOCK].rlim_cur); |
1606 | limit >>= PAGE_SHIFT; | ||
1606 | if (locked > limit && !capable(CAP_IPC_LOCK)) | 1607 | if (locked > limit && !capable(CAP_IPC_LOCK)) |
1607 | return -ENOMEM; | 1608 | return -ENOMEM; |
1608 | } | 1609 | } |
@@ -2067,7 +2068,7 @@ unsigned long do_brk(unsigned long addr, unsigned long len) | |||
2067 | unsigned long locked, lock_limit; | 2068 | unsigned long locked, lock_limit; |
2068 | locked = len >> PAGE_SHIFT; | 2069 | locked = len >> PAGE_SHIFT; |
2069 | locked += mm->locked_vm; | 2070 | locked += mm->locked_vm; |
2070 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur; | 2071 | lock_limit = rlimit(RLIMIT_MEMLOCK); |
2071 | lock_limit >>= PAGE_SHIFT; | 2072 | lock_limit >>= PAGE_SHIFT; |
2072 | if (locked > lock_limit && !capable(CAP_IPC_LOCK)) | 2073 | if (locked > lock_limit && !capable(CAP_IPC_LOCK)) |
2073 | return -EAGAIN; | 2074 | return -EAGAIN; |
@@ -2281,7 +2282,7 @@ int may_expand_vm(struct mm_struct *mm, unsigned long npages) | |||
2281 | unsigned long cur = mm->total_vm; /* pages */ | 2282 | unsigned long cur = mm->total_vm; /* pages */ |
2282 | unsigned long lim; | 2283 | unsigned long lim; |
2283 | 2284 | ||
2284 | lim = current->signal->rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT; | 2285 | lim = rlimit(RLIMIT_AS) >> PAGE_SHIFT; |
2285 | 2286 | ||
2286 | if (cur + npages > lim) | 2287 | if (cur + npages > lim) |
2287 | return 0; | 2288 | return 0; |