cpufreq: governors: fix misuse of cdbs.cpu
authorFabio Baltieri <fabio.baltieri@linaro.org>
Thu, 31 Jan 2013 10:39:19 +0000 (10:39 +0000)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Fri, 1 Feb 2013 23:01:16 +0000 (00:01 +0100)
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>
drivers/cpufreq/cpufreq_conservative.c
drivers/cpufreq/cpufreq_governor.c
drivers/cpufreq/cpufreq_ondemand.c

index 653fb0652412304e9164e8bb49ea19f36058050b..c18a304b3a38f4daf95dbd354daf129ce9db5ea6 100644 (file)
@@ -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,
                            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);
 
        if (sample)
@@ -132,7 +132,8 @@ static void cs_timer_coordinated(struct cs_cpu_dbs_info_s *dbs_info_local,
        bool sample = true;
 
        /* 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);
 
        time_now = ktime_get();
index 67e235acf43b1daacf26282213fd3115b2445bf9..46f1c78bd16f84c162f0d5c71f01c5662f34eadc 100644 (file)
@@ -208,11 +208,11 @@ int cpufreq_governor_dbs(struct dbs_data *dbs_data,
                mutex_lock(&dbs_data->mutex);
 
                dbs_data->enable++;
-               cpu_cdbs->cpu = cpu;
                for_each_cpu(j, policy->cpus) {
                        struct cpu_dbs_common_info *j_cdbs;
                        j_cdbs = dbs_data->get_cpu_cdbs(j);
 
+                       j_cdbs->cpu = j;
                        j_cdbs->cur_policy = policy;
                        j_cdbs->prev_cpu_idle = get_cpu_idle_time(j,
                                        &j_cdbs->prev_cpu_wall);
index 5ae84ffeafb36b0f0d82b25fe4239ab1b6ba2c12..75efd5ee00f884779e0d6bca2d28a66acf7b9616 100644 (file)
@@ -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,
                            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;
 
        /* 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;
 
        /* 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);
 
        time_now = ktime_get();