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 | |
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>
-rw-r--r-- | mm/filemap.c | 2 | ||||
-rw-r--r-- | mm/mlock.c | 12 | ||||
-rw-r--r-- | mm/mmap.c | 13 | ||||
-rw-r--r-- | mm/mremap.c | 2 |
4 files changed, 15 insertions, 14 deletions
diff --git a/mm/filemap.c b/mm/filemap.c index 148b52a5bb7e..045b31c37653 100644 --- a/mm/filemap.c +++ b/mm/filemap.c | |||
@@ -1986,7 +1986,7 @@ EXPORT_SYMBOL(iov_iter_single_seg_count); | |||
1986 | inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk) | 1986 | inline int generic_write_checks(struct file *file, loff_t *pos, size_t *count, int isblk) |
1987 | { | 1987 | { |
1988 | struct inode *inode = file->f_mapping->host; | 1988 | struct inode *inode = file->f_mapping->host; |
1989 | unsigned long limit = current->signal->rlim[RLIMIT_FSIZE].rlim_cur; | 1989 | unsigned long limit = rlimit(RLIMIT_FSIZE); |
1990 | 1990 | ||
1991 | if (unlikely(*pos < 0)) | 1991 | if (unlikely(*pos < 0)) |
1992 | return -EINVAL; | 1992 | return -EINVAL; |
diff --git a/mm/mlock.c b/mm/mlock.c index 2b8335a89400..8f4e2dfceec1 100644 --- a/mm/mlock.c +++ b/mm/mlock.c | |||
@@ -25,7 +25,7 @@ int can_do_mlock(void) | |||
25 | { | 25 | { |
26 | if (capable(CAP_IPC_LOCK)) | 26 | if (capable(CAP_IPC_LOCK)) |
27 | return 1; | 27 | return 1; |
28 | if (current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur != 0) | 28 | if (rlimit(RLIMIT_MEMLOCK) != 0) |
29 | return 1; | 29 | return 1; |
30 | return 0; | 30 | return 0; |
31 | } | 31 | } |
@@ -487,7 +487,7 @@ SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len) | |||
487 | locked = len >> PAGE_SHIFT; | 487 | locked = len >> PAGE_SHIFT; |
488 | locked += current->mm->locked_vm; | 488 | locked += current->mm->locked_vm; |
489 | 489 | ||
490 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur; | 490 | lock_limit = rlimit(RLIMIT_MEMLOCK); |
491 | lock_limit >>= PAGE_SHIFT; | 491 | lock_limit >>= PAGE_SHIFT; |
492 | 492 | ||
493 | /* check against resource limits */ | 493 | /* check against resource limits */ |
@@ -550,7 +550,7 @@ SYSCALL_DEFINE1(mlockall, int, flags) | |||
550 | 550 | ||
551 | down_write(¤t->mm->mmap_sem); | 551 | down_write(¤t->mm->mmap_sem); |
552 | 552 | ||
553 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur; | 553 | lock_limit = rlimit(RLIMIT_MEMLOCK); |
554 | lock_limit >>= PAGE_SHIFT; | 554 | lock_limit >>= PAGE_SHIFT; |
555 | 555 | ||
556 | ret = -ENOMEM; | 556 | ret = -ENOMEM; |
@@ -584,7 +584,7 @@ int user_shm_lock(size_t size, struct user_struct *user) | |||
584 | int allowed = 0; | 584 | int allowed = 0; |
585 | 585 | ||
586 | locked = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; | 586 | locked = (size + PAGE_SIZE - 1) >> PAGE_SHIFT; |
587 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur; | 587 | lock_limit = rlimit(RLIMIT_MEMLOCK); |
588 | if (lock_limit == RLIM_INFINITY) | 588 | if (lock_limit == RLIM_INFINITY) |
589 | allowed = 1; | 589 | allowed = 1; |
590 | lock_limit >>= PAGE_SHIFT; | 590 | lock_limit >>= PAGE_SHIFT; |
@@ -618,12 +618,12 @@ int account_locked_memory(struct mm_struct *mm, struct rlimit *rlim, | |||
618 | 618 | ||
619 | down_write(&mm->mmap_sem); | 619 | down_write(&mm->mmap_sem); |
620 | 620 | ||
621 | lim = rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT; | 621 | lim = ACCESS_ONCE(rlim[RLIMIT_AS].rlim_cur) >> PAGE_SHIFT; |
622 | vm = mm->total_vm + pgsz; | 622 | vm = mm->total_vm + pgsz; |
623 | if (lim < vm) | 623 | if (lim < vm) |
624 | goto out; | 624 | goto out; |
625 | 625 | ||
626 | lim = rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT; | 626 | lim = ACCESS_ONCE(rlim[RLIMIT_MEMLOCK].rlim_cur) >> PAGE_SHIFT; |
627 | vm = mm->locked_vm + pgsz; | 627 | vm = mm->locked_vm + pgsz; |
628 | if (lim < vm) | 628 | if (lim < vm) |
629 | goto out; | 629 | goto out; |
@@ -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; |
diff --git a/mm/mremap.c b/mm/mremap.c index 845190898d59..4c4c803453f3 100644 --- a/mm/mremap.c +++ b/mm/mremap.c | |||
@@ -285,7 +285,7 @@ static struct vm_area_struct *vma_to_resize(unsigned long addr, | |||
285 | if (vma->vm_flags & VM_LOCKED) { | 285 | if (vma->vm_flags & VM_LOCKED) { |
286 | unsigned long locked, lock_limit; | 286 | unsigned long locked, lock_limit; |
287 | locked = mm->locked_vm << PAGE_SHIFT; | 287 | locked = mm->locked_vm << PAGE_SHIFT; |
288 | lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur; | 288 | lock_limit = rlimit(RLIMIT_MEMLOCK); |
289 | locked += new_len - old_len; | 289 | locked += new_len - old_len; |
290 | if (locked > lock_limit && !capable(CAP_IPC_LOCK)) | 290 | if (locked > lock_limit && !capable(CAP_IPC_LOCK)) |
291 | goto Eagain; | 291 | goto Eagain; |