Hi Michael,
On Sat, Oct 12, 2013 at 03:58:07AM +0100, Michael wang wrote:
Hi, Morten
On 10/12/2013 01:19 AM, Morten Rasmussen wrote: [snip]
@@ -5743,6 +5772,7 @@ static void run_rebalance_domains(struct softirq_action *h) */ nohz_idle_balance(this_cpu, idle);
- inc_cpu_capacity(this_cpu);
Just wondering is this check necessary here? if rq get more tasks during the balance, enqueue_task() should already do the check each time when we move_task(), isn't it?
True. enqueue_task() should do the necessary check when we move tasks. Hovewer, the cpu load may change over time without moving tasks if a task changes its behavior. A small task may enter a cpu intensive phase and grow bigger over time while staying on the rq due to the load tracking. That won't be noticed unless we check the cpuload periodically. That is the reason behind this check.
I will look at remove the redundant call to inc_cpu_capacity() when actually did move tasks. More work is needed on the policy for inc/dec_cpu_capacity(). I just added a few easy examples of how they can be used for this post.
Thanks, Morten
Regards, Michael Wang
power_late_callback(this_cpu); } diff --git a/kernel/sched/sched.h b/kernel/sched/sched.h index 907a967..88e7968 100644 --- a/kernel/sched/sched.h +++ b/kernel/sched/sched.h @@ -1367,8 +1367,26 @@ static inline u64 irq_time_read(int cpu) #ifdef CONFIG_SCHED_POWER extern void power_late_callback(int cpu); +extern int at_max_capacity(int cpu); +extern int go_faster(int cpu, int hint); +extern int go_slower(int cpu, int hint); #else static inline void power_late_callback(int cpu) { }
+static inline int at_max_capacity(int cpu) +{
- return 1;
+}
+static inline int go_faster(int cpu, int hint) +{
- return 0;
+}
+static inline int go_slower(int cpu, int hint) +{
- return 0;
+} #endif /* CONFIG_SCHED_POWER */