Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 47c2819a authored by Mahesh Sivasubramanian's avatar Mahesh Sivasubramanian Committed by Maulik Shah
Browse files

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: default avatarMahesh Sivasubramanian <msivasub@codeaurora.org>
Signed-off-by: default avatarMaulik Shah <mkshah@codeaurora.org>
parent be6924f0
Loading
Loading
Loading
Loading
+25 −4
Original line number Diff line number Diff line
@@ -13,6 +13,7 @@
#include <linux/mutex.h>
#include <linux/sched.h>
#include <linux/sched/clock.h>
#include <linux/sched/idle.h>
#include <linux/notifier.h>
#include <linux/pm_qos.h>
#include <linux/cpu.h>
@@ -654,16 +655,36 @@ EXPORT_SYMBOL_GPL(cpuidle_register);

#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
 * requirement.  This means we need to get all processors out of their C-state,
 * and then recalculate a new suitable C-state. Just do a cross-cpu IPI; that
 * wakes them all right up.
 * requirement.  This means we need to get only those processors out of their
 * C-state for which qos requirement is changed, and then recalculate a new
 * suitable C-state. Just do a cross-cpu IPI; that wakes them all right up.
 */
static int cpuidle_latency_notify(struct notifier_block *b,
		unsigned long l, void *v)
{
	wake_up_all_idle_cpus();
	wake_up_idle_cpus(v);
	return NOTIFY_OK;
}