Messages in this thread | | | Subject | Re: [patch] sched/cputime: Fix NO_HZ_FULL getrusage() monotonicity regression | From | Mike Galbraith <> | Date | Mon, 15 Aug 2016 14:29:25 +0200 |
| |
On Mon, 2016-08-15 at 10:51 +0200, Peter Zijlstra wrote: > On Wed, Aug 10, 2016 at 08:57:28PM +0200, Mike Galbraith wrote: > > > > +> > > > /* > > +> > > > * sum_exec_runtime has moved, but nothing has yet been > > +> > > > * accounted to the task, there's nothing to update. > > +> > > > */ > > +> > > > if (utime + stime == 0) > > +> > > > > > goto out; > > urgh... > > Valid scenario.. not sure about the solution though. This would mean the > task has _no_ running time if it forever dodges the tick, which would be > bad. > > Does something like so cure things too?
Yeah, it's a happy camper.
> --- > kernel/sched/cputime.c | 15 ++++++++++----- > 1 file changed, 10 insertions(+), 5 deletions(-) > > diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c > index 9858266fb0b3..2ee83b200504 100644 > --- a/kernel/sched/cputime.c > +++ b/kernel/sched/cputime.c > @@ -614,19 +614,25 @@ static void cputime_adjust(struct task_cputime *curr, > > > stime = curr->stime; > > > utime = curr->utime; > > -> > if (utime == 0) { > -> > > stime = rtime; > +> > /* > +> > * If either stime or both stime and utime are 0, assume all runtime is > +> > * userspace. Once a task gets some ticks, the monotonicy code at > +> > * 'update' will ensure things converge to the observed ratio. > +> > */ > +> > if (stime == 0) { > +> > > utime = rtime; > > > > goto update; > > > } > > -> > if (stime == 0) { > -> > > utime = rtime; > +> > if (utime == 0) { > +> > > stime = rtime; > > > > goto update; > > > } > > > > stime = scale_stime((__force u64)stime, (__force u64)rtime, > > > > > (__force u64)(stime + utime)); > > +update: > > > /* > > > * Make sure stime doesn't go backwards; this preserves monotonicity > > > * for utime because rtime is monotonic. > @@ -649,7 +655,6 @@ static void cputime_adjust(struct task_cputime *curr, > > > > stime = rtime - utime; > > > } > > -update: > > > prev->stime = stime; > > > prev->utime = utime; > out:
| |