|
@@ -1026,6 +1026,24 @@ static int wake_idle(int cpu, struct task_struct *p)
|
|
{
|
|
{
|
|
struct sched_domain *sd;
|
|
struct sched_domain *sd;
|
|
int i;
|
|
int i;
|
|
|
|
+ unsigned int chosen_wakeup_cpu;
|
|
|
|
+ int this_cpu;
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * At POWERSAVINGS_BALANCE_WAKEUP level, if both this_cpu and prev_cpu
|
|
|
|
+ * are idle and this is not a kernel thread and this task's affinity
|
|
|
|
+ * allows it to be moved to preferred cpu, then just move!
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ this_cpu = smp_processor_id();
|
|
|
|
+ chosen_wakeup_cpu =
|
|
|
|
+ cpu_rq(this_cpu)->rd->sched_mc_preferred_wakeup_cpu;
|
|
|
|
+
|
|
|
|
+ if (sched_mc_power_savings >= POWERSAVINGS_BALANCE_WAKEUP &&
|
|
|
|
+ idle_cpu(cpu) && idle_cpu(this_cpu) &&
|
|
|
|
+ p->mm && !(p->flags & PF_KTHREAD) &&
|
|
|
|
+ cpu_isset(chosen_wakeup_cpu, p->cpus_allowed))
|
|
|
|
+ return chosen_wakeup_cpu;
|
|
|
|
|
|
/*
|
|
/*
|
|
* If it is idle, then it is the best cpu to run this task.
|
|
* If it is idle, then it is the best cpu to run this task.
|