Commit bf0b90e3 authored by venkatesh.pallipadi@intel.com's avatar venkatesh.pallipadi@intel.com Committed by Dave Jones

[CPUFREQ][1/6] cpufreq: Add cpu number parameter to __cpufreq_driver_getavg()

Add a cpu parameter to __cpufreq_driver_getavg(). This is needed for software
cpufreq coordination where policy->cpu may not be same as the CPU on which we
want to getavg frequency.

A follow-on patch will use this parameter to getavg freq from all cpus
in policy->cpus.

Change since last patch. Fix the offline/online and suspend/resume
oops reported by Youquan Song <youquan.song@intel.com>
Signed-off-by: default avatarVenkatesh Pallipadi <venkatesh.pallipadi@intel.com>
Signed-off-by: default avatarDave Jones <davej@redhat.com>
parent 8217e4f4
...@@ -256,7 +256,8 @@ static u32 get_cur_val(const cpumask_t *mask) ...@@ -256,7 +256,8 @@ static u32 get_cur_val(const cpumask_t *mask)
* Only IA32_APERF/IA32_MPERF ratio is architecturally defined and * Only IA32_APERF/IA32_MPERF ratio is architecturally defined and
* no meaning should be associated with absolute values of these MSRs. * no meaning should be associated with absolute values of these MSRs.
*/ */
static unsigned int get_measured_perf(unsigned int cpu) static unsigned int get_measured_perf(struct cpufreq_policy *policy,
unsigned int cpu)
{ {
union { union {
struct { struct {
...@@ -326,7 +327,7 @@ static unsigned int get_measured_perf(unsigned int cpu) ...@@ -326,7 +327,7 @@ static unsigned int get_measured_perf(unsigned int cpu)
#endif #endif
retval = per_cpu(drv_data, cpu)->max_freq * perf_percent / 100; retval = per_cpu(drv_data, policy->cpu)->max_freq * perf_percent / 100;
put_cpu(); put_cpu();
set_cpus_allowed_ptr(current, &saved_mask); set_cpus_allowed_ptr(current, &saved_mask);
......
...@@ -1487,7 +1487,7 @@ no_policy: ...@@ -1487,7 +1487,7 @@ no_policy:
} }
EXPORT_SYMBOL_GPL(cpufreq_driver_target); EXPORT_SYMBOL_GPL(cpufreq_driver_target);
int __cpufreq_driver_getavg(struct cpufreq_policy *policy) int __cpufreq_driver_getavg(struct cpufreq_policy *policy, unsigned int cpu)
{ {
int ret = 0; int ret = 0;
...@@ -1495,8 +1495,8 @@ int __cpufreq_driver_getavg(struct cpufreq_policy *policy) ...@@ -1495,8 +1495,8 @@ int __cpufreq_driver_getavg(struct cpufreq_policy *policy)
if (!policy) if (!policy)
return -EINVAL; return -EINVAL;
if (cpu_online(policy->cpu) && cpufreq_driver->getavg) if (cpu_online(cpu) && cpufreq_driver->getavg)
ret = cpufreq_driver->getavg(policy->cpu); ret = cpufreq_driver->getavg(policy, cpu);
cpufreq_cpu_put(policy); cpufreq_cpu_put(policy);
return ret; return ret;
......
...@@ -415,7 +415,7 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info) ...@@ -415,7 +415,7 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
if (load < (dbs_tuners_ins.up_threshold - 10)) { if (load < (dbs_tuners_ins.up_threshold - 10)) {
unsigned int freq_next, freq_cur; unsigned int freq_next, freq_cur;
freq_cur = __cpufreq_driver_getavg(policy); freq_cur = __cpufreq_driver_getavg(policy, policy->cpu);
if (!freq_cur) if (!freq_cur)
freq_cur = policy->cur; freq_cur = policy->cur;
......
...@@ -187,7 +187,8 @@ extern int __cpufreq_driver_target(struct cpufreq_policy *policy, ...@@ -187,7 +187,8 @@ extern int __cpufreq_driver_target(struct cpufreq_policy *policy,
unsigned int relation); unsigned int relation);
extern int __cpufreq_driver_getavg(struct cpufreq_policy *policy); extern int __cpufreq_driver_getavg(struct cpufreq_policy *policy,
unsigned int cpu);
int cpufreq_register_governor(struct cpufreq_governor *governor); int cpufreq_register_governor(struct cpufreq_governor *governor);
void cpufreq_unregister_governor(struct cpufreq_governor *governor); void cpufreq_unregister_governor(struct cpufreq_governor *governor);
...@@ -226,7 +227,9 @@ struct cpufreq_driver { ...@@ -226,7 +227,9 @@ struct cpufreq_driver {
unsigned int (*get) (unsigned int cpu); unsigned int (*get) (unsigned int cpu);
/* optional */ /* optional */
unsigned int (*getavg) (unsigned int cpu); unsigned int (*getavg) (struct cpufreq_policy *policy,
unsigned int cpu);
int (*exit) (struct cpufreq_policy *policy); int (*exit) (struct cpufreq_policy *policy);
int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg); int (*suspend) (struct cpufreq_policy *policy, pm_message_t pmsg);
int (*resume) (struct cpufreq_policy *policy); int (*resume) (struct cpufreq_policy *policy);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment