Messages in this thread | | | Date | Tue, 3 Sep 2013 21:09:12 +0300 | From | Sergey Senozhatsky <> | Subject | Re: [sched next] overflowed cpu time for kernel threads in /proc/PID/stat |
| |
On (09/03/13 10:43), Stanislaw Gruszka wrote: > Ok, I see now, utime is 0 . This seems to be problem with dynamic ticks > as you told that your application is kernel compilation, so we utilize > lot of cpu time in user-space. > > Anyway we should handle utime == 0 situation on scaling code. We work > well when rtime & stime are not big (variables and results fit in > 32 bit), otherwise we have that stime bigger than rtime problem. Let's > try to handle the problem by below patch. Sergey, does it work for you ?
checked on -current and -next -- works fine, good job.
here are my: Reported-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com> Tested-by: Sergey Senozhatsky <sergey.senozhatsky@gmail.com>
-ss
> diff --git a/kernel/sched/cputime.c b/kernel/sched/cputime.c > index a7959e0..25cc35d 100644 > --- a/kernel/sched/cputime.c > +++ b/kernel/sched/cputime.c > @@ -557,7 +557,7 @@ static void cputime_adjust(struct task_cputime *curr, > struct cputime *prev, > cputime_t *ut, cputime_t *st) > { > - cputime_t rtime, stime, utime, total; > + cputime_t rtime, stime, utime; > > if (vtime_accounting_enabled()) { > *ut = curr->utime; > @@ -565,9 +565,6 @@ static void cputime_adjust(struct task_cputime *curr, > return; > } > > - stime = curr->stime; > - total = stime + curr->utime; > - > /* > * Tick based cputime accounting depend on random scheduling > * timeslices of a task to be interrupted or not by the timer. > @@ -588,13 +585,19 @@ static void cputime_adjust(struct task_cputime *curr, > if (prev->stime + prev->utime >= rtime) > goto out; > > - if (total) { > + stime = curr->stime; > + utime = curr->utime; > + > + if (utime == 0) { > + stime = rtime; > + } else if (stime == 0) { > + utime = rtime; > + } else { > + cputime_t total = stime + utime; > + > stime = scale_stime((__force u64)stime, > (__force u64)rtime, (__force u64)total); > utime = rtime - stime; > - } else { > - stime = rtime; > - utime = 0; > } > > /* >
| |