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>
这个提交包含在:
12
mm/mlock.c
12
mm/mlock.c
@@ -25,7 +25,7 @@ int can_do_mlock(void)
|
||||
{
|
||||
if (capable(CAP_IPC_LOCK))
|
||||
return 1;
|
||||
if (current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur != 0)
|
||||
if (rlimit(RLIMIT_MEMLOCK) != 0)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@@ -487,7 +487,7 @@ SYSCALL_DEFINE2(mlock, unsigned long, start, size_t, len)
|
||||
locked = len >> PAGE_SHIFT;
|
||||
locked += current->mm->locked_vm;
|
||||
|
||||
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
|
||||
lock_limit = rlimit(RLIMIT_MEMLOCK);
|
||||
lock_limit >>= PAGE_SHIFT;
|
||||
|
||||
/* check against resource limits */
|
||||
@@ -550,7 +550,7 @@ SYSCALL_DEFINE1(mlockall, int, flags)
|
||||
|
||||
down_write(¤t->mm->mmap_sem);
|
||||
|
||||
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
|
||||
lock_limit = rlimit(RLIMIT_MEMLOCK);
|
||||
lock_limit >>= PAGE_SHIFT;
|
||||
|
||||
ret = -ENOMEM;
|
||||
@@ -584,7 +584,7 @@ int user_shm_lock(size_t size, struct user_struct *user)
|
||||
int allowed = 0;
|
||||
|
||||
locked = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
|
||||
lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur;
|
||||
lock_limit = rlimit(RLIMIT_MEMLOCK);
|
||||
if (lock_limit == RLIM_INFINITY)
|
||||
allowed = 1;
|
||||
lock_limit >>= PAGE_SHIFT;
|
||||
@@ -618,12 +618,12 @@ int account_locked_memory(struct mm_struct *mm, struct rlimit *rlim,
|
||||
|
||||
down_write(&mm->mmap_sem);
|
||||
|
||||
lim = rlim[RLIMIT_AS].rlim_cur >> PAGE_SHIFT;
|
||||
lim = ACCESS_ONCE(rlim[RLIMIT_AS].rlim_cur) >> PAGE_SHIFT;
|
||||
vm = mm->total_vm + pgsz;
|
||||
if (lim < vm)
|
||||
goto out;
|
||||
|
||||
lim = rlim[RLIMIT_MEMLOCK].rlim_cur >> PAGE_SHIFT;
|
||||
lim = ACCESS_ONCE(rlim[RLIMIT_MEMLOCK].rlim_cur) >> PAGE_SHIFT;
|
||||
vm = mm->locked_vm + pgsz;
|
||||
if (lim < vm)
|
||||
goto out;
|
||||
|
在新工单中引用
屏蔽一个用户