Commit c2837558 authored by Jacob Shin's avatar Jacob Shin Committed by Rafael J. Wysocki

cpufreq: fix NULL pointer deference at od_set_powersave_bias()

When initializing the default powersave_bias value, we need to first
make sure that this policy is running the ondemand governor.
Reported-and-tested-by: default avatarTim Gardner <tim.gardner@canonical.com>
Signed-off-by: default avatarJacob Shin <jacob.shin@amd.com>
Signed-off-by: default avatarRafael J. Wysocki <rafael.j.wysocki@intel.com>
parent 9e895ace
...@@ -47,6 +47,8 @@ static struct od_ops od_ops; ...@@ -47,6 +47,8 @@ static struct od_ops od_ops;
static struct cpufreq_governor cpufreq_gov_ondemand; static struct cpufreq_governor cpufreq_gov_ondemand;
#endif #endif
static unsigned int default_powersave_bias;
static void ondemand_powersave_bias_init_cpu(int cpu) static void ondemand_powersave_bias_init_cpu(int cpu)
{ {
struct od_cpu_dbs_info_s *dbs_info = &per_cpu(od_cpu_dbs_info, cpu); struct od_cpu_dbs_info_s *dbs_info = &per_cpu(od_cpu_dbs_info, cpu);
...@@ -543,7 +545,7 @@ static int od_init(struct dbs_data *dbs_data) ...@@ -543,7 +545,7 @@ static int od_init(struct dbs_data *dbs_data)
tuners->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR; tuners->sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR;
tuners->ignore_nice = 0; tuners->ignore_nice = 0;
tuners->powersave_bias = 0; tuners->powersave_bias = default_powersave_bias;
tuners->io_is_busy = should_io_be_busy(); tuners->io_is_busy = should_io_be_busy();
dbs_data->tuners = tuners; dbs_data->tuners = tuners;
...@@ -585,6 +587,7 @@ static void od_set_powersave_bias(unsigned int powersave_bias) ...@@ -585,6 +587,7 @@ static void od_set_powersave_bias(unsigned int powersave_bias)
unsigned int cpu; unsigned int cpu;
cpumask_t done; cpumask_t done;
default_powersave_bias = powersave_bias;
cpumask_clear(&done); cpumask_clear(&done);
get_online_cpus(); get_online_cpus();
...@@ -593,11 +596,17 @@ static void od_set_powersave_bias(unsigned int powersave_bias) ...@@ -593,11 +596,17 @@ static void od_set_powersave_bias(unsigned int powersave_bias)
continue; continue;
policy = per_cpu(od_cpu_dbs_info, cpu).cdbs.cur_policy; policy = per_cpu(od_cpu_dbs_info, cpu).cdbs.cur_policy;
dbs_data = policy->governor_data; if (!policy)
od_tuners = dbs_data->tuners; continue;
od_tuners->powersave_bias = powersave_bias;
cpumask_or(&done, &done, policy->cpus); cpumask_or(&done, &done, policy->cpus);
if (policy->governor != &cpufreq_gov_ondemand)
continue;
dbs_data = policy->governor_data;
od_tuners = dbs_data->tuners;
od_tuners->powersave_bias = default_powersave_bias;
} }
put_online_cpus(); put_online_cpus();
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment