Messages in this thread | | | Subject | Re: [PATCH] posix-cpu-timers: clock_gettime(CLOCK_*_CPUTIME_ID) goes backward | From | Peter Zijlstra <> | Date | Fri, 26 Dec 2008 10:02:51 +0100 |
| |
On Fri, 2008-12-26 at 09:43 +0100, Ingo Molnar wrote: > * Hidetoshi Seto <seto.hidetoshi@jp.fujitsu.com> wrote: > > > @@ -321,7 +287,7 @@ static int cpu_clock_sample_group(const clockid_t which_clock, > > cpu->cpu = cputime.utime; > > break; > > case CPUCLOCK_SCHED: > > - cpu->sched = cputime.sum_exec_runtime + task_delta_exec(p); > > + cpu->sched = cputime.sum_exec_runtime; > > break; > > } > > hm, doesnt this regress precision?
No, he folds it into:
> +void thread_group_cputime(struct task_struct *p, struct task_cputime *times) > +{ > + unsigned long flags; > + struct rq *rq; > + u64 delta_exec = 0; > + struct task_cputime *tot; > + struct signal_struct *sig; > + int i; > + > + sig = p->signal; > + if (unlikely(!sig) || !sig->cputime.totals) { > + times->utime = p->utime; > + times->stime = p->stime; > + times->sum_exec_runtime = task_total_exec(p); > + return; > + } > + > + times->stime = times->utime = cputime_zero; > + times->sum_exec_runtime = 0; > + > + rq = task_rq_lock(p, &flags); > + > + if (task_current(rq, p)) { > + update_rq_clock(rq); > + delta_exec = rq->clock - p->se.exec_start; > + if ((s64)delta_exec < 0) > + delta_exec = 0; > + } > + > + for_each_possible_cpu(i) { > + tot = per_cpu_ptr(p->signal->cputime.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; > + } > + times->sum_exec_runtime += delta_exec; > + > + task_rq_unlock(rq, &flags); > +}
Which reminds me, why do we still have this crap in the kernel? I thought we pretty much showed the per-cpu itimer thing was utter crap? -- can we pretty please either revert that or apply http://lkml.org/lkml/2008/11/24/183 ?
Also, I really don't like the above, we now do the per-cpu loop with the RQ lock held...
| |