[CPUFREQ] Fix coding style issues in cpufreq.
Clean up cpufreq subsystem to fix coding style issues and to improve the readability. Signed-off-by: Gautham R Shenoy <ego@in.ibm.com> Signed-off-by: Dave Jones <davej@redhat.com>
This commit is contained in:
parent
95625b8f19
commit
e08f5f5bb5
7 changed files with 150 additions and 78 deletions
|
@ -29,7 +29,8 @@
|
||||||
#include <linux/completion.h>
|
#include <linux/completion.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
|
|
||||||
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_CORE, "cpufreq-core", msg)
|
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_CORE, \
|
||||||
|
"cpufreq-core", msg)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The "cpufreq driver" - the arch- or hardware-dependent low
|
* The "cpufreq driver" - the arch- or hardware-dependent low
|
||||||
|
@ -41,7 +42,8 @@ static struct cpufreq_policy *cpufreq_cpu_data[NR_CPUS];
|
||||||
static DEFINE_SPINLOCK(cpufreq_driver_lock);
|
static DEFINE_SPINLOCK(cpufreq_driver_lock);
|
||||||
|
|
||||||
/* internal prototypes */
|
/* internal prototypes */
|
||||||
static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event);
|
static int __cpufreq_governor(struct cpufreq_policy *policy,
|
||||||
|
unsigned int event);
|
||||||
static void handle_update(void *data);
|
static void handle_update(void *data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -151,7 +153,8 @@ static void cpufreq_debug_disable_ratelimit(void)
|
||||||
spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
|
spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
void cpufreq_debug_printk(unsigned int type, const char *prefix, const char *fmt, ...)
|
void cpufreq_debug_printk(unsigned int type, const char *prefix,
|
||||||
|
const char *fmt, ...)
|
||||||
{
|
{
|
||||||
char s[256];
|
char s[256];
|
||||||
va_list args;
|
va_list args;
|
||||||
|
@ -161,7 +164,8 @@ void cpufreq_debug_printk(unsigned int type, const char *prefix, const char *fmt
|
||||||
WARN_ON(!prefix);
|
WARN_ON(!prefix);
|
||||||
if (type & debug) {
|
if (type & debug) {
|
||||||
spin_lock_irqsave(&disable_ratelimit_lock, flags);
|
spin_lock_irqsave(&disable_ratelimit_lock, flags);
|
||||||
if (!disable_ratelimit && debug_ratelimit && !printk_ratelimit()) {
|
if (!disable_ratelimit && debug_ratelimit
|
||||||
|
&& !printk_ratelimit()) {
|
||||||
spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
|
spin_unlock_irqrestore(&disable_ratelimit_lock, flags);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -182,10 +186,12 @@ EXPORT_SYMBOL(cpufreq_debug_printk);
|
||||||
|
|
||||||
|
|
||||||
module_param(debug, uint, 0644);
|
module_param(debug, uint, 0644);
|
||||||
MODULE_PARM_DESC(debug, "CPUfreq debugging: add 1 to debug core, 2 to debug drivers, and 4 to debug governors.");
|
MODULE_PARM_DESC(debug, "CPUfreq debugging: add 1 to debug core,"
|
||||||
|
" 2 to debug drivers, and 4 to debug governors.");
|
||||||
|
|
||||||
module_param(debug_ratelimit, uint, 0644);
|
module_param(debug_ratelimit, uint, 0644);
|
||||||
MODULE_PARM_DESC(debug_ratelimit, "CPUfreq debugging: set to 0 to disable ratelimiting.");
|
MODULE_PARM_DESC(debug_ratelimit, "CPUfreq debugging:"
|
||||||
|
" set to 0 to disable ratelimiting.");
|
||||||
|
|
||||||
#else /* !CONFIG_CPU_FREQ_DEBUG */
|
#else /* !CONFIG_CPU_FREQ_DEBUG */
|
||||||
|
|
||||||
|
@ -219,17 +225,23 @@ static void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
|
||||||
if (!l_p_j_ref_freq) {
|
if (!l_p_j_ref_freq) {
|
||||||
l_p_j_ref = loops_per_jiffy;
|
l_p_j_ref = loops_per_jiffy;
|
||||||
l_p_j_ref_freq = ci->old;
|
l_p_j_ref_freq = ci->old;
|
||||||
dprintk("saving %lu as reference value for loops_per_jiffy; freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
|
dprintk("saving %lu as reference value for loops_per_jiffy;"
|
||||||
|
"freq is %u kHz\n", l_p_j_ref, l_p_j_ref_freq);
|
||||||
}
|
}
|
||||||
if ((val == CPUFREQ_PRECHANGE && ci->old < ci->new) ||
|
if ((val == CPUFREQ_PRECHANGE && ci->old < ci->new) ||
|
||||||
(val == CPUFREQ_POSTCHANGE && ci->old > ci->new) ||
|
(val == CPUFREQ_POSTCHANGE && ci->old > ci->new) ||
|
||||||
(val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
|
(val == CPUFREQ_RESUMECHANGE || val == CPUFREQ_SUSPENDCHANGE)) {
|
||||||
loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq, ci->new);
|
loops_per_jiffy = cpufreq_scale(l_p_j_ref, l_p_j_ref_freq,
|
||||||
dprintk("scaling loops_per_jiffy to %lu for frequency %u kHz\n", loops_per_jiffy, ci->new);
|
ci->new);
|
||||||
|
dprintk("scaling loops_per_jiffy to %lu"
|
||||||
|
"for frequency %u kHz\n", loops_per_jiffy, ci->new);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci) { return; }
|
static inline void adjust_jiffies(unsigned long val, struct cpufreq_freqs *ci)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
@ -316,7 +328,8 @@ static int cpufreq_parse_governor (char *str_governor, unsigned int *policy,
|
||||||
if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
|
if (!strnicmp(str_governor, "performance", CPUFREQ_NAME_LEN)) {
|
||||||
*policy = CPUFREQ_POLICY_PERFORMANCE;
|
*policy = CPUFREQ_POLICY_PERFORMANCE;
|
||||||
err = 0;
|
err = 0;
|
||||||
} else if (!strnicmp(str_governor, "powersave", CPUFREQ_NAME_LEN)) {
|
} else if (!strnicmp(str_governor, "powersave",
|
||||||
|
CPUFREQ_NAME_LEN)) {
|
||||||
*policy = CPUFREQ_POLICY_POWERSAVE;
|
*policy = CPUFREQ_POLICY_POWERSAVE;
|
||||||
err = 0;
|
err = 0;
|
||||||
}
|
}
|
||||||
|
@ -328,7 +341,8 @@ static int cpufreq_parse_governor (char *str_governor, unsigned int *policy,
|
||||||
t = __find_governor(str_governor);
|
t = __find_governor(str_governor);
|
||||||
|
|
||||||
if (t == NULL) {
|
if (t == NULL) {
|
||||||
char *name = kasprintf(GFP_KERNEL, "cpufreq_%s", str_governor);
|
char *name = kasprintf(GFP_KERNEL, "cpufreq_%s",
|
||||||
|
str_governor);
|
||||||
|
|
||||||
if (name) {
|
if (name) {
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -361,7 +375,8 @@ extern struct sysdev_class cpu_sysdev_class;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpufreq_per_cpu_attr_read() / show_##file_name() - print out cpufreq information
|
* cpufreq_per_cpu_attr_read() / show_##file_name() -
|
||||||
|
* print out cpufreq information
|
||||||
*
|
*
|
||||||
* Write out information from cpufreq_driver->policy[cpu]; object must be
|
* Write out information from cpufreq_driver->policy[cpu]; object must be
|
||||||
* "unsigned int".
|
* "unsigned int".
|
||||||
|
@ -380,7 +395,8 @@ show_one(scaling_min_freq, min);
|
||||||
show_one(scaling_max_freq, max);
|
show_one(scaling_max_freq, max);
|
||||||
show_one(scaling_cur_freq, cur);
|
show_one(scaling_cur_freq, cur);
|
||||||
|
|
||||||
static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_policy *policy);
|
static int __cpufreq_set_policy(struct cpufreq_policy *data,
|
||||||
|
struct cpufreq_policy *policy);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
|
* cpufreq_per_cpu_attr_write() / store_##file_name() - sysfs write access
|
||||||
|
@ -416,7 +432,8 @@ store_one(scaling_max_freq,max);
|
||||||
/**
|
/**
|
||||||
* show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
|
* show_cpuinfo_cur_freq - current CPU frequency as detected by hardware
|
||||||
*/
|
*/
|
||||||
static ssize_t show_cpuinfo_cur_freq (struct cpufreq_policy * policy, char *buf)
|
static ssize_t show_cpuinfo_cur_freq (struct cpufreq_policy * policy,
|
||||||
|
char *buf)
|
||||||
{
|
{
|
||||||
unsigned int cur_freq = cpufreq_get(policy->cpu);
|
unsigned int cur_freq = cpufreq_get(policy->cpu);
|
||||||
if (!cur_freq)
|
if (!cur_freq)
|
||||||
|
@ -428,7 +445,8 @@ static ssize_t show_cpuinfo_cur_freq (struct cpufreq_policy * policy, char *buf)
|
||||||
/**
|
/**
|
||||||
* show_scaling_governor - show the current policy for the specified CPU
|
* show_scaling_governor - show the current policy for the specified CPU
|
||||||
*/
|
*/
|
||||||
static ssize_t show_scaling_governor (struct cpufreq_policy * policy, char *buf)
|
static ssize_t show_scaling_governor (struct cpufreq_policy * policy,
|
||||||
|
char *buf)
|
||||||
{
|
{
|
||||||
if(policy->policy == CPUFREQ_POLICY_POWERSAVE)
|
if(policy->policy == CPUFREQ_POLICY_POWERSAVE)
|
||||||
return sprintf(buf, "powersave\n");
|
return sprintf(buf, "powersave\n");
|
||||||
|
@ -458,7 +476,8 @@ static ssize_t store_scaling_governor (struct cpufreq_policy * policy,
|
||||||
if (ret != 1)
|
if (ret != 1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (cpufreq_parse_governor(str_governor, &new_policy.policy, &new_policy.governor))
|
if (cpufreq_parse_governor(str_governor, &new_policy.policy,
|
||||||
|
&new_policy.governor))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
lock_cpu_hotplug();
|
lock_cpu_hotplug();
|
||||||
|
@ -474,7 +493,10 @@ static ssize_t store_scaling_governor (struct cpufreq_policy * policy,
|
||||||
|
|
||||||
unlock_cpu_hotplug();
|
unlock_cpu_hotplug();
|
||||||
|
|
||||||
return ret ? ret : count;
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
else
|
||||||
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -488,7 +510,7 @@ static ssize_t show_scaling_driver (struct cpufreq_policy * policy, char *buf)
|
||||||
/**
|
/**
|
||||||
* show_scaling_available_governors - show the available CPUfreq governors
|
* show_scaling_available_governors - show the available CPUfreq governors
|
||||||
*/
|
*/
|
||||||
static ssize_t show_scaling_available_governors (struct cpufreq_policy * policy,
|
static ssize_t show_scaling_available_governors (struct cpufreq_policy *policy,
|
||||||
char *buf)
|
char *buf)
|
||||||
{
|
{
|
||||||
ssize_t i = 0;
|
ssize_t i = 0;
|
||||||
|
@ -574,7 +596,11 @@ static ssize_t show(struct kobject * kobj, struct attribute * attr ,char * buf)
|
||||||
policy = cpufreq_cpu_get(policy->cpu);
|
policy = cpufreq_cpu_get(policy->cpu);
|
||||||
if (!policy)
|
if (!policy)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
ret = fattr->show ? fattr->show(policy,buf) : -EIO;
|
if (fattr->show)
|
||||||
|
ret = fattr->show(policy, buf);
|
||||||
|
else
|
||||||
|
ret = -EIO;
|
||||||
|
|
||||||
cpufreq_cpu_put(policy);
|
cpufreq_cpu_put(policy);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -588,7 +614,11 @@ static ssize_t store(struct kobject * kobj, struct attribute * attr,
|
||||||
policy = cpufreq_cpu_get(policy->cpu);
|
policy = cpufreq_cpu_get(policy->cpu);
|
||||||
if (!policy)
|
if (!policy)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
ret = fattr->store ? fattr->store(policy,buf,count) : -EIO;
|
if (fattr->store)
|
||||||
|
ret = fattr->store(policy, buf, count);
|
||||||
|
else
|
||||||
|
ret = -EIO;
|
||||||
|
|
||||||
cpufreq_cpu_put(policy);
|
cpufreq_cpu_put(policy);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -911,7 +941,8 @@ static void handle_update(void *data)
|
||||||
* We adjust to current frequency first, and need to clean up later. So either call
|
* We adjust to current frequency first, and need to clean up later. So either call
|
||||||
* to cpufreq_update_policy() or schedule handle_update()).
|
* to cpufreq_update_policy() or schedule handle_update()).
|
||||||
*/
|
*/
|
||||||
static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq, unsigned int new_freq)
|
static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq,
|
||||||
|
unsigned int new_freq)
|
||||||
{
|
{
|
||||||
struct cpufreq_freqs freqs;
|
struct cpufreq_freqs freqs;
|
||||||
|
|
||||||
|
@ -936,16 +967,16 @@ static void cpufreq_out_of_sync(unsigned int cpu, unsigned int old_freq, unsigne
|
||||||
unsigned int cpufreq_quick_get(unsigned int cpu)
|
unsigned int cpufreq_quick_get(unsigned int cpu)
|
||||||
{
|
{
|
||||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
||||||
unsigned int ret = 0;
|
unsigned int ret_freq = 0;
|
||||||
|
|
||||||
if (policy) {
|
if (policy) {
|
||||||
mutex_lock(&policy->lock);
|
mutex_lock(&policy->lock);
|
||||||
ret = policy->cur;
|
ret_freq = policy->cur;
|
||||||
mutex_unlock(&policy->lock);
|
mutex_unlock(&policy->lock);
|
||||||
cpufreq_cpu_put(policy);
|
cpufreq_cpu_put(policy);
|
||||||
}
|
}
|
||||||
|
|
||||||
return (ret);
|
return (ret_freq);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cpufreq_quick_get);
|
EXPORT_SYMBOL(cpufreq_quick_get);
|
||||||
|
|
||||||
|
@ -959,7 +990,7 @@ EXPORT_SYMBOL(cpufreq_quick_get);
|
||||||
unsigned int cpufreq_get(unsigned int cpu)
|
unsigned int cpufreq_get(unsigned int cpu)
|
||||||
{
|
{
|
||||||
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
struct cpufreq_policy *policy = cpufreq_cpu_get(cpu);
|
||||||
unsigned int ret = 0;
|
unsigned int ret_freq = 0;
|
||||||
|
|
||||||
if (!policy)
|
if (!policy)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -969,12 +1000,14 @@ unsigned int cpufreq_get(unsigned int cpu)
|
||||||
|
|
||||||
mutex_lock(&policy->lock);
|
mutex_lock(&policy->lock);
|
||||||
|
|
||||||
ret = cpufreq_driver->get(cpu);
|
ret_freq = cpufreq_driver->get(cpu);
|
||||||
|
|
||||||
if (ret && policy->cur && !(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
|
if (ret_freq && policy->cur &&
|
||||||
/* verify no discrepancy between actual and saved value exists */
|
!(cpufreq_driver->flags & CPUFREQ_CONST_LOOPS)) {
|
||||||
if (unlikely(ret != policy->cur)) {
|
/* verify no discrepancy between actual and
|
||||||
cpufreq_out_of_sync(cpu, policy->cur, ret);
|
saved value exists */
|
||||||
|
if (unlikely(ret_freq != policy->cur)) {
|
||||||
|
cpufreq_out_of_sync(cpu, policy->cur, ret_freq);
|
||||||
schedule_work(&policy->update);
|
schedule_work(&policy->update);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -984,7 +1017,7 @@ unsigned int cpufreq_get(unsigned int cpu)
|
||||||
out:
|
out:
|
||||||
cpufreq_cpu_put(policy);
|
cpufreq_cpu_put(policy);
|
||||||
|
|
||||||
return (ret);
|
return (ret_freq);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(cpufreq_get);
|
EXPORT_SYMBOL(cpufreq_get);
|
||||||
|
|
||||||
|
@ -996,7 +1029,7 @@ EXPORT_SYMBOL(cpufreq_get);
|
||||||
static int cpufreq_suspend(struct sys_device * sysdev, pm_message_t pmsg)
|
static int cpufreq_suspend(struct sys_device * sysdev, pm_message_t pmsg)
|
||||||
{
|
{
|
||||||
int cpu = sysdev->id;
|
int cpu = sysdev->id;
|
||||||
unsigned int ret = 0;
|
int ret = 0;
|
||||||
unsigned int cur_freq = 0;
|
unsigned int cur_freq = 0;
|
||||||
struct cpufreq_policy *cpu_policy;
|
struct cpufreq_policy *cpu_policy;
|
||||||
|
|
||||||
|
@ -1078,7 +1111,7 @@ static int cpufreq_suspend(struct sys_device * sysdev, pm_message_t pmsg)
|
||||||
static int cpufreq_resume(struct sys_device * sysdev)
|
static int cpufreq_resume(struct sys_device * sysdev)
|
||||||
{
|
{
|
||||||
int cpu = sysdev->id;
|
int cpu = sysdev->id;
|
||||||
unsigned int ret = 0;
|
int ret = 0;
|
||||||
struct cpufreq_policy *cpu_policy;
|
struct cpufreq_policy *cpu_policy;
|
||||||
|
|
||||||
dprintk("resuming cpu %u\n", cpu);
|
dprintk("resuming cpu %u\n", cpu);
|
||||||
|
@ -1299,17 +1332,20 @@ EXPORT_SYMBOL_GPL(cpufreq_driver_getavg);
|
||||||
* when "event" is CPUFREQ_GOV_LIMITS
|
* when "event" is CPUFREQ_GOV_LIMITS
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int __cpufreq_governor(struct cpufreq_policy *policy, unsigned int event)
|
static int __cpufreq_governor(struct cpufreq_policy *policy,
|
||||||
|
unsigned int event)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (!try_module_get(policy->governor->owner))
|
if (!try_module_get(policy->governor->owner))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
dprintk("__cpufreq_governor for CPU %u, event %u\n", policy->cpu, event);
|
dprintk("__cpufreq_governor for CPU %u, event %u\n",
|
||||||
|
policy->cpu, event);
|
||||||
ret = policy->governor->governor(policy, event);
|
ret = policy->governor->governor(policy, event);
|
||||||
|
|
||||||
/* we keep one module reference alive for each CPU governed by this CPU */
|
/* we keep one module reference alive for
|
||||||
|
each CPU governed by this CPU */
|
||||||
if ((event != CPUFREQ_GOV_START) || ret)
|
if ((event != CPUFREQ_GOV_START) || ret)
|
||||||
module_put(policy->governor->owner);
|
module_put(policy->governor->owner);
|
||||||
if ((event == CPUFREQ_GOV_STOP) && !ret)
|
if ((event == CPUFREQ_GOV_STOP) && !ret)
|
||||||
|
@ -1385,9 +1421,12 @@ EXPORT_SYMBOL(cpufreq_get_policy);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
* data : current policy.
|
||||||
|
* policy : policy to be set.
|
||||||
* Locking: Must be called with the lock_cpu_hotplug() lock held
|
* Locking: Must be called with the lock_cpu_hotplug() lock held
|
||||||
*/
|
*/
|
||||||
static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_policy *policy)
|
static int __cpufreq_set_policy(struct cpufreq_policy *data,
|
||||||
|
struct cpufreq_policy *policy)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
|
@ -1395,7 +1434,8 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
|
||||||
dprintk("setting new policy for CPU %u: %u - %u kHz\n", policy->cpu,
|
dprintk("setting new policy for CPU %u: %u - %u kHz\n", policy->cpu,
|
||||||
policy->min, policy->max);
|
policy->min, policy->max);
|
||||||
|
|
||||||
memcpy(&policy->cpuinfo, &data->cpuinfo, sizeof(struct cpufreq_cpuinfo));
|
memcpy(&policy->cpuinfo, &data->cpuinfo,
|
||||||
|
sizeof(struct cpufreq_cpuinfo));
|
||||||
|
|
||||||
if (policy->min > data->min && policy->min > policy->max) {
|
if (policy->min > data->min && policy->min > policy->max) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
|
@ -1428,7 +1468,8 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
|
||||||
data->min = policy->min;
|
data->min = policy->min;
|
||||||
data->max = policy->max;
|
data->max = policy->max;
|
||||||
|
|
||||||
dprintk("new min and max freqs are %u - %u kHz\n", data->min, data->max);
|
dprintk("new min and max freqs are %u - %u kHz\n",
|
||||||
|
data->min, data->max);
|
||||||
|
|
||||||
if (cpufreq_driver->setpolicy) {
|
if (cpufreq_driver->setpolicy) {
|
||||||
data->policy = policy->policy;
|
data->policy = policy->policy;
|
||||||
|
@ -1449,10 +1490,12 @@ static int __cpufreq_set_policy(struct cpufreq_policy *data, struct cpufreq_poli
|
||||||
data->governor = policy->governor;
|
data->governor = policy->governor;
|
||||||
if (__cpufreq_governor(data, CPUFREQ_GOV_START)) {
|
if (__cpufreq_governor(data, CPUFREQ_GOV_START)) {
|
||||||
/* new governor failed, so re-start old one */
|
/* new governor failed, so re-start old one */
|
||||||
dprintk("starting governor %s failed\n", data->governor->name);
|
dprintk("starting governor %s failed\n",
|
||||||
|
data->governor->name);
|
||||||
if (old_gov) {
|
if (old_gov) {
|
||||||
data->governor = old_gov;
|
data->governor = old_gov;
|
||||||
__cpufreq_governor(data, CPUFREQ_GOV_START);
|
__cpufreq_governor(data,
|
||||||
|
CPUFREQ_GOV_START);
|
||||||
}
|
}
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto error_out;
|
goto error_out;
|
||||||
|
@ -1542,7 +1585,8 @@ int cpufreq_update_policy(unsigned int cpu)
|
||||||
data->cur = policy.cur;
|
data->cur = policy.cur;
|
||||||
} else {
|
} else {
|
||||||
if (data->cur != policy.cur)
|
if (data->cur != policy.cur)
|
||||||
cpufreq_out_of_sync(cpu, data->cur, policy.cur);
|
cpufreq_out_of_sync(cpu, data->cur,
|
||||||
|
policy.cur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1646,8 +1690,10 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
|
||||||
|
|
||||||
/* if all ->init() calls failed, unregister */
|
/* if all ->init() calls failed, unregister */
|
||||||
if (ret) {
|
if (ret) {
|
||||||
dprintk("no CPU initialized for driver %s\n", driver_data->name);
|
dprintk("no CPU initialized for driver %s\n",
|
||||||
sysdev_driver_unregister(&cpu_sysdev_class, &cpufreq_sysdev_driver);
|
driver_data->name);
|
||||||
|
sysdev_driver_unregister(&cpu_sysdev_class,
|
||||||
|
&cpufreq_sysdev_driver);
|
||||||
|
|
||||||
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||||
cpufreq_driver = NULL;
|
cpufreq_driver = NULL;
|
||||||
|
|
|
@ -44,15 +44,17 @@
|
||||||
* latency of the processor. The governor will work on any processor with
|
* latency of the processor. The governor will work on any processor with
|
||||||
* transition latency <= 10mS, using appropriate sampling
|
* transition latency <= 10mS, using appropriate sampling
|
||||||
* rate.
|
* rate.
|
||||||
* For CPUs with transition latency > 10mS (mostly drivers with CPUFREQ_ETERNAL)
|
* For CPUs with transition latency > 10mS (mostly drivers
|
||||||
* this governor will not work.
|
* with CPUFREQ_ETERNAL), this governor will not work.
|
||||||
* All times here are in uS.
|
* All times here are in uS.
|
||||||
*/
|
*/
|
||||||
static unsigned int def_sampling_rate;
|
static unsigned int def_sampling_rate;
|
||||||
#define MIN_SAMPLING_RATE_RATIO (2)
|
#define MIN_SAMPLING_RATE_RATIO (2)
|
||||||
/* for correct statistics, we need at least 10 ticks between each measure */
|
/* for correct statistics, we need at least 10 ticks between each measure */
|
||||||
#define MIN_STAT_SAMPLING_RATE (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
|
#define MIN_STAT_SAMPLING_RATE \
|
||||||
#define MIN_SAMPLING_RATE (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
|
(MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
|
||||||
|
#define MIN_SAMPLING_RATE \
|
||||||
|
(def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
|
||||||
#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
|
#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
|
||||||
#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
|
#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
|
||||||
#define DEF_SAMPLING_DOWN_FACTOR (1)
|
#define DEF_SAMPLING_DOWN_FACTOR (1)
|
||||||
|
@ -103,11 +105,16 @@ static struct dbs_tuners dbs_tuners_ins = {
|
||||||
|
|
||||||
static inline unsigned int get_cpu_idle_time(unsigned int cpu)
|
static inline unsigned int get_cpu_idle_time(unsigned int cpu)
|
||||||
{
|
{
|
||||||
return kstat_cpu(cpu).cpustat.idle +
|
unsigned int add_nice = 0, ret;
|
||||||
|
|
||||||
|
if (dbs_tuners_ins.ignore_nice)
|
||||||
|
add_nice = kstat_cpu(cpu).cpustat.nice;
|
||||||
|
|
||||||
|
ret = kstat_cpu(cpu).cpustat.idle +
|
||||||
kstat_cpu(cpu).cpustat.iowait +
|
kstat_cpu(cpu).cpustat.iowait +
|
||||||
( dbs_tuners_ins.ignore_nice ?
|
add_nice;
|
||||||
kstat_cpu(cpu).cpustat.nice :
|
|
||||||
0);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/************************** sysfs interface ************************/
|
/************************** sysfs interface ************************/
|
||||||
|
|
|
@ -41,8 +41,10 @@
|
||||||
static unsigned int def_sampling_rate;
|
static unsigned int def_sampling_rate;
|
||||||
#define MIN_SAMPLING_RATE_RATIO (2)
|
#define MIN_SAMPLING_RATE_RATIO (2)
|
||||||
/* for correct statistics, we need at least 10 ticks between each measure */
|
/* for correct statistics, we need at least 10 ticks between each measure */
|
||||||
#define MIN_STAT_SAMPLING_RATE (MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
|
#define MIN_STAT_SAMPLING_RATE \
|
||||||
#define MIN_SAMPLING_RATE (def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
|
(MIN_SAMPLING_RATE_RATIO * jiffies_to_usecs(10))
|
||||||
|
#define MIN_SAMPLING_RATE \
|
||||||
|
(def_sampling_rate / MIN_SAMPLING_RATE_RATIO)
|
||||||
#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
|
#define MAX_SAMPLING_RATE (500 * def_sampling_rate)
|
||||||
#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
|
#define DEF_SAMPLING_RATE_LATENCY_MULTIPLIER (1000)
|
||||||
#define TRANSITION_LATENCY_LIMIT (10 * 1000)
|
#define TRANSITION_LATENCY_LIMIT (10 * 1000)
|
||||||
|
@ -202,7 +204,8 @@ static ssize_t store_sampling_rate(struct cpufreq_policy *unused,
|
||||||
ret = sscanf(buf, "%u", &input);
|
ret = sscanf(buf, "%u", &input);
|
||||||
|
|
||||||
mutex_lock(&dbs_mutex);
|
mutex_lock(&dbs_mutex);
|
||||||
if (ret != 1 || input > MAX_SAMPLING_RATE || input < MIN_SAMPLING_RATE) {
|
if (ret != 1 || input > MAX_SAMPLING_RATE
|
||||||
|
|| input < MIN_SAMPLING_RATE) {
|
||||||
mutex_unlock(&dbs_mutex);
|
mutex_unlock(&dbs_mutex);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
@ -496,7 +499,8 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy,
|
||||||
if (dbs_enable == 1) {
|
if (dbs_enable == 1) {
|
||||||
kondemand_wq = create_workqueue("kondemand");
|
kondemand_wq = create_workqueue("kondemand");
|
||||||
if (!kondemand_wq) {
|
if (!kondemand_wq) {
|
||||||
printk(KERN_ERR "Creation of kondemand failed\n");
|
printk(KERN_ERR
|
||||||
|
"Creation of kondemand failed\n");
|
||||||
dbs_enable--;
|
dbs_enable--;
|
||||||
mutex_unlock(&dbs_mutex);
|
mutex_unlock(&dbs_mutex);
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
|
|
|
@ -15,7 +15,8 @@
|
||||||
#include <linux/cpufreq.h>
|
#include <linux/cpufreq.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "performance", msg)
|
#define dprintk(msg...) \
|
||||||
|
cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "performance", msg)
|
||||||
|
|
||||||
|
|
||||||
static int cpufreq_governor_performance(struct cpufreq_policy *policy,
|
static int cpufreq_governor_performance(struct cpufreq_policy *policy,
|
||||||
|
@ -24,8 +25,10 @@ static int cpufreq_governor_performance(struct cpufreq_policy *policy,
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case CPUFREQ_GOV_START:
|
case CPUFREQ_GOV_START:
|
||||||
case CPUFREQ_GOV_LIMITS:
|
case CPUFREQ_GOV_LIMITS:
|
||||||
dprintk("setting to %u kHz because of event %u\n", policy->max, event);
|
dprintk("setting to %u kHz because of event %u\n",
|
||||||
__cpufreq_driver_target(policy, policy->max, CPUFREQ_RELATION_H);
|
policy->max, event);
|
||||||
|
__cpufreq_driver_target(policy, policy->max,
|
||||||
|
CPUFREQ_RELATION_H);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -15,7 +15,8 @@
|
||||||
#include <linux/cpufreq.h>
|
#include <linux/cpufreq.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
|
||||||
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "powersave", msg)
|
#define dprintk(msg...) \
|
||||||
|
cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "powersave", msg)
|
||||||
|
|
||||||
static int cpufreq_governor_powersave(struct cpufreq_policy *policy,
|
static int cpufreq_governor_powersave(struct cpufreq_policy *policy,
|
||||||
unsigned int event)
|
unsigned int event)
|
||||||
|
@ -23,8 +24,10 @@ static int cpufreq_governor_powersave(struct cpufreq_policy *policy,
|
||||||
switch (event) {
|
switch (event) {
|
||||||
case CPUFREQ_GOV_START:
|
case CPUFREQ_GOV_START:
|
||||||
case CPUFREQ_GOV_LIMITS:
|
case CPUFREQ_GOV_LIMITS:
|
||||||
dprintk("setting to %u kHz because of event %u\n", policy->min, event);
|
dprintk("setting to %u kHz because of event %u\n",
|
||||||
__cpufreq_driver_target(policy, policy->min, CPUFREQ_RELATION_L);
|
policy->min, event);
|
||||||
|
__cpufreq_driver_target(policy, policy->min,
|
||||||
|
CPUFREQ_RELATION_L);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -351,8 +351,8 @@ __init cpufreq_stats_init(void)
|
||||||
|
|
||||||
register_hotcpu_notifier(&cpufreq_stat_cpu_notifier);
|
register_hotcpu_notifier(&cpufreq_stat_cpu_notifier);
|
||||||
for_each_online_cpu(cpu) {
|
for_each_online_cpu(cpu) {
|
||||||
cpufreq_stat_cpu_callback(&cpufreq_stat_cpu_notifier, CPU_ONLINE,
|
cpufreq_stat_cpu_callback(&cpufreq_stat_cpu_notifier,
|
||||||
(void *)(long)cpu);
|
CPU_ONLINE, (void *)(long)cpu);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -368,14 +368,15 @@ __exit cpufreq_stats_exit(void)
|
||||||
unregister_hotcpu_notifier(&cpufreq_stat_cpu_notifier);
|
unregister_hotcpu_notifier(&cpufreq_stat_cpu_notifier);
|
||||||
lock_cpu_hotplug();
|
lock_cpu_hotplug();
|
||||||
for_each_online_cpu(cpu) {
|
for_each_online_cpu(cpu) {
|
||||||
cpufreq_stat_cpu_callback(&cpufreq_stat_cpu_notifier, CPU_DEAD,
|
cpufreq_stat_cpu_callback(&cpufreq_stat_cpu_notifier,
|
||||||
(void *)(long)cpu);
|
CPU_DEAD, (void *)(long)cpu);
|
||||||
}
|
}
|
||||||
unlock_cpu_hotplug();
|
unlock_cpu_hotplug();
|
||||||
}
|
}
|
||||||
|
|
||||||
MODULE_AUTHOR ("Zou Nan hai <nanhai.zou@intel.com>");
|
MODULE_AUTHOR ("Zou Nan hai <nanhai.zou@intel.com>");
|
||||||
MODULE_DESCRIPTION ("'cpufreq_stats' - A driver to export cpufreq stats through sysfs filesystem");
|
MODULE_DESCRIPTION ("'cpufreq_stats' - A driver to export cpufreq stats"
|
||||||
|
"through sysfs filesystem");
|
||||||
MODULE_LICENSE ("GPL");
|
MODULE_LICENSE ("GPL");
|
||||||
|
|
||||||
module_init(cpufreq_stats_init);
|
module_init(cpufreq_stats_init);
|
||||||
|
|
|
@ -9,7 +9,8 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/cpufreq.h>
|
#include <linux/cpufreq.h>
|
||||||
|
|
||||||
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_CORE, "freq-table", msg)
|
#define dprintk(msg...) \
|
||||||
|
cpufreq_debug_printk(CPUFREQ_DEBUG_CORE, "freq-table", msg)
|
||||||
|
|
||||||
/*********************************************************************
|
/*********************************************************************
|
||||||
* FREQUENCY TABLE HELPERS *
|
* FREQUENCY TABLE HELPERS *
|
||||||
|
@ -29,7 +30,8 @@ int cpufreq_frequency_table_cpuinfo(struct cpufreq_policy *policy,
|
||||||
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
dprintk("table entry %u: %u kHz, %u index\n", i, freq, table[i].index);
|
dprintk("table entry %u: %u kHz, %u index\n",
|
||||||
|
i, freq, table[i].index);
|
||||||
if (freq < min_freq)
|
if (freq < min_freq)
|
||||||
min_freq = freq;
|
min_freq = freq;
|
||||||
if (freq > max_freq)
|
if (freq > max_freq)
|
||||||
|
@ -54,13 +56,14 @@ int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
unsigned int count = 0;
|
unsigned int count = 0;
|
||||||
|
|
||||||
dprintk("request for verification of policy (%u - %u kHz) for cpu %u\n", policy->min, policy->max, policy->cpu);
|
dprintk("request for verification of policy (%u - %u kHz) for cpu %u\n",
|
||||||
|
policy->min, policy->max, policy->cpu);
|
||||||
|
|
||||||
if (!cpu_online(policy->cpu))
|
if (!cpu_online(policy->cpu))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
cpufreq_verify_within_limits(policy,
|
cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
|
||||||
policy->cpuinfo.min_freq, policy->cpuinfo.max_freq);
|
policy->cpuinfo.max_freq);
|
||||||
|
|
||||||
for (i=0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
|
for (i=0; (table[i].frequency != CPUFREQ_TABLE_END); i++) {
|
||||||
unsigned int freq = table[i].frequency;
|
unsigned int freq = table[i].frequency;
|
||||||
|
@ -75,10 +78,11 @@ int cpufreq_frequency_table_verify(struct cpufreq_policy *policy,
|
||||||
if (!count)
|
if (!count)
|
||||||
policy->max = next_larger;
|
policy->max = next_larger;
|
||||||
|
|
||||||
cpufreq_verify_within_limits(policy,
|
cpufreq_verify_within_limits(policy, policy->cpuinfo.min_freq,
|
||||||
policy->cpuinfo.min_freq, policy->cpuinfo.max_freq);
|
policy->cpuinfo.max_freq);
|
||||||
|
|
||||||
dprintk("verification lead to (%u - %u kHz) for cpu %u\n", policy->min, policy->max, policy->cpu);
|
dprintk("verification lead to (%u - %u kHz) for cpu %u\n",
|
||||||
|
policy->min, policy->max, policy->cpu);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -101,7 +105,8 @@ int cpufreq_frequency_table_target(struct cpufreq_policy *policy,
|
||||||
};
|
};
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
dprintk("request for target %u kHz (relation: %u) for cpu %u\n", target_freq, relation, policy->cpu);
|
dprintk("request for target %u kHz (relation: %u) for cpu %u\n",
|
||||||
|
target_freq, relation, policy->cpu);
|
||||||
|
|
||||||
switch (relation) {
|
switch (relation) {
|
||||||
case CPUFREQ_RELATION_H:
|
case CPUFREQ_RELATION_H:
|
||||||
|
@ -192,7 +197,10 @@ static ssize_t show_available_freqs (struct cpufreq_policy *policy, char *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
|
struct freq_attr cpufreq_freq_attr_scaling_available_freqs = {
|
||||||
.attr = { .name = "scaling_available_frequencies", .mode = 0444, .owner=THIS_MODULE },
|
.attr = { .name = "scaling_available_frequencies",
|
||||||
|
.mode = 0444,
|
||||||
|
.owner=THIS_MODULE
|
||||||
|
},
|
||||||
.show = show_available_freqs,
|
.show = show_available_freqs,
|
||||||
};
|
};
|
||||||
EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
|
EXPORT_SYMBOL_GPL(cpufreq_freq_attr_scaling_available_freqs);
|
||||||
|
|
Loading…
Reference in a new issue