diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 26 |
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 | ||