Skip to content

Commit

Permalink
cpufreq: conservative: call dbs_check_cpu only when necessary
Browse files Browse the repository at this point in the history
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>
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
  • Loading branch information
Fabio Baltieri authored and Rafael J. Wysocki committed Feb 1, 2013
1 parent da53d61 commit 66df2a0
Showing 1 changed file with 41 additions and 6 deletions.
47 changes: 41 additions & 6 deletions drivers/cpufreq/cpufreq_conservative.c
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down

0 comments on commit 66df2a0

Please sign in to comment.