diff mbox

[RFC,1/2] sched/update_avg: avoid negative time

Message ID 1390282399-17091-1-git-send-email-alex.shi@linaro.org
State New
Headers show

Commit Message

Alex Shi Jan. 21, 2014, 5:33 a.m. UTC
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(+)

Comments

Alex Shi Jan. 21, 2014, 5:59 a.m. UTC | #1
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!
Alex Shi Jan. 21, 2014, 8:46 a.m. UTC | #2
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 mbox

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