On Fri, 2013-02-08 at 12:11 +0100, Vincent Guittot wrote:
When a RT task is scheduled on an idle CPU, the update of the rq's load is not done because CFS's functions are not called. Then, the idle_balance, which is called just before entering the idle function, updates the rq's load and makes the assumption that the elapsed time since the last update, was only running time.
The rq's load of a CPU that only runs a periodic RT task, is close to LOAD_AVG_MAX whatever the running duration of the RT task is.
A new idle_exit function is called when the prev task is the idle function so the elapsed time will be accounted as idle time in the rq's load.
Signed-off-by: Vincent Guittot vincent.guittot@linaro.org
kernel/sched/core.c | 3 +++ kernel/sched/fair.c | 10 ++++++++++ kernel/sched/sched.h | 5 +++++ 3 files changed, 18 insertions(+)
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 26058d0..592e06c 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -2927,6 +2927,9 @@ need_resched: pre_schedule(rq, prev);
- if (unlikely(prev == rq->idle))
idle_exit(cpu, rq);
Let's get rid of the added junk in the core code that should be isolated in the idle code.
I posted these patches before, and I'm about to post again:
https://lkml.org/lkml/2012/12/21/378 https://lkml.org/lkml/2012/12/21/377
I'm working to clean these patches up today and post them again. Would working on top of these work for you?
-- Steve
if (unlikely(!rq->nr_running)) idle_balance(cpu, rq);