diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq_conservative.c')
-rw-r--r-- | drivers/cpufreq/cpufreq_conservative.c | 52 |
1 files changed, 9 insertions, 43 deletions
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c index c18a304b3a3..e8bb9157167 100644 --- a/drivers/cpufreq/cpufreq_conservative.c +++ b/drivers/cpufreq/cpufreq_conservative.c @@ -111,58 +111,24 @@ 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) +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); unsigned int cpu = dbs_info->cdbs.cur_policy->cpu; + struct cs_cpu_dbs_info_s *core_dbs_info = &per_cpu(cs_cpu_dbs_info, + cpu); int delay = delay_for_sampling_rate(cs_tuners.sampling_rate); - if (sample) + mutex_lock(&core_dbs_info->cdbs.timer_mutex); + if (need_load_eval(&core_dbs_info->cdbs, cs_tuners.sampling_rate)) dbs_check_cpu(&cs_dbs_data, cpu); schedule_delayed_work_on(smp_processor_id(), dw, delay); + mutex_unlock(&core_dbs_info->cdbs.timer_mutex); } -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.cur_policy->cpu); - mutex_lock(&dbs_info->cdbs.timer_mutex); - - time_now = ktime_get(); - delta_us = ktime_us_delta(time_now, dbs_info->cdbs.time_stamp); - - /* 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 (policy_is_shared(dbs_info->cdbs.cur_policy)) { - 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) { |