aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/sched_fair.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/sched_fair.c')
-rw-r--r--kernel/sched_fair.c48
1 files changed, 37 insertions, 11 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c
index 166ed6db60..9971831b56 100644
--- a/kernel/sched_fair.c
+++ b/kernel/sched_fair.c
@@ -876,6 +876,7 @@ static void put_prev_task_fair(struct rq *rq, struct task_struct *prev)
876 } 876 }
877} 877}
878 878
879#ifdef CONFIG_SMP
879/************************************************** 880/**************************************************
880 * Fair scheduling class load-balancing methods: 881 * Fair scheduling class load-balancing methods:
881 */ 882 */
@@ -936,12 +937,11 @@ static int cfs_rq_best_prio(struct cfs_rq *cfs_rq)
936 937
937static unsigned long 938static unsigned long
938load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest, 939load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest,
939 unsigned long max_nr_move, unsigned long max_load_move, 940 unsigned long max_load_move,
940 struct sched_domain *sd, enum cpu_idle_type idle, 941 struct sched_domain *sd, enum cpu_idle_type idle,
941 int *all_pinned, int *this_best_prio) 942 int *all_pinned, int *this_best_prio)
942{ 943{
943 struct cfs_rq *busy_cfs_rq; 944 struct cfs_rq *busy_cfs_rq;
944 unsigned long load_moved, total_nr_moved = 0, nr_moved;
945 long rem_load_move = max_load_move; 945 long rem_load_move = max_load_move;
946 struct rq_iterator cfs_rq_iterator; 946 struct rq_iterator cfs_rq_iterator;
947 947
@@ -969,25 +969,48 @@ load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest,
969#else 969#else
970# define maxload rem_load_move 970# define maxload rem_load_move
971#endif 971#endif
972 /* pass busy_cfs_rq argument into 972 /*
973 * pass busy_cfs_rq argument into
973 * load_balance_[start|next]_fair iterators 974 * load_balance_[start|next]_fair iterators
974 */ 975 */
975 cfs_rq_iterator.arg = busy_cfs_rq; 976 cfs_rq_iterator.arg = busy_cfs_rq;
976 nr_moved = balance_tasks(this_rq, this_cpu, busiest, 977 rem_load_move -= balance_tasks(this_rq, this_cpu, busiest,
977 max_nr_move, maxload, sd, idle, all_pinned, 978 maxload, sd, idle, all_pinned,
978 &load_moved, this_best_prio, &cfs_rq_iterator); 979 this_best_prio,
979 980 &cfs_rq_iterator);
980 total_nr_moved += nr_moved;
981 max_nr_move -= nr_moved;
982 rem_load_move -= load_moved;
983 981
984 if (max_nr_move <= 0 || rem_load_move <= 0) 982 if (rem_load_move <= 0)
985 break; 983 break;
986 } 984 }
987 985
988 return max_load_move - rem_load_move; 986 return max_load_move - rem_load_move;
989} 987}
990 988
989static int
990move_one_task_fair(struct rq *this_rq, int this_cpu, struct rq *busiest,
991 struct sched_domain *sd, enum cpu_idle_type idle)
992{
993 struct cfs_rq *busy_cfs_rq;
994 struct rq_iterator cfs_rq_iterator;
995
996 cfs_rq_iterator.start = load_balance_start_fair;
997 cfs_rq_iterator.next = load_balance_next_fair;
998
999 for_each_leaf_cfs_rq(busiest, busy_cfs_rq) {
1000 /*
1001 * pass busy_cfs_rq argument into
1002 * load_balance_[start|next]_fair iterators
1003 */
1004 cfs_rq_iterator.arg = busy_cfs_rq;
1005 if (iter_move_one_task(this_rq, this_cpu, busiest, sd, idle,
1006 &cfs_rq_iterator))
1007 return 1;
1008 }
1009
1010 return 0;
1011}
1012#endif
1013
991/* 1014/*
992 * scheduler tick hitting a task of our scheduling class: 1015 * scheduler tick hitting a task of our scheduling class:
993 */ 1016 */
@@ -1063,7 +1086,10 @@ static const struct sched_class fair_sched_class = {
1063 .pick_next_task = pick_next_task_fair, 1086 .pick_next_task = pick_next_task_fair,
1064 .put_prev_task = put_prev_task_fair, 1087 .put_prev_task = put_prev_task_fair,
1065 1088
1089#ifdef CONFIG_SMP
1066 .load_balance = load_balance_fair, 1090 .load_balance = load_balance_fair,
1091 .move_one_task = move_one_task_fair,
1092#endif
1067 1093
1068 .set_curr_task = set_curr_task_fair, 1094 .set_curr_task = set_curr_task_fair,
1069 .task_tick = task_tick_fair, 1095 .task_tick = task_tick_fair,