diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 18 |
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: | |||
2774 | static void idle_balance(int this_cpu, struct rq *this_rq) | 2774 | static 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; |