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: Tim Gardner <tim.gardner@canonical.com> Signed-off-by: Jacob Shin <jacob.shin@amd.com> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
9e895ace5d
commit
c28375583b
@ -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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
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();
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user