cpufreq: governor: Keep single copy of information common to policy->cpus
Some information is common to all CPUs belonging to a policy, but are kept on per-cpu basis. Lets keep that in another structure common to all policy->cpus. That will make updates/reads to that less complex and less error prone. The memory for cpu_common_dbs_info is allocated/freed at INIT/EXIT, so that it we don't reallocate it for STOP/START sequence. It will be also be used (in next patch) while the governor is stopped and so must not be freed that early. Reviewed-and-tested-by: Preeti U Murthy <preeti@linux.vnet.ibm.com> Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:

committed by
Rafael J. Wysocki

parent
42994af63c
commit
44152cb82d
@@ -47,7 +47,7 @@ static inline unsigned int get_freq_target(struct cs_dbs_tuners *cs_tuners,
|
||||
static void cs_check_cpu(int cpu, unsigned int load)
|
||||
{
|
||||
struct cs_cpu_dbs_info_s *dbs_info = &per_cpu(cs_cpu_dbs_info, cpu);
|
||||
struct cpufreq_policy *policy = dbs_info->cdbs.policy;
|
||||
struct cpufreq_policy *policy = dbs_info->cdbs.shared->policy;
|
||||
struct dbs_data *dbs_data = policy->governor_data;
|
||||
struct cs_dbs_tuners *cs_tuners = dbs_data->tuners;
|
||||
|
||||
@@ -106,22 +106,24 @@ static void cs_dbs_timer(struct work_struct *work)
|
||||
{
|
||||
struct cs_cpu_dbs_info_s *dbs_info = container_of(work,
|
||||
struct cs_cpu_dbs_info_s, cdbs.dwork.work);
|
||||
unsigned int cpu = dbs_info->cdbs.policy->cpu;
|
||||
struct cpufreq_policy *policy = dbs_info->cdbs.shared->policy;
|
||||
unsigned int cpu = policy->cpu;
|
||||
struct cs_cpu_dbs_info_s *core_dbs_info = &per_cpu(cs_cpu_dbs_info,
|
||||
cpu);
|
||||
struct dbs_data *dbs_data = dbs_info->cdbs.policy->governor_data;
|
||||
struct dbs_data *dbs_data = policy->governor_data;
|
||||
struct cs_dbs_tuners *cs_tuners = dbs_data->tuners;
|
||||
int delay = delay_for_sampling_rate(cs_tuners->sampling_rate);
|
||||
bool modify_all = true;
|
||||
|
||||
mutex_lock(&core_dbs_info->cdbs.timer_mutex);
|
||||
if (!need_load_eval(&core_dbs_info->cdbs, cs_tuners->sampling_rate))
|
||||
mutex_lock(&core_dbs_info->cdbs.shared->timer_mutex);
|
||||
if (!need_load_eval(core_dbs_info->cdbs.shared,
|
||||
cs_tuners->sampling_rate))
|
||||
modify_all = false;
|
||||
else
|
||||
dbs_check_cpu(dbs_data, cpu);
|
||||
|
||||
gov_queue_work(dbs_data, dbs_info->cdbs.policy, delay, modify_all);
|
||||
mutex_unlock(&core_dbs_info->cdbs.timer_mutex);
|
||||
gov_queue_work(dbs_data, policy, delay, modify_all);
|
||||
mutex_unlock(&core_dbs_info->cdbs.shared->timer_mutex);
|
||||
}
|
||||
|
||||
static int dbs_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
|
||||
@@ -135,7 +137,7 @@ static int dbs_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
|
||||
if (!dbs_info->enable)
|
||||
return 0;
|
||||
|
||||
policy = dbs_info->cdbs.policy;
|
||||
policy = dbs_info->cdbs.shared->policy;
|
||||
|
||||
/*
|
||||
* we only care if our internally tracked freq moves outside the 'valid'
|
||||
|
Reference in New Issue
Block a user