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 <[email protected]>
Tested-by: Sergey Senozhatsky <[email protected]>

        -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;
>       }
>  
>       /*
> 
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to