Hi Brendan,
On 23 October 2017 at 15:32, Brendan Jackman brendan.jackman@arm.com wrote:
By moving the call to update_blocked_averages outside of rebalance_domains, we can avoid the use of CPU_MAX_IDLE_TYPES as a marker for aborting the load balance.
Vincent, if you agree with this I'll squash it into the parent before posting to LKML
Looks good to me
Vincent
kernel/sched/fair.c | 36 ++++++++++++------------------------ 1 file changed, 12 insertions(+), 24 deletions(-)
diff --git a/kernel/sched/fair.c b/kernel/sched/fair.c index cf27fa6548af..9085caf49c76 100644 --- a/kernel/sched/fair.c +++ b/kernel/sched/fair.c @@ -8816,19 +8816,6 @@ static void rebalance_domains(struct rq *rq, enum cpu_idle_type idle) int need_serialize, need_decay = 0; u64 max_cost = 0;
update_blocked_averages(cpu);-#ifdef CONFIG_NO_HZ_COMMON
if ((idle == CPU_MAX_IDLE_TYPES) ||test_bit(NOHZ_STATS_KICK, nohz_flags(cpu))) {/** We only want to update blocked load and shares which has* just been done above*/return;}-#endif
rcu_read_lock(); for_each_domain(cpu, sd) { /*@@ -8954,15 +8941,6 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle) nohz.next_update = jiffies + msecs_to_jiffies(LOAD_AVG_PERIOD); rcu_read_unlock();
/** This idle load balance softirq has been triggered only to update the* blocked load and shares of ilde CPUs. Set the idle state to an* undefined state to the load balance will be aborted just after the* update of blocked load*/if (test_bit(NOHZ_STATS_KICK, nohz_flags(this_cpu)))idle = CPU_MAX_IDLE_TYPES;for_each_cpu(balance_cpu, nohz.idle_cpus_mask) { if (balance_cpu == this_cpu || !idle_cpu(balance_cpu)) continue;@@ -8989,7 +8967,15 @@ static void nohz_idle_balance(struct rq *this_rq, enum cpu_idle_type idle) cpu_load_update_idle(rq); rq_unlock_irq(rq, &rf);
rebalance_domains(rq, idle);
update_blocked_averages(balance_cpu);/** This idle load balance softirq may have been* triggered only to update the blocked load and shares* of idle CPUs (which we have just done for* balance_cpu). In that case skip the actual balance.*/if (!test_bit(NOHZ_STATS_KICK, nohz_flags(this_cpu)))rebalance_domains(rq, idle); } if (time_after(next_balance, rq->next_balance)) {@@ -9123,7 +9109,9 @@ static __latent_entropy void run_rebalance_domains(struct softirq_action *h) * and abort nohz_idle_balance altogether if we pull some load. */ nohz_idle_balance(this_rq, idle);
rebalance_domains(this_rq, idle);
update_blocked_averages(this_rq->cpu);if (!test_bit(NOHZ_STATS_KICK, nohz_flags(this_rq->cpu)))rebalance_domains(this_rq, idle);#ifdef CONFIG_NO_HZ_COMMON clear_bit(NOHZ_STATS_KICK, nohz_flags(this_rq->cpu));
#endif
2.14.1