[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: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com> Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
committed by
Dave Jones
parent
8217e4f4c9
commit
bf0b90e357
@@ -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)
|
|||||||
|
|
||||||
#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:
|
|||||||
}
|
}
|
||||||
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)
|
|||||||
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)
|
|||||||
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,
|
|||||||
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 {
|
|||||||
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);
|
||||||
|
Reference in New Issue
Block a user