Message ID | 1359550803-18577-4-git-send-email-fabio.baltieri@linaro.org (mailing list archive) |
---|---|
State | RFC, archived |
Headers | show |
On 30 January 2013 18:30, Fabio Baltieri <fabio.baltieri@linaro.org> wrote: > Modify conservative timer to not resample CPU utilization if recently > sampled from another SW coordinated core. > > Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org> We are again doing the same mistake which i fixed with: commit 4471a34f9a1f2da220272e823bdb8e8fa83a7661 Author: Viresh Kumar <viresh.kumar@linaro.org> Date: Fri Oct 26 00:47:42 2012 +0200 cpufreq: governors: remove redundant code Initially ondemand governor was written and then using its code conservative governor is written. It used a lot of code from ondemand governor, but copy of code was created instead of using the same routines from both governors. Which increased code redundancy, which is difficult to manage. This patch is an attempt to move common part of both the governors to cpufreq_governor.c file to come over above mentioned issues. -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Wed, Jan 30, 2013 at 09:23:22PM +0530, Viresh Kumar wrote: > On 30 January 2013 18:30, Fabio Baltieri <fabio.baltieri@linaro.org> wrote: > > Modify conservative timer to not resample CPU utilization if recently > > sampled from another SW coordinated core. > > > > Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org> > > We are again doing the same mistake which i fixed with: > > commit 4471a34f9a1f2da220272e823bdb8e8fa83a7661 > Author: Viresh Kumar <viresh.kumar@linaro.org> > Date: Fri Oct 26 00:47:42 2012 +0200 > > cpufreq: governors: remove redundant code Can't argue with this, but the two had some subdle differences (namely th two dbs_info structures) and I opted to not mess up forcing some non-obvious common code. Feel free to suggest a strategy. Thanks, Fabio
On 30 January 2013 22:23, Fabio Baltieri <fabio.baltieri@linaro.org> wrote: > On Wed, Jan 30, 2013 at 09:23:22PM +0530, Viresh Kumar wrote: > Can't argue with this, but the two had some subdle differences (namely > th two dbs_info structures) and I opted to not mess up forcing some > non-obvious common code. > > Feel free to suggest a strategy. Just check the patch i mentioned, go ahead with something similar. There is a lot of code in my original patch which removed redundancy to a big level. -- To unsubscribe from this list: send the line "unsubscribe linux-pm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c index b9d7f14..5d8e894 100644 --- a/drivers/cpufreq/cpufreq_conservative.c +++ b/drivers/cpufreq/cpufreq_conservative.c @@ -111,22 +111,57 @@ static void cs_check_cpu(int cpu, unsigned int load) } } -static void cs_dbs_timer(struct work_struct *work) +static void cs_timer_update(struct cs_cpu_dbs_info_s *dbs_info, bool sample, + struct delayed_work *dw) { - struct cs_cpu_dbs_info_s *dbs_info = container_of(work, - struct cs_cpu_dbs_info_s, cdbs.work.work); unsigned int cpu = dbs_info->cdbs.cpu; int delay = delay_for_sampling_rate(cs_tuners.sampling_rate); + if (sample) + dbs_check_cpu(&cs_dbs_data, cpu); + + schedule_delayed_work_on(smp_processor_id(), dw, delay); +} + +static void cs_timer_coordinated(struct cs_cpu_dbs_info_s *dbs_info_local, + struct delayed_work *dw) +{ + struct cs_cpu_dbs_info_s *dbs_info; + ktime_t time_now; + s64 delta_us; + bool sample = true; + + /* use leader CPU's dbs_info */ + dbs_info = &per_cpu(cs_cpu_dbs_info, dbs_info_local->cdbs.cpu); mutex_lock(&dbs_info->cdbs.timer_mutex); - dbs_check_cpu(&cs_dbs_data, cpu); + time_now = ktime_get(); + delta_us = ktime_us_delta(time_now, dbs_info->cdbs.time_stamp); - schedule_delayed_work_on(smp_processor_id(), &dbs_info->cdbs.work, - delay); + /* Do nothing if we recently have sampled */ + if (delta_us < (s64)(cs_tuners.sampling_rate / 2)) + sample = false; + else + dbs_info->cdbs.time_stamp = time_now; + + cs_timer_update(dbs_info, sample, dw); mutex_unlock(&dbs_info->cdbs.timer_mutex); } +static void cs_dbs_timer(struct work_struct *work) +{ + struct delayed_work *dw = to_delayed_work(work); + struct cs_cpu_dbs_info_s *dbs_info = container_of(work, + struct cs_cpu_dbs_info_s, cdbs.work.work); + + if (dbs_sw_coordinated_cpus(&dbs_info->cdbs)) { + cs_timer_coordinated(dbs_info, dw); + } else { + mutex_lock(&dbs_info->cdbs.timer_mutex); + cs_timer_update(dbs_info, true, dw); + mutex_unlock(&dbs_info->cdbs.timer_mutex); + } +} static int dbs_cpufreq_notifier(struct notifier_block *nb, unsigned long val, void *data) {
Modify conservative timer to not resample CPU utilization if recently sampled from another SW coordinated core. Signed-off-by: Fabio Baltieri <fabio.baltieri@linaro.org> --- drivers/cpufreq/cpufreq_conservative.c | 47 +++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 6 deletions(-)