aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched.c')
-rw-r--r--kernel/sched.c26
1 files changed, 11 insertions, 15 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 85b93118d244..1fa07c14624e 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -745,8 +745,7 @@ static int balance_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest,
745 unsigned long max_nr_move, unsigned long max_load_move, 745 unsigned long max_nr_move, unsigned long max_load_move,
746 struct sched_domain *sd, enum cpu_idle_type idle, 746 struct sched_domain *sd, enum cpu_idle_type idle,
747 int *all_pinned, unsigned long *load_moved, 747 int *all_pinned, unsigned long *load_moved,
748 int this_best_prio, int best_prio, int best_prio_seen, 748 int *this_best_prio, struct rq_iterator *iterator);
749 struct rq_iterator *iterator);
750 749
751#include "sched_stats.h" 750#include "sched_stats.h"
752#include "sched_rt.c" 751#include "sched_rt.c"
@@ -2165,8 +2164,7 @@ static int balance_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest,
2165 unsigned long max_nr_move, unsigned long max_load_move, 2164 unsigned long max_nr_move, unsigned long max_load_move,
2166 struct sched_domain *sd, enum cpu_idle_type idle, 2165 struct sched_domain *sd, enum cpu_idle_type idle,
2167 int *all_pinned, unsigned long *load_moved, 2166 int *all_pinned, unsigned long *load_moved,
2168 int this_best_prio, int best_prio, int best_prio_seen, 2167 int *this_best_prio, struct rq_iterator *iterator)
2169 struct rq_iterator *iterator)
2170{ 2168{
2171 int pulled = 0, pinned = 0, skip_for_load; 2169 int pulled = 0, pinned = 0, skip_for_load;
2172 struct task_struct *p; 2170 struct task_struct *p;
@@ -2191,12 +2189,8 @@ next:
2191 */ 2189 */
2192 skip_for_load = (p->se.load.weight >> 1) > rem_load_move + 2190 skip_for_load = (p->se.load.weight >> 1) > rem_load_move +
2193 SCHED_LOAD_SCALE_FUZZ; 2191 SCHED_LOAD_SCALE_FUZZ;
2194 if (skip_for_load && p->prio < this_best_prio) 2192 if ((skip_for_load && p->prio >= *this_best_prio) ||
2195 skip_for_load = !best_prio_seen && p->prio == best_prio;
2196 if (skip_for_load ||
2197 !can_migrate_task(p, busiest, this_cpu, sd, idle, &pinned)) { 2193 !can_migrate_task(p, busiest, this_cpu, sd, idle, &pinned)) {
2198
2199 best_prio_seen |= p->prio == best_prio;
2200 p = iterator->next(iterator->arg); 2194 p = iterator->next(iterator->arg);
2201 goto next; 2195 goto next;
2202 } 2196 }
@@ -2210,8 +2204,8 @@ next:
2210 * and the prescribed amount of weighted load. 2204 * and the prescribed amount of weighted load.
2211 */ 2205 */
2212 if (pulled < max_nr_move && rem_load_move > 0) { 2206 if (pulled < max_nr_move && rem_load_move > 0) {
2213 if (p->prio < this_best_prio) 2207 if (p->prio < *this_best_prio)
2214 this_best_prio = p->prio; 2208 *this_best_prio = p->prio;
2215 p = iterator->next(iterator->arg); 2209 p = iterator->next(iterator->arg);
2216 goto next; 2210 goto next;
2217 } 2211 }
@@ -2243,12 +2237,13 @@ static int move_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest,
2243{ 2237{
2244 struct sched_class *class = sched_class_highest; 2238 struct sched_class *class = sched_class_highest;
2245 unsigned long total_load_moved = 0; 2239 unsigned long total_load_moved = 0;
2240 int this_best_prio = this_rq->curr->prio;
2246 2241
2247 do { 2242 do {
2248 total_load_moved += 2243 total_load_moved +=
2249 class->load_balance(this_rq, this_cpu, busiest, 2244 class->load_balance(this_rq, this_cpu, busiest,
2250 ULONG_MAX, max_load_move - total_load_moved, 2245 ULONG_MAX, max_load_move - total_load_moved,
2251 sd, idle, all_pinned); 2246 sd, idle, all_pinned, &this_best_prio);
2252 class = class->next; 2247 class = class->next;
2253 } while (class && max_load_move > total_load_moved); 2248 } while (class && max_load_move > total_load_moved);
2254 2249
@@ -2266,10 +2261,12 @@ static int move_one_task(struct rq *this_rq, int this_cpu, struct rq *busiest,
2266 struct sched_domain *sd, enum cpu_idle_type idle) 2261 struct sched_domain *sd, enum cpu_idle_type idle)
2267{ 2262{
2268 struct sched_class *class; 2263 struct sched_class *class;
2264 int this_best_prio = MAX_PRIO;
2269 2265
2270 for (class = sched_class_highest; class; class = class->next) 2266 for (class = sched_class_highest; class; class = class->next)
2271 if (class->load_balance(this_rq, this_cpu, busiest, 2267 if (class->load_balance(this_rq, this_cpu, busiest,
2272 1, ULONG_MAX, sd, idle, NULL)) 2268 1, ULONG_MAX, sd, idle, NULL,
2269 &this_best_prio))
2273 return 1; 2270 return 1;
2274 2271
2275 return 0; 2272 return 0;
@@ -3184,8 +3181,7 @@ static int balance_tasks(struct rq *this_rq, int this_cpu, struct rq *busiest,
3184 unsigned long max_nr_move, unsigned long max_load_move, 3181 unsigned long max_nr_move, unsigned long max_load_move,
3185 struct sched_domain *sd, enum cpu_idle_type idle, 3182 struct sched_domain *sd, enum cpu_idle_type idle,
3186 int *all_pinned, unsigned long *load_moved, 3183 int *all_pinned, unsigned long *load_moved,
3187 int this_best_prio, int best_prio, int best_prio_seen, 3184 int *this_best_prio, struct rq_iterator *iterator)
3188 struct rq_iterator *iterator)
3189{ 3185{
3190 *load_moved = 0; 3186 *load_moved = 0;
3191 3187