diff options
| author | Jiri Slaby <jslaby@suse.cz> | 2010-03-05 13:42:53 -0800 | 
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-03-06 11:26:32 -0800 | 
| commit | d4bb527438b4181cd3c564ae04dd344c381283a1 (patch) | |
| tree | 0e7afeb6b759f72b136d707db4e5725a92b0d777 /kernel/posix-cpu-timers.c | |
| parent | f3abd4f9531becb71626bd206955d47d5ea54f06 (diff) | |
| download | olio-linux-3.10-d4bb527438b4181cd3c564ae04dd344c381283a1.tar.xz olio-linux-3.10-d4bb527438b4181cd3c564ae04dd344c381283a1.zip | |
posix-cpu-timers: cleanup rlimits usage
Fetch rlimit (both hard and soft) values only once and work on them.  It
removes many accesses through sig structure and makes the code cleaner.
Mostly a preparation for writable resource limits support.
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: john stultz <johnstul@us.ibm.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'kernel/posix-cpu-timers.c')
| -rw-r--r-- | kernel/posix-cpu-timers.c | 32 | 
1 files changed, 17 insertions, 15 deletions
| diff --git a/kernel/posix-cpu-timers.c b/kernel/posix-cpu-timers.c index 438ff452351..dbb16bf15c4 100644 --- a/kernel/posix-cpu-timers.c +++ b/kernel/posix-cpu-timers.c @@ -982,6 +982,7 @@ static void check_thread_timers(struct task_struct *tsk,  	int maxfire;  	struct list_head *timers = tsk->cpu_timers;  	struct signal_struct *const sig = tsk->signal; +	unsigned long soft;  	maxfire = 20;  	tsk->cputime_expires.prof_exp = cputime_zero; @@ -1030,9 +1031,9 @@ static void check_thread_timers(struct task_struct *tsk,  	/*  	 * Check for the special case thread timers.  	 */ -	if (sig->rlim[RLIMIT_RTTIME].rlim_cur != RLIM_INFINITY) { +	soft = sig->rlim[RLIMIT_RTTIME].rlim_cur; +	if (soft != RLIM_INFINITY) {  		unsigned long hard = sig->rlim[RLIMIT_RTTIME].rlim_max; -		unsigned long *soft = &sig->rlim[RLIMIT_RTTIME].rlim_cur;  		if (hard != RLIM_INFINITY &&  		    tsk->rt.timeout > DIV_ROUND_UP(hard, USEC_PER_SEC/HZ)) { @@ -1043,14 +1044,13 @@ static void check_thread_timers(struct task_struct *tsk,  			__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);  			return;  		} -		if (tsk->rt.timeout > DIV_ROUND_UP(*soft, USEC_PER_SEC/HZ)) { +		if (tsk->rt.timeout > DIV_ROUND_UP(soft, USEC_PER_SEC/HZ)) {  			/*  			 * At the soft limit, send a SIGXCPU every second.  			 */ -			if (sig->rlim[RLIMIT_RTTIME].rlim_cur -			    < sig->rlim[RLIMIT_RTTIME].rlim_max) { -				sig->rlim[RLIMIT_RTTIME].rlim_cur += -								USEC_PER_SEC; +			if (soft < hard) { +				soft += USEC_PER_SEC; +				sig->rlim[RLIMIT_RTTIME].rlim_cur = soft;  			}  			printk(KERN_INFO  				"RT Watchdog Timeout: %s[%d]\n", @@ -1121,6 +1121,7 @@ static void check_process_timers(struct task_struct *tsk,  	unsigned long long sum_sched_runtime, sched_expires;  	struct list_head *timers = sig->cpu_timers;  	struct task_cputime cputime; +	unsigned long soft;  	/*  	 * Don't sample the current process CPU clocks if there are no timers. @@ -1193,11 +1194,12 @@ static void check_process_timers(struct task_struct *tsk,  			 SIGPROF);  	check_cpu_itimer(tsk, &sig->it[CPUCLOCK_VIRT], &virt_expires, utime,  			 SIGVTALRM); - -	if (sig->rlim[RLIMIT_CPU].rlim_cur != RLIM_INFINITY) { +	soft = 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;  		cputime_t x; -		if (psecs >= sig->rlim[RLIMIT_CPU].rlim_max) { +		if (psecs >= hard) {  			/*  			 * At the hard limit, we just die.  			 * No need to calculate anything else now. @@ -1205,17 +1207,17 @@ static void check_process_timers(struct task_struct *tsk,  			__group_send_sig_info(SIGKILL, SEND_SIG_PRIV, tsk);  			return;  		} -		if (psecs >= sig->rlim[RLIMIT_CPU].rlim_cur) { +		if (psecs >= soft) {  			/*  			 * At the soft limit, send a SIGXCPU every second.  			 */  			__group_send_sig_info(SIGXCPU, SEND_SIG_PRIV, tsk); -			if (sig->rlim[RLIMIT_CPU].rlim_cur -			    < sig->rlim[RLIMIT_CPU].rlim_max) { -				sig->rlim[RLIMIT_CPU].rlim_cur++; +			if (soft < hard) { +				soft++; +				sig->rlim[RLIMIT_CPU].rlim_cur = soft;  			}  		} -		x = secs_to_cputime(sig->rlim[RLIMIT_CPU].rlim_cur); +		x = secs_to_cputime(soft);  		if (cputime_eq(prof_expires, cputime_zero) ||  		    cputime_lt(x, prof_expires)) {  			prof_expires = x; |