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:
parent
be6924f0ee
commit
47c2819aeb
1 changed files with 25 additions and 4 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue