Message ID | 1390282399-17091-1-git-send-email-alex.shi@linaro.org |
---|---|
State | New |
Headers | show |
On 01/21/2014 01:33 PM, Alex Shi wrote: > rq->avg_idle try to reflect the average idle time between the cpu idle > and first wakeup. But in the function, it maybe get a negative value > if old avg_idle is too small. Then this negative value will be double > counted in next time calculation. Guess that is not the original purpose, > so recalibrate it to zero. Forget this patch, the avg_idle is impossible to get negative. Sorry for noise!
On 01/21/2014 02:49 PM, Michael wang wrote: > This seems like won't happen... > > if 'diff' is negative, it's absolute value won't bigger than '*avg', not > to mention we only use 1/8 of it. That's why I said 'sorry and forget this patch'. :(
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 30eb011..af9121c6 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -1358,6 +1358,9 @@ static void update_avg(u64 *avg, u64 sample) { s64 diff = sample - *avg; *avg += diff >> 3; + + if (*avg < 0) + *avg = 0; } #endif
rq->avg_idle try to reflect the average idle time between the cpu idle and first wakeup. But in the function, it maybe get a negative value if old avg_idle is too small. Then this negative value will be double counted in next time calculation. Guess that is not the original purpose, so recalibrate it to zero. Signed-off-by: Alex Shi <alex.shi@linaro.org> --- kernel/sched/core.c | 3 +++ 1 file changed, 3 insertions(+)