cpufreq: governors: fix misuse of cdbs.cpu
Fix governors code to set all cpu's cdbs->cpu to the the actual cpu id and use cur_policy->cpu istead of cdbs->cpu to track current governor's leader cpu. Reported-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org> Acked-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
2624f90c16
commit
09dca5ae75
3 changed files with 7 additions and 5 deletions
|
@ -114,7 +114,7 @@ static void cs_check_cpu(int cpu, unsigned int load)
|
||||||
static void cs_timer_update(struct cs_cpu_dbs_info_s *dbs_info, bool sample,
|
static void cs_timer_update(struct cs_cpu_dbs_info_s *dbs_info, bool sample,
|
||||||
struct delayed_work *dw)
|
struct delayed_work *dw)
|
||||||
{
|
{
|
||||||
unsigned int cpu = dbs_info->cdbs.cpu;
|
unsigned int cpu = dbs_info->cdbs.cur_policy->cpu;
|
||||||
int delay = delay_for_sampling_rate(cs_tuners.sampling_rate);
|
int delay = delay_for_sampling_rate(cs_tuners.sampling_rate);
|
||||||
|
|
||||||
if (sample)
|
if (sample)
|
||||||
|
@ -132,7 +132,8 @@ static void cs_timer_coordinated(struct cs_cpu_dbs_info_s *dbs_info_local,
|
||||||
bool sample = true;
|
bool sample = true;
|
||||||
|
|
||||||
/* use leader CPU's dbs_info */
|
/* use leader CPU's dbs_info */
|
||||||
dbs_info = &per_cpu(cs_cpu_dbs_info, dbs_info_local->cdbs.cpu);
|
dbs_info = &per_cpu(cs_cpu_dbs_info,
|
||||||
|
dbs_info_local->cdbs.cur_policy->cpu);
|
||||||
mutex_lock(&dbs_info->cdbs.timer_mutex);
|
mutex_lock(&dbs_info->cdbs.timer_mutex);
|
||||||
|
|
||||||
time_now = ktime_get();
|
time_now = ktime_get();
|
||||||
|
|
|
@ -208,11 +208,11 @@ int cpufreq_governor_dbs(struct dbs_data *dbs_data,
|
||||||
mutex_lock(&dbs_data->mutex);
|
mutex_lock(&dbs_data->mutex);
|
||||||
|
|
||||||
dbs_data->enable++;
|
dbs_data->enable++;
|
||||||
cpu_cdbs->cpu = cpu;
|
|
||||||
for_each_cpu(j, policy->cpus) {
|
for_each_cpu(j, policy->cpus) {
|
||||||
struct cpu_dbs_common_info *j_cdbs;
|
struct cpu_dbs_common_info *j_cdbs;
|
||||||
j_cdbs = dbs_data->get_cpu_cdbs(j);
|
j_cdbs = dbs_data->get_cpu_cdbs(j);
|
||||||
|
|
||||||
|
j_cdbs->cpu = j;
|
||||||
j_cdbs->cur_policy = policy;
|
j_cdbs->cur_policy = policy;
|
||||||
j_cdbs->prev_cpu_idle = get_cpu_idle_time(j,
|
j_cdbs->prev_cpu_idle = get_cpu_idle_time(j,
|
||||||
&j_cdbs->prev_cpu_wall);
|
&j_cdbs->prev_cpu_wall);
|
||||||
|
|
|
@ -219,7 +219,7 @@ static void od_check_cpu(int cpu, unsigned int load_freq)
|
||||||
static void od_timer_update(struct od_cpu_dbs_info_s *dbs_info, bool sample,
|
static void od_timer_update(struct od_cpu_dbs_info_s *dbs_info, bool sample,
|
||||||
struct delayed_work *dw)
|
struct delayed_work *dw)
|
||||||
{
|
{
|
||||||
unsigned int cpu = dbs_info->cdbs.cpu;
|
unsigned int cpu = dbs_info->cdbs.cur_policy->cpu;
|
||||||
int delay, sample_type = dbs_info->sample_type;
|
int delay, sample_type = dbs_info->sample_type;
|
||||||
|
|
||||||
/* Common NORMAL_SAMPLE setup */
|
/* Common NORMAL_SAMPLE setup */
|
||||||
|
@ -255,7 +255,8 @@ static void od_timer_coordinated(struct od_cpu_dbs_info_s *dbs_info_local,
|
||||||
bool sample = true;
|
bool sample = true;
|
||||||
|
|
||||||
/* use leader CPU's dbs_info */
|
/* use leader CPU's dbs_info */
|
||||||
dbs_info = &per_cpu(od_cpu_dbs_info, dbs_info_local->cdbs.cpu);
|
dbs_info = &per_cpu(od_cpu_dbs_info,
|
||||||
|
dbs_info_local->cdbs.cur_policy->cpu);
|
||||||
mutex_lock(&dbs_info->cdbs.timer_mutex);
|
mutex_lock(&dbs_info->cdbs.timer_mutex);
|
||||||
|
|
||||||
time_now = ktime_get();
|
time_now = ktime_get();
|
||||||
|
|
Loading…
Reference in a new issue