aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 0a3e748d737d..0a4a26b21f69 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -2774,14 +2774,28 @@ out_balanced:
2774static void idle_balance(int this_cpu, struct rq *this_rq) 2774static void idle_balance(int this_cpu, struct rq *this_rq)
2775{ 2775{
2776 struct sched_domain *sd; 2776 struct sched_domain *sd;
2777 int pulled_task = 0;
2778 unsigned long next_balance = jiffies + 60 * HZ;
2777 2779
2778 for_each_domain(this_cpu, sd) { 2780 for_each_domain(this_cpu, sd) {
2779 if (sd->flags & SD_BALANCE_NEWIDLE) { 2781 if (sd->flags & SD_BALANCE_NEWIDLE) {
2780 /* If we've pulled tasks over stop searching: */ 2782 /* If we've pulled tasks over stop searching: */
2781 if (load_balance_newidle(this_cpu, this_rq, sd)) 2783 pulled_task = load_balance_newidle(this_cpu,
2784 this_rq, sd);
2785 if (time_after(next_balance,
2786 sd->last_balance + sd->balance_interval))
2787 next_balance = sd->last_balance
2788 + sd->balance_interval;
2789 if (pulled_task)
2782 break; 2790 break;
2783 } 2791 }
2784 } 2792 }
2793 if (!pulled_task)
2794 /*
2795 * We are going idle. next_balance may be set based on
2796 * a busy processor. So reset next_balance.
2797 */
2798 this_rq->next_balance = next_balance;
2785} 2799}
2786 2800
2787/* 2801/*
@@ -2904,7 +2918,7 @@ static void run_rebalance_domains(struct softirq_action *h)
2904 */ 2918 */
2905 idle = NOT_IDLE; 2919 idle = NOT_IDLE;
2906 } 2920 }
2907 sd->last_balance += interval; 2921 sd->last_balance = jiffies;
2908 } 2922 }
2909 if (time_after(next_balance, sd->last_balance + interval)) 2923 if (time_after(next_balance, sd->last_balance + interval))
2910 next_balance = sd->last_balance + interval; 2924 next_balance = sd->last_balance + interval;