diff options
author | Ingo Molnar <mingo@kernel.org> | 2013-06-19 12:55:31 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2013-06-19 12:55:31 +0200 |
commit | d81344c50824a4d28a9397e97135d60075ac37ff (patch) | |
tree | d25c443fb4a764cd788db857c49dd3d3f8f722d3 /kernel/sched | |
parent | 0de358f1c2642710d41190b73fbc295e675c4ab8 (diff) | |
parent | 29bb9e5a75684106a37593ad75ec75ff8312731b (diff) | |
download | linux-d81344c50824a4d28a9397e97135d60075ac37ff.tar.gz linux-d81344c50824a4d28a9397e97135d60075ac37ff.tar.bz2 linux-d81344c50824a4d28a9397e97135d60075ac37ff.zip |
Merge branch 'sched/urgent' into sched/core
Merge in fixes before applying ongoing new work.
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'kernel/sched')
-rw-r--r-- | kernel/sched/core.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/kernel/sched/core.c b/kernel/sched/core.c index 36f85be2932b..d8f071cc9f51 100644 --- a/kernel/sched/core.c +++ b/kernel/sched/core.c @@ -633,7 +633,19 @@ void wake_up_nohz_cpu(int cpu) static inline bool got_nohz_idle_kick(void) { int cpu = smp_processor_id(); - return idle_cpu(cpu) && test_bit(NOHZ_BALANCE_KICK, nohz_flags(cpu)); + + if (!test_bit(NOHZ_BALANCE_KICK, nohz_flags(cpu))) + return false; + + if (idle_cpu(cpu) && !need_resched()) + return true; + + /* + * We can't run Idle Load Balance on this CPU for this time so we + * cancel it and clear NOHZ_BALANCE_KICK + */ + clear_bit(NOHZ_BALANCE_KICK, nohz_flags(cpu)); + return false; } #else /* CONFIG_NO_HZ_COMMON */ @@ -1395,8 +1407,9 @@ static void sched_ttwu_pending(void) void scheduler_ipi(void) { - if (llist_empty(&this_rq()->wake_list) && !got_nohz_idle_kick() - && !tick_nohz_full_cpu(smp_processor_id())) + if (llist_empty(&this_rq()->wake_list) + && !tick_nohz_full_cpu(smp_processor_id()) + && !got_nohz_idle_kick()) return; /* @@ -1419,7 +1432,7 @@ void scheduler_ipi(void) /* * Check if someone kicked us for doing the nohz idle load balance. */ - if (unlikely(got_nohz_idle_kick() && !need_resched())) { + if (unlikely(got_nohz_idle_kick())) { this_rq()->idle_balance = 1; raise_softirq_irqoff(SCHED_SOFTIRQ); } |