[PATCH 17/70] cpufreq: interactive: take idle notifications only when active

From: BÃlint Czobor
Date: Tue Oct 27 2015 - 13:32:16 EST


From: Sam Leffler <sleffler@xxxxxxxxxxxx>

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@xxxxxxxxxxxx>
Change-Id: I4cae36dd2e7389540d337d74745ffbaa0131870f
Signed-off-by: BÃlint Czobor <czoborbalint@xxxxxxxxx>
---
drivers/cpufreq/cpufreq_interactive.c | 46 ++++++++++++++++++---------------
1 file changed, 25 insertions(+), 21 deletions(-)

diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index a4ed750..2038991 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -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);

--
1.7.9.5

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/