From: Sam Leffler <[email protected]>

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 <[email protected]>
Change-Id: I4cae36dd2e7389540d337d74745ffbaa0131870f
Signed-off-by: Bálint Czobor <[email protected]>
---
 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 [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to