Skip to content

Commit

Permalink
cpufreq: governor: Add a ->start callback for governors
Browse files Browse the repository at this point in the history
To avoid having to check the governor type explicitly in the common
code in order to initialize data structures specific to the governor
type properly, add a ->start callback to struct dbs_governor and
use it to initialize those data structures for the ondemand and
conservative governors.

Signed-off-by: Rafael J. Wysocki <[email protected]>
Acked-by: Viresh Kumar <[email protected]>
  • Loading branch information
rafaeljw committed Mar 9, 2016
1 parent 8847e03 commit 702c9e5
Show file tree
Hide file tree
Showing 4 changed files with 22 additions and 14 deletions.
9 changes: 9 additions & 0 deletions drivers/cpufreq/cpufreq_conservative.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,6 +279,14 @@ static void cs_exit(struct dbs_data *dbs_data, bool notify)
kfree(dbs_data->tuners);
}

static void cs_start(struct cpufreq_policy *policy)
{
struct cs_cpu_dbs_info_s *dbs_info = &per_cpu(cs_cpu_dbs_info, policy->cpu);

dbs_info->down_skip = 0;
dbs_info->requested_freq = policy->cur;
}

define_get_cpu_dbs_routines(cs_cpu_dbs_info);

static struct dbs_governor cs_dbs_gov = {
Expand All @@ -295,6 +303,7 @@ static struct dbs_governor cs_dbs_gov = {
.gov_dbs_timer = cs_dbs_timer,
.init = cs_init,
.exit = cs_exit,
.start = cs_start,
};

#define CPU_FREQ_GOV_CONSERVATIVE (&cs_dbs_gov.gov)
Expand Down
16 changes: 2 additions & 14 deletions drivers/cpufreq/cpufreq_governor.c
Original file line number Diff line number Diff line change
Expand Up @@ -517,7 +517,7 @@ static int cpufreq_governor_start(struct cpufreq_policy *policy)
struct dbs_governor *gov = dbs_governor_of(policy);
struct policy_dbs_info *policy_dbs = policy->governor_data;
struct dbs_data *dbs_data = policy_dbs->dbs_data;
unsigned int sampling_rate, ignore_nice, j, cpu = policy->cpu;
unsigned int sampling_rate, ignore_nice, j;
unsigned int io_busy;

if (!policy->cur)
Expand All @@ -543,19 +543,7 @@ static int cpufreq_governor_start(struct cpufreq_policy *policy)
j_cdbs->prev_cpu_nice = kcpustat_cpu(j).cpustat[CPUTIME_NICE];
}

if (gov->governor == GOV_CONSERVATIVE) {
struct cs_cpu_dbs_info_s *cs_dbs_info =
gov->get_cpu_dbs_info_s(cpu);

cs_dbs_info->down_skip = 0;
cs_dbs_info->requested_freq = policy->cur;
} else {
struct od_ops *od_ops = gov->gov_ops;
struct od_cpu_dbs_info_s *od_dbs_info = gov->get_cpu_dbs_info_s(cpu);

od_dbs_info->sample_type = OD_NORMAL_SAMPLE;
od_ops->powersave_bias_init_cpu(cpu);
}
gov->start(policy);

gov_set_update_util(policy_dbs, sampling_rate);
return 0;
Expand Down
1 change: 1 addition & 0 deletions drivers/cpufreq/cpufreq_governor.h
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,7 @@ struct dbs_governor {
unsigned int (*gov_dbs_timer)(struct cpufreq_policy *policy);
int (*init)(struct dbs_data *dbs_data, bool notify);
void (*exit)(struct dbs_data *dbs_data, bool notify);
void (*start)(struct cpufreq_policy *policy);

/* Governor specific ops, see below */
void *gov_ops;
Expand Down
10 changes: 10 additions & 0 deletions drivers/cpufreq/cpufreq_ondemand.c
Original file line number Diff line number Diff line change
Expand Up @@ -410,6 +410,15 @@ static void od_exit(struct dbs_data *dbs_data, bool notify)
kfree(dbs_data->tuners);
}

static void od_start(struct cpufreq_policy *policy)
{
unsigned int cpu = policy->cpu;
struct od_cpu_dbs_info_s *dbs_info = &per_cpu(od_cpu_dbs_info, cpu);

dbs_info->sample_type = OD_NORMAL_SAMPLE;
od_ops.powersave_bias_init_cpu(cpu);
}

define_get_cpu_dbs_routines(od_cpu_dbs_info);

static struct od_ops od_ops = {
Expand All @@ -432,6 +441,7 @@ static struct dbs_governor od_dbs_gov = {
.gov_ops = &od_ops,
.init = od_init,
.exit = od_exit,
.start = od_start,
};

#define CPU_FREQ_GOV_ONDEMAND (&od_dbs_gov.gov)
Expand Down

0 comments on commit 702c9e5

Please sign in to comment.