diff options
Diffstat (limited to 'kernel/sched_fair.c')
-rw-r--r-- | kernel/sched_fair.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/kernel/sched_fair.c b/kernel/sched_fair.c index 08ffffd4a410..36b5e34fa99e 100644 --- a/kernel/sched_fair.c +++ b/kernel/sched_fair.c | |||
@@ -1026,6 +1026,24 @@ static int wake_idle(int cpu, struct task_struct *p) | |||
1026 | { | 1026 | { |
1027 | struct sched_domain *sd; | 1027 | struct sched_domain *sd; |
1028 | int i; | 1028 | int i; |
1029 | unsigned int chosen_wakeup_cpu; | ||
1030 | int this_cpu; | ||
1031 | |||
1032 | /* | ||
1033 | * At POWERSAVINGS_BALANCE_WAKEUP level, if both this_cpu and prev_cpu | ||
1034 | * are idle and this is not a kernel thread and this task's affinity | ||
1035 | * allows it to be moved to preferred cpu, then just move! | ||
1036 | */ | ||
1037 | |||
1038 | this_cpu = smp_processor_id(); | ||
1039 | chosen_wakeup_cpu = | ||
1040 | cpu_rq(this_cpu)->rd->sched_mc_preferred_wakeup_cpu; | ||
1041 | |||
1042 | if (sched_mc_power_savings >= POWERSAVINGS_BALANCE_WAKEUP && | ||
1043 | idle_cpu(cpu) && idle_cpu(this_cpu) && | ||
1044 | p->mm && !(p->flags & PF_KTHREAD) && | ||
1045 | cpu_isset(chosen_wakeup_cpu, p->cpus_allowed)) | ||
1046 | return chosen_wakeup_cpu; | ||
1029 | 1047 | ||
1030 | /* | 1048 | /* |
1031 | * If it is idle, then it is the best cpu to run this task. | 1049 | * If it is idle, then it is the best cpu to run this task. |