cpufreq: interactive: Cache tunables when they are created
Currently, tunables are only saved to per_cpu field when
CPUFREQ_GOV_POLICY_EXIT event happens. Save tunables the moment they
are created so that per_cpu cached_tunables field always matches
the tunables in use. This is useful for modifying tunable values
across clusters.
Change-Id: I9e30d5e93d6fde1282b5450458d8a605d568a0f5
[junjiew@codeaurora.org: Resolved trivial conflicts]
Signed-off-by: Junjie Wu <junjiew@codeaurora.org>
Signed-off-by: Stephen Boyd <sboyd@codeaurora.org>
diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c
index 2bd611c..058c5a4 100644
--- a/drivers/cpufreq/cpufreq_interactive.c
+++ b/drivers/cpufreq/cpufreq_interactive.c
@@ -1133,6 +1133,22 @@
.notifier_call = cpufreq_interactive_idle_notifier,
};
+static void save_tunables(struct cpufreq_policy *policy,
+ struct cpufreq_interactive_tunables *tunables)
+{
+ int cpu;
+ struct cpufreq_interactive_cpuinfo *pcpu;
+
+ if (have_governor_per_policy())
+ cpu = cpumask_first(policy->related_cpus);
+ else
+ cpu = 0;
+
+ pcpu = &per_cpu(cpuinfo, cpu);
+ WARN_ON(pcpu->cached_tunables && pcpu->cached_tunables != tunables);
+ pcpu->cached_tunables = tunables;
+}
+
static struct cpufreq_interactive_tunables *alloc_tunable(
struct cpufreq_policy *policy)
{
@@ -1156,25 +1172,10 @@
spin_lock_init(&tunables->target_loads_lock);
spin_lock_init(&tunables->above_hispeed_delay_lock);
+ save_tunables(policy, tunables);
return tunables;
}
-static void save_tunables(struct cpufreq_policy *policy,
- struct cpufreq_interactive_tunables *tunables)
-{
- int cpu;
- struct cpufreq_interactive_cpuinfo *pcpu;
-
- if (have_governor_per_policy())
- cpu = cpumask_first(policy->related_cpus);
- else
- cpu = 0;
-
- pcpu = &per_cpu(cpuinfo, cpu);
- WARN_ON(pcpu->cached_tunables && pcpu->cached_tunables != tunables);
- pcpu->cached_tunables = tunables;
-}
-
static struct cpufreq_interactive_tunables *restore_tunables(
struct cpufreq_policy *policy)
{
@@ -1256,7 +1257,6 @@
sysfs_remove_group(get_governor_parent_kobj(policy),
get_sysfs_attr());
- save_tunables(policy, tunables);
common_tunables = NULL;
}