Re: [kernel-sched-cputime] question about probable bug in cputime_adjust()

From: Frans Klaver
Date: Thu Jun 29 2017 - 00:51:31 EST




On 29 June 2017 01:57:19 CEST, "Gustavo A. R. Silva" <garsilva@xxxxxxxxxxxxxx> wrote:
>>>> --- a/kernel/sched/cputime.c
>>>> +++ b/kernel/sched/cputime.c
>>>> @@ -637,9 +637,10 @@ static void cputime_adjust(struct task_cputime
>*curr,
>>>> * = (rtime_i+1 - rtime_i) + utime_i
>>>> * >= utime_i
>>>> */
>>>> - if (stime < prev->stime)
>>>> + if (stime < prev->stime) {
>>>> stime = prev->stime;
>>>> - utime = rtime - stime;
>>>> + utime = rtime - stime;
>>>> + }
>>>>
>>>>
>>>> If you confirm this, I will send a patch in a full and proper form.
>>>>
>>>> I'd really appreciate your comments.
>>>
>>> If you do that, how would you meet the guarantee made in line 583?
>>>
>
>You are right, I see now.
>
>Then in this case the following patch would be the way to go:
>
>--- a/kernel/sched/cputime.c
>+++ b/kernel/sched/cputime.c
>@@ -615,10 +615,8 @@ static void cputime_adjust(struct task_cputime
>*curr,
> * 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;
>+ if (stime == 0)
> goto update;
>- }
>
> if (utime == 0) {
> stime = rtime;
>
>
>but I think this one is even better:
>
>
>--- a/kernel/sched/cputime.c
>+++ b/kernel/sched/cputime.c
>@@ -615,19 +615,11 @@ static void cputime_adjust(struct task_cputime
>*curr,
> * 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 (utime == 0) {
>+ if (stime != 0 && utime == 0)
> stime = rtime;
>- goto update;
>- }
>-
>- stime = scale_stime(stime, rtime, stime + utime);
>+ else
>+ stime = scale_stime(stime, rtime, stime + utime);

I don't think it is better. The stime == 0 case is gone now. So scale_time() will be called in that case. This whole if/else block should only be executed if stime != 0.