summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/sched.c8
-rw-r--r--kernel/sched_fair.c4
2 files changed, 7 insertions, 5 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 9e49af00ae3e..7bc9b0e84eb3 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -644,7 +644,7 @@ struct rq {
644 644
645 unsigned long cpu_power; 645 unsigned long cpu_power;
646 646
647 unsigned char idle_at_tick; 647 unsigned char idle_balance;
648 /* For active balancing */ 648 /* For active balancing */
649 int post_schedule; 649 int post_schedule;
650 int active_balance; 650 int active_balance;
@@ -2751,8 +2751,10 @@ void scheduler_ipi(void)
2751 /* 2751 /*
2752 * Check if someone kicked us for doing the nohz idle load balance. 2752 * Check if someone kicked us for doing the nohz idle load balance.
2753 */ 2753 */
2754 if (unlikely(got_nohz_idle_kick() && !need_resched())) 2754 if (unlikely(got_nohz_idle_kick() && !need_resched())) {
2755 this_rq()->idle_balance = 1;
2755 raise_softirq_irqoff(SCHED_SOFTIRQ); 2756 raise_softirq_irqoff(SCHED_SOFTIRQ);
2757 }
2756 irq_exit(); 2758 irq_exit();
2757} 2759}
2758 2760
@@ -4247,7 +4249,7 @@ void scheduler_tick(void)
4247 perf_event_task_tick(); 4249 perf_event_task_tick();
4248 4250
4249#ifdef CONFIG_SMP 4251#ifdef CONFIG_SMP
4250 rq->idle_at_tick = idle_cpu(cpu); 4252 rq->idle_balance = idle_cpu(cpu);
4251 trigger_load_balance(rq, cpu); 4253 trigger_load_balance(rq, cpu);
4252#endif 4254#endif
4253} 4255}
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index 6c5fa1099229..506db0966eb8 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -4676,7 +4676,7 @@ static inline int nohz_kick_needed(struct rq *rq, int cpu)
4676 if (time_before(now, nohz.next_balance)) 4676 if (time_before(now, nohz.next_balance))
4677 return 0; 4677 return 0;
4678 4678
4679 if (rq->idle_at_tick) 4679 if (idle_cpu(cpu))
4680 return 0; 4680 return 0;
4681 4681
4682 first_pick_cpu = atomic_read(&nohz.first_pick_cpu); 4682 first_pick_cpu = atomic_read(&nohz.first_pick_cpu);
@@ -4712,7 +4712,7 @@ static void run_rebalance_domains(struct softirq_action *h)
4712{ 4712{
4713 int this_cpu = smp_processor_id(); 4713 int this_cpu = smp_processor_id();
4714 struct rq *this_rq = cpu_rq(this_cpu); 4714 struct rq *this_rq = cpu_rq(this_cpu);
4715 enum cpu_idle_type idle = this_rq->idle_at_tick ? 4715 enum cpu_idle_type idle = this_rq->idle_balance ?
4716 CPU_IDLE : CPU_NOT_IDLE; 4716 CPU_IDLE : CPU_NOT_IDLE;
4717 4717
4718 rebalance_domains(this_cpu, idle); 4718 rebalance_domains(this_cpu, idle);