diff --git a/kernel/sched/proc.c b/kernel/sched/proc.c index 16f5a30f9c88..b672d78160cf 100644 --- a/kernel/sched/proc.c +++ b/kernel/sched/proc.c @@ -104,10 +104,13 @@ long calc_load_fold_active(struct rq *this_rq) static unsigned long calc_load(unsigned long load, unsigned long exp, unsigned long active) { - load *= exp; - load += active * (FIXED_1 - exp); - load += 1UL << (FSHIFT - 1); - return load >> FSHIFT; + unsigned long newload; + + newload = load * exp + active * (FIXED_1 - exp); + if (active >= load) + newload += FIXED_1-1; + + return newload / FIXED_1; } #ifdef CONFIG_NO_HZ_COMMON