diff options
Diffstat (limited to 'kernel/sched_fair.c')
-rw-r--r-- | kernel/sched_fair.c | 48 |
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 | ||
937 | static unsigned long | 938 | static unsigned long |
938 | load_balance_fair(struct rq *this_rq, int this_cpu, struct rq *busiest, | 939 | load_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 | ||
989 | static int | ||
990 | move_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, |