diff options
| -rw-r--r-- | kernel/fork.c | 10 | ||||
| -rw-r--r-- | kernel/perf_event.c | 2 | ||||
| -rw-r--r-- | kernel/posix-cpu-timers.c | 10 | ||||
| -rw-r--r-- | kernel/sched.c | 4 | ||||
| -rw-r--r-- | kernel/sched_rt.c | 5 | ||||
| -rw-r--r-- | kernel/signal.c | 2 | ||||
| -rw-r--r-- | kernel/sys.c | 3 | 
7 files changed, 20 insertions, 16 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index bab7b254ad3..b0ec34abc0b 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -828,6 +828,8 @@ void __cleanup_sighand(struct sighand_struct *sighand)   */  static void posix_cpu_timers_init_group(struct signal_struct *sig)  { +	unsigned long cpu_limit; +  	/* Thread group counters. */  	thread_group_cputime_init(sig); @@ -842,9 +844,9 @@ static void posix_cpu_timers_init_group(struct signal_struct *sig)  	sig->cputime_expires.virt_exp = cputime_zero;  	sig->cputime_expires.sched_exp = 0; -	if (sig->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY) { -		sig->cputime_expires.prof_exp = -			secs_to_cputime(sig->rlim[RLIMIT_CPU].rlim_cur); +	cpu_limit = ACCESS_ONCE(sig->rlim[RLIMIT_CPU].rlim_cur); +	if (cpu_limit != RLIM_INFINITY) { +		sig->cputime_expires.prof_exp = secs_to_cputime(cpu_limit);  		sig->cputimer.running = 1;  	} @@ -1037,7 +1039,7 @@ static struct task_struct *copy_process(unsigned long clone_flags,  #endif  	retval = -EAGAIN;  	if (atomic_read(&p->real_cred->user->processes) >= -			p->signal->rlim[RLIMIT_NPROC].rlim_cur) { +			task_rlimit(p, RLIMIT_NPROC)) {  		if (!capable(CAP_SYS_ADMIN) && !capable(CAP_SYS_RESOURCE) &&  		    p->real_cred->user != INIT_USER)  			goto bad_fork_free; diff --git a/kernel/perf_event.c b/kernel/perf_event.c index a661e799186..8e352c756ba 100644 --- a/kernel/perf_event.c +++ b/kernel/perf_event.c @@ -2610,7 +2610,7 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)  	if (user_locked > user_lock_limit)  		extra = user_locked - user_lock_limit; -	lock_limit = current->signal->rlim[RLIMIT_MEMLOCK].rlim_cur; +	lock_limit = rlimit(RLIMIT_MEMLOCK);  	lock_limit >>= PAGE_SHIFT;  	locked = vma->vm_mm->locked_vm + extra; diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index dbb16bf15c4..1a22dfd42df 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c @@ -1031,9 +1031,10 @@ static void check_thread_timers(struct task_struct *tsk,  	/*  	 * Check for the special case thread timers.  	 */ -	soft = sig->rlim[RLIMIT_RTTIME].rlim_cur; +	soft = ACCESS_ONCE(sig->rlim[RLIMIT_RTTIME].rlim_cur);  	if (soft != RLIM_INFINITY) { -		unsigned long hard = sig->rlim[RLIMIT_RTTIME].rlim_max; +		unsigned long hard = +			ACCESS_ONCE(sig->rlim[RLIMIT_RTTIME].rlim_max);  		if (hard != RLIM_INFINITY &&  		    tsk->rt.timeout > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) { @@ -1194,10 +1195,11 @@ static void check_process_timers(struct task_struct *tsk,  			 SIGPROF);  	check_cpu_itimer(tsk, &sig->it[CPUCLOCK_VIRT], &virt_expires, utime,  			 SIGVTALRM); -	soft = sig->rlim[RLIMIT_CPU].rlim_cur; +	soft = ACCESS_ONCE(sig->rlim[RLIMIT_CPU].rlim_cur);  	if (soft != RLIM_INFINITY) {  		unsigned long psecs = cputime_to_secs(ptime); -		unsigned long hard = sig->rlim[RLIMIT_CPU].rlim_max; +		unsigned long hard = +			ACCESS_ONCE(sig->rlim[RLIMIT_CPU].rlim_max);  		cputime_t x;  		if (psecs >= hard) {  			/* diff --git a/kernel/sched.c b/kernel/sched.c index abb36b16b93..b47ceeec1a9 100644 --- a/kernel/sched.c +++ b/kernel/sched.c @@ -4353,7 +4353,7 @@ int can_nice(const struct task_struct *p, const int nice)  	/* convert nice value [19,-20] to rlimit style value [1,40] */  	int nice_rlim = 20 - nice; -	return (nice_rlim <= p->signal->rlim[RLIMIT_NICE].rlim_cur || +	return (nice_rlim <= task_rlimit(p, RLIMIT_NICE) ||  		capable(CAP_SYS_NICE));  } @@ -4530,7 +4530,7 @@ recheck:  			if (!lock_task_sighand(p, &flags))  				return -ESRCH; -			rlim_rtprio = p->signal->rlim[RLIMIT_RTPRIO].rlim_cur; +			rlim_rtprio = task_rlimit(p, RLIMIT_RTPRIO);  			unlock_task_sighand(p, &flags);  			/* can't set/change the rt policy */ diff --git a/kernel/sched_rt.c b/kernel/sched_rt.c index bf3e38fdbe6..5a6ed1f0990 100644 --- a/kernel/sched_rt.c +++ b/kernel/sched_rt.c @@ -1662,8 +1662,9 @@ static void watchdog(struct rq *rq, struct task_struct *p)  	if (!p->signal)  		return; -	soft = p->signal->rlim[RLIMIT_RTTIME].rlim_cur; -	hard = p->signal->rlim[RLIMIT_RTTIME].rlim_max; +	/* max may change after cur was read, this will be fixed next tick */ +	soft = task_rlimit(p, RLIMIT_RTTIME); +	hard = task_rlimit_max(p, RLIMIT_RTTIME);  	if (soft != RLIM_INFINITY) {  		unsigned long next; diff --git a/kernel/signal.c b/kernel/signal.c index 5bb9baffa4f..dbd7fe073c5 100644 --- a/kernel/signal.c +++ b/kernel/signal.c @@ -245,7 +245,7 @@ __sigqueue_alloc(int sig, struct task_struct *t, gfp_t flags, int override_rlimi  	if (override_rlimit ||  	    atomic_read(&user->sigpending) <= -			t->signal->rlim[RLIMIT_SIGPENDING].rlim_cur) { +			task_rlimit(t, RLIMIT_SIGPENDING)) {  		q = kmem_cache_alloc(sigqueue_cachep, flags);  	} else {  		print_dropped_signal(sig); diff --git a/kernel/sys.c b/kernel/sys.c index 877fe4f8e05..9814e43fb23 100644 --- a/kernel/sys.c +++ b/kernel/sys.c @@ -571,8 +571,7 @@ static int set_user(struct cred *new)  	if (!new_user)  		return -EAGAIN; -	if (atomic_read(&new_user->processes) >= -				current->signal->rlim[RLIMIT_NPROC].rlim_cur && +	if (atomic_read(&new_user->processes) >= rlimit(RLIMIT_NPROC) &&  			new_user != INIT_USER) {  		free_uid(new_user);  		return -EAGAIN;  |