cpufreq: interactive: take idle notifications only when active
Register an idle notifier only when the governor is active. Also short-circuit work of idle end if the governor is not enabled. Signed-off-by: Sam Leffler <sleffler@chromium.org> Change-Id: I4cae36dd2e7389540d337d74745ffbaa0131870f
This commit is contained in:
@@ -364,6 +364,9 @@ static void cpufreq_interactive_idle_end(void)
|
||||
struct cpufreq_interactive_cpuinfo *pcpu =
|
||||
&per_cpu(cpuinfo, smp_processor_id());
|
||||
|
||||
if (!pcpu->governor_enabled)
|
||||
return;
|
||||
|
||||
pcpu->idling = 0;
|
||||
smp_wmb();
|
||||
|
||||
@@ -816,6 +819,26 @@ static struct attribute_group interactive_attr_group = {
|
||||
.name = "interactive",
|
||||
};
|
||||
|
||||
static int cpufreq_interactive_idle_notifier(struct notifier_block *nb,
|
||||
unsigned long val,
|
||||
void *data)
|
||||
{
|
||||
switch (val) {
|
||||
case IDLE_START:
|
||||
cpufreq_interactive_idle_start();
|
||||
break;
|
||||
case IDLE_END:
|
||||
cpufreq_interactive_idle_end();
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct notifier_block cpufreq_interactive_idle_nb = {
|
||||
.notifier_call = cpufreq_interactive_idle_notifier,
|
||||
};
|
||||
|
||||
static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
|
||||
unsigned int event)
|
||||
{
|
||||
@@ -869,6 +892,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
|
||||
pr_warn("%s: failed to register input handler\n",
|
||||
__func__);
|
||||
|
||||
idle_notifier_register(&cpufreq_interactive_idle_nb);
|
||||
break;
|
||||
|
||||
case CPUFREQ_GOV_STOP:
|
||||
@@ -891,6 +915,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
|
||||
if (atomic_dec_return(&active_count) > 0)
|
||||
return 0;
|
||||
|
||||
idle_notifier_unregister(&cpufreq_interactive_idle_nb);
|
||||
input_unregister_handler(&cpufreq_interactive_input_handler);
|
||||
sysfs_remove_group(cpufreq_global_kobject,
|
||||
&interactive_attr_group);
|
||||
@@ -909,26 +934,6 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int cpufreq_interactive_idle_notifier(struct notifier_block *nb,
|
||||
unsigned long val,
|
||||
void *data)
|
||||
{
|
||||
switch (val) {
|
||||
case IDLE_START:
|
||||
cpufreq_interactive_idle_start();
|
||||
break;
|
||||
case IDLE_END:
|
||||
cpufreq_interactive_idle_end();
|
||||
break;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct notifier_block cpufreq_interactive_idle_nb = {
|
||||
.notifier_call = cpufreq_interactive_idle_notifier,
|
||||
};
|
||||
|
||||
static int __init cpufreq_interactive_init(void)
|
||||
{
|
||||
unsigned int i;
|
||||
@@ -970,7 +975,6 @@ static int __init cpufreq_interactive_init(void)
|
||||
spin_lock_init(&down_cpumask_lock);
|
||||
mutex_init(&set_speed_lock);
|
||||
|
||||
idle_notifier_register(&cpufreq_interactive_idle_nb);
|
||||
INIT_WORK(&inputopen.inputopen_work, cpufreq_interactive_input_open);
|
||||
return cpufreq_register_governor(&cpufreq_gov_interactive);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user