aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--kernel/sched.c12
1 files changed, 10 insertions, 2 deletions
diff --git a/kernel/sched.c b/kernel/sched.c
index 1847a4456a2d..b4dab63c6dbd 100644
--- a/kernel/sched.c
+++ b/kernel/sched.c
@@ -1955,7 +1955,7 @@ static int move_tasks(runqueue_t *this_rq, int this_cpu, runqueue_t *busiest,
1955{ 1955{
1956 prio_array_t *array, *dst_array; 1956 prio_array_t *array, *dst_array;
1957 struct list_head *head, *curr; 1957 struct list_head *head, *curr;
1958 int idx, pulled = 0, pinned = 0; 1958 int idx, pulled = 0, pinned = 0, this_min_prio;
1959 long rem_load_move; 1959 long rem_load_move;
1960 task_t *tmp; 1960 task_t *tmp;
1961 1961
@@ -1964,6 +1964,7 @@ static int move_tasks(runqueue_t *this_rq, int this_cpu, runqueue_t *busiest,
1964 1964
1965 rem_load_move = max_load_move; 1965 rem_load_move = max_load_move;
1966 pinned = 1; 1966 pinned = 1;
1967 this_min_prio = this_rq->curr->prio;
1967 1968
1968 /* 1969 /*
1969 * We first consider expired tasks. Those will likely not be 1970 * We first consider expired tasks. Those will likely not be
@@ -2003,7 +2004,12 @@ skip_queue:
2003 2004
2004 curr = curr->prev; 2005 curr = curr->prev;
2005 2006
2006 if (tmp->load_weight > rem_load_move || 2007 /*
2008 * To help distribute high priority tasks accross CPUs we don't
2009 * skip a task if it will be the highest priority task (i.e. smallest
2010 * prio value) on its new queue regardless of its load weight
2011 */
2012 if ((idx >= this_min_prio && tmp->load_weight > rem_load_move) ||
2007 !can_migrate_task(tmp, busiest, this_cpu, sd, idle, &pinned)) { 2013 !can_migrate_task(tmp, busiest, this_cpu, sd, idle, &pinned)) {
2008 if (curr != head) 2014 if (curr != head)
2009 goto skip_queue; 2015 goto skip_queue;
@@ -2025,6 +2031,8 @@ skip_queue:
2025 * and the prescribed amount of weighted load. 2031 * and the prescribed amount of weighted load.
2026 */ 2032 */
2027 if (pulled < max_nr_move && rem_load_move > 0) { 2033 if (pulled < max_nr_move && rem_load_move > 0) {
2034 if (idx < this_min_prio)
2035 this_min_prio = idx;
2028 if (curr != head) 2036 if (curr != head)
2029 goto skip_queue; 2037 goto skip_queue;
2030 idx++; 2038 idx++;