diff options
Diffstat (limited to 'kernel/sched.c')
-rw-r--r-- | kernel/sched.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/kernel/sched.c b/kernel/sched.c index ef748e691608..bac23fb418f6 100644 --- a/kernel/sched.c +++ b/kernel/sched.c | |||
@@ -966,8 +966,11 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, int this_cpu) | |||
966 | int local_group; | 966 | int local_group; |
967 | int i; | 967 | int i; |
968 | 968 | ||
969 | /* Skip over this group if it has no CPUs allowed */ | ||
970 | if (!cpus_intersects(group->cpumask, p->cpus_allowed)) | ||
971 | goto nextgroup; | ||
972 | |||
969 | local_group = cpu_isset(this_cpu, group->cpumask); | 973 | local_group = cpu_isset(this_cpu, group->cpumask); |
970 | /* XXX: put a cpus allowed check */ | ||
971 | 974 | ||
972 | /* Tally up the load of all CPUs in the group */ | 975 | /* Tally up the load of all CPUs in the group */ |
973 | avg_load = 0; | 976 | avg_load = 0; |
@@ -992,6 +995,7 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, int this_cpu) | |||
992 | min_load = avg_load; | 995 | min_load = avg_load; |
993 | idlest = group; | 996 | idlest = group; |
994 | } | 997 | } |
998 | nextgroup: | ||
995 | group = group->next; | 999 | group = group->next; |
996 | } while (group != sd->groups); | 1000 | } while (group != sd->groups); |
997 | 1001 | ||
@@ -1003,13 +1007,18 @@ find_idlest_group(struct sched_domain *sd, struct task_struct *p, int this_cpu) | |||
1003 | /* | 1007 | /* |
1004 | * find_idlest_queue - find the idlest runqueue among the cpus in group. | 1008 | * find_idlest_queue - find the idlest runqueue among the cpus in group. |
1005 | */ | 1009 | */ |
1006 | static int find_idlest_cpu(struct sched_group *group, int this_cpu) | 1010 | static int find_idlest_cpu(struct sched_group *group, |
1011 | struct task_struct *p, int this_cpu) | ||
1007 | { | 1012 | { |
1013 | cpumask_t tmp; | ||
1008 | unsigned long load, min_load = ULONG_MAX; | 1014 | unsigned long load, min_load = ULONG_MAX; |
1009 | int idlest = -1; | 1015 | int idlest = -1; |
1010 | int i; | 1016 | int i; |
1011 | 1017 | ||
1012 | for_each_cpu_mask(i, group->cpumask) { | 1018 | /* Traverse only the allowed CPUs */ |
1019 | cpus_and(tmp, group->cpumask, p->cpus_allowed); | ||
1020 | |||
1021 | for_each_cpu_mask(i, tmp) { | ||
1013 | load = source_load(i, 0); | 1022 | load = source_load(i, 0); |
1014 | 1023 | ||
1015 | if (load < min_load || (load == min_load && i == this_cpu)) { | 1024 | if (load < min_load || (load == min_load && i == this_cpu)) { |
@@ -1052,7 +1061,7 @@ static int sched_balance_self(int cpu, int flag) | |||
1052 | if (!group) | 1061 | if (!group) |
1053 | goto nextlevel; | 1062 | goto nextlevel; |
1054 | 1063 | ||
1055 | new_cpu = find_idlest_cpu(group, cpu); | 1064 | new_cpu = find_idlest_cpu(group, t, cpu); |
1056 | if (new_cpu == -1 || new_cpu == cpu) | 1065 | if (new_cpu == -1 || new_cpu == cpu) |
1057 | goto nextlevel; | 1066 | goto nextlevel; |
1058 | 1067 | ||