cpuidle: Wakeup only cpus for which qos has changed

The pm_qos framework passes down a mask of cpus for which the qos has
changed.  cpuidle driver uses this info to wakeup only those cpus for
the new qos to take effect. This would prevent waking up cpus for which
the qos values remains unchanged.

Change-Id: Ibb79937674a8f16920c6b8f224a21d2f72a0f9ce
Signed-off-by: Mahesh Sivasubramanian <msivasub@codeaurora.org>
Signed-off-by: Maulik Shah <mkshah@codeaurora.org>
This commit is contained in:
Mahesh Sivasubramanian 2017-10-31 17:36:01 +05:30 committed by Maulik Shah
parent be6924f0ee
commit 47c2819aeb

View file

@ -13,6 +13,7 @@
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/sched/clock.h> #include <linux/sched/clock.h>
#include <linux/sched/idle.h>
#include <linux/notifier.h> #include <linux/notifier.h>
#include <linux/pm_qos.h> #include <linux/pm_qos.h>
#include <linux/cpu.h> #include <linux/cpu.h>
@ -654,16 +655,36 @@ EXPORT_SYMBOL_GPL(cpuidle_register);
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
static void wake_up_idle_cpus(void *v)
{
int cpu;
struct cpumask cpus;
if (v) {
cpumask_andnot(&cpus, v, cpu_isolated_mask);
cpumask_and(&cpus, &cpus, cpu_online_mask);
} else
cpumask_andnot(&cpus, cpu_online_mask, cpu_isolated_mask);
preempt_disable();
for_each_cpu(cpu, &cpus) {
if (cpu == smp_processor_id())
continue;
wake_up_if_idle(cpu);
}
preempt_enable();
}
/* /*
* This function gets called when a part of the kernel has a new latency * This function gets called when a part of the kernel has a new latency
* requirement. This means we need to get all processors out of their C-state, * requirement. This means we need to get only those processors out of their
* and then recalculate a new suitable C-state. Just do a cross-cpu IPI; that * C-state for which qos requirement is changed, and then recalculate a new
* wakes them all right up. * suitable C-state. Just do a cross-cpu IPI; that wakes them all right up.
*/ */
static int cpuidle_latency_notify(struct notifier_block *b, static int cpuidle_latency_notify(struct notifier_block *b,
unsigned long l, void *v) unsigned long l, void *v)
{ {
wake_up_all_idle_cpus(); wake_up_idle_cpus(v);
return NOTIFY_OK; return NOTIFY_OK;
} }