diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 13 | 
1 files changed, 9 insertions, 4 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index 989c7c202b3..b9e2edd0072 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -800,6 +800,12 @@ 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); +		sig->cputimer.running = 1; +	} +  	/* The timer lists. */  	INIT_LIST_HEAD(&sig->cpu_timers[0]);  	INIT_LIST_HEAD(&sig->cpu_timers[1]); @@ -815,11 +821,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)  		atomic_inc(¤t->signal->live);  		return 0;  	} -	sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL); - -	if (sig) -		posix_cpu_timers_init_group(sig); +	sig = kmem_cache_alloc(signal_cachep, GFP_KERNEL);  	tsk->signal = sig;  	if (!sig)  		return -ENOMEM; @@ -859,6 +862,8 @@ static int copy_signal(unsigned long clone_flags, struct task_struct *tsk)  	memcpy(sig->rlim, current->signal->rlim, sizeof sig->rlim);  	task_unlock(current->group_leader); +	posix_cpu_timers_init_group(sig); +  	acct_init_pacct(&sig->pacct);  	tty_audit_fork(sig);  |