thread_group_cputime: kill the bogus ->signal != NULL check
PATCH 3/3 thread_group_cputime: kill the bogus ->signal != NULL check
thread_group_cputime() is called by current when it must have the valid ->signal, or under ->siglock, or under tasklist_lock after the ->signal check, or the caller is wait_task_zombie() which reaps the child. In any case ->signal can't be NULL.
But the point of this patch is not optimization. If it is possible to call thread_group_cputime() when ->signal == NULL we are doing something wrong, and we should not mask the problem. thread_group_cputime() fills *times and the caller will use it, if we silently use task_struct->*times* we report the wrong values.
Signed-off-by Oleg Nesterov <[email protected]>
kernel/posix-cpu-timers.c renamed from kernel/posix-cpu-timers.c~TGTIME_KILL_CK_SIG +5 -5
@@ -58,21 +58,21 @@ void thread_group_cputime(struct task_struct *tsk, struct task_cputime *times) { - struct signal_struct *sig; + struct task_cputime *totals, *tot;int i; -struct task_cputime *tot; - sig = tsk->signal; -if (unlikely (!sig) || !sig->cputime.totals) { + totals = tsk->signal->cputime.totals; +if (!totals) { times->utime = tsk->utime; times->stime = tsk->stime; times->sum_exec_runtime = tsk->se.sum_exec_runtime;return ; } + times->stime = times->utime = cputime_zero; times->sum_exec_runtime =0 ;for_each_possible_cpu (i) { - tot =per_cpu_ptr (tsk->signal->cputime.totals, i); + tot =per_cpu_ptr (totals, i); times->utime =cputime_add (times->utime, tot->utime); times->stime =cputime_add (times->stime, tot->stime); times->sum_exec_runtime += tot->sum_exec_runtime;