Merge master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq
* master.kernel.org:/pub/scm/linux/kernel/git/davej/cpufreq: [CPUFREQ] Fix sysfs_create_file return value handling [CPUFREQ] ondemand: fix tickless accounting and software coordination bug [CPUFREQ] ondemand: add a check to avoid negative load calculation [CPUFREQ] Keep userspace governor quiet when it is not being used [CPUFREQ] Longhaul - Proper register access [CPUFREQ] Kconfig powernow-k8 driver should depend on ACPI P-States driver [CPUFREQ] Longhaul - Replace ACPI functions with direct I/O [CPUFREQ] Longhaul - Remove duplicate multipliers [CPUFREQ] Longhaul - Embedded "conservative" [CPUFREQ] acpi-cpufreq: Proper ReadModifyWrite of PERF_CTL MSR [CPUFREQ] check return value of sysfs_create_file [CPUFREQ] Longhaul - Check ACPI "BM DMA in progress" bit [CPUFREQ] Longhaul - Move old_ratio to correct place [CPUFREQ] Longhaul - VT8237 support [CPUFREQ] Longhaul - Use all kinds of support [CPUFREQ] powernow-k8: clarify number of cores.
This commit is contained in:
@@ -826,13 +826,21 @@ static int cpufreq_add_dev (struct sys_device * sys_dev)
|
||||
/* set up files for this cpu device */
|
||||
drv_attr = cpufreq_driver->attr;
|
||||
while ((drv_attr) && (*drv_attr)) {
|
||||
sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
|
||||
ret = sysfs_create_file(&policy->kobj, &((*drv_attr)->attr));
|
||||
if (ret)
|
||||
goto err_out_driver_exit;
|
||||
drv_attr++;
|
||||
}
|
||||
if (cpufreq_driver->get)
|
||||
sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
|
||||
if (cpufreq_driver->target)
|
||||
sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
|
||||
if (cpufreq_driver->get){
|
||||
ret = sysfs_create_file(&policy->kobj, &cpuinfo_cur_freq.attr);
|
||||
if (ret)
|
||||
goto err_out_driver_exit;
|
||||
}
|
||||
if (cpufreq_driver->target){
|
||||
ret = sysfs_create_file(&policy->kobj, &scaling_cur_freq.attr);
|
||||
if (ret)
|
||||
goto err_out_driver_exit;
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&cpufreq_driver_lock, flags);
|
||||
for_each_cpu_mask(j, policy->cpus) {
|
||||
|
||||
@@ -96,15 +96,25 @@ static struct dbs_tuners {
|
||||
|
||||
static inline cputime64_t get_cpu_idle_time(unsigned int cpu)
|
||||
{
|
||||
cputime64_t retval;
|
||||
cputime64_t idle_time;
|
||||
cputime64_t cur_jiffies;
|
||||
cputime64_t busy_time;
|
||||
|
||||
retval = cputime64_add(kstat_cpu(cpu).cpustat.idle,
|
||||
kstat_cpu(cpu).cpustat.iowait);
|
||||
cur_jiffies = jiffies64_to_cputime64(get_jiffies_64());
|
||||
busy_time = cputime64_add(kstat_cpu(cpu).cpustat.user,
|
||||
kstat_cpu(cpu).cpustat.system);
|
||||
|
||||
if (dbs_tuners_ins.ignore_nice)
|
||||
retval = cputime64_add(retval, kstat_cpu(cpu).cpustat.nice);
|
||||
busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.irq);
|
||||
busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.softirq);
|
||||
busy_time = cputime64_add(busy_time, kstat_cpu(cpu).cpustat.steal);
|
||||
|
||||
return retval;
|
||||
if (!dbs_tuners_ins.ignore_nice) {
|
||||
busy_time = cputime64_add(busy_time,
|
||||
kstat_cpu(cpu).cpustat.nice);
|
||||
}
|
||||
|
||||
idle_time = cputime64_sub(cur_jiffies, busy_time);
|
||||
return idle_time;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -325,7 +335,7 @@ static struct attribute_group dbs_attr_group = {
|
||||
static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
|
||||
{
|
||||
unsigned int idle_ticks, total_ticks;
|
||||
unsigned int load;
|
||||
unsigned int load = 0;
|
||||
cputime64_t cur_jiffies;
|
||||
|
||||
struct cpufreq_policy *policy;
|
||||
@@ -339,7 +349,8 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
|
||||
cur_jiffies = jiffies64_to_cputime64(get_jiffies_64());
|
||||
total_ticks = (unsigned int) cputime64_sub(cur_jiffies,
|
||||
this_dbs_info->prev_cpu_wall);
|
||||
this_dbs_info->prev_cpu_wall = cur_jiffies;
|
||||
this_dbs_info->prev_cpu_wall = get_jiffies_64();
|
||||
|
||||
if (!total_ticks)
|
||||
return;
|
||||
/*
|
||||
@@ -370,7 +381,8 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info)
|
||||
if (tmp_idle_ticks < idle_ticks)
|
||||
idle_ticks = tmp_idle_ticks;
|
||||
}
|
||||
load = (100 * (total_ticks - idle_ticks)) / total_ticks;
|
||||
if (likely(total_ticks > idle_ticks))
|
||||
load = (100 * (total_ticks - idle_ticks)) / total_ticks;
|
||||
|
||||
/* Check for frequency increase */
|
||||
if (load > dbs_tuners_ins.up_threshold) {
|
||||
|
||||
@@ -37,6 +37,7 @@ static unsigned int cpu_set_freq[NR_CPUS]; /* CPU freq desired by userspace */
|
||||
static unsigned int cpu_is_managed[NR_CPUS];
|
||||
|
||||
static DEFINE_MUTEX (userspace_mutex);
|
||||
static int cpus_using_userspace_governor;
|
||||
|
||||
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_GOVERNOR, "userspace", msg)
|
||||
|
||||
@@ -47,7 +48,11 @@ userspace_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
|
||||
{
|
||||
struct cpufreq_freqs *freq = data;
|
||||
|
||||
dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n", freq->cpu, freq->new);
|
||||
if (!cpu_is_managed[freq->cpu])
|
||||
return 0;
|
||||
|
||||
dprintk("saving cpu_cur_freq of cpu %u to be %u kHz\n",
|
||||
freq->cpu, freq->new);
|
||||
cpu_cur_freq[freq->cpu] = freq->new;
|
||||
|
||||
return 0;
|
||||
@@ -142,6 +147,13 @@ static int cpufreq_governor_userspace(struct cpufreq_policy *policy,
|
||||
if (rc)
|
||||
goto start_out;
|
||||
|
||||
if (cpus_using_userspace_governor == 0) {
|
||||
cpufreq_register_notifier(
|
||||
&userspace_cpufreq_notifier_block,
|
||||
CPUFREQ_TRANSITION_NOTIFIER);
|
||||
}
|
||||
cpus_using_userspace_governor++;
|
||||
|
||||
cpu_is_managed[cpu] = 1;
|
||||
cpu_min_freq[cpu] = policy->min;
|
||||
cpu_max_freq[cpu] = policy->max;
|
||||
@@ -153,6 +165,13 @@ start_out:
|
||||
break;
|
||||
case CPUFREQ_GOV_STOP:
|
||||
mutex_lock(&userspace_mutex);
|
||||
cpus_using_userspace_governor--;
|
||||
if (cpus_using_userspace_governor == 0) {
|
||||
cpufreq_unregister_notifier(
|
||||
&userspace_cpufreq_notifier_block,
|
||||
CPUFREQ_TRANSITION_NOTIFIER);
|
||||
}
|
||||
|
||||
cpu_is_managed[cpu] = 0;
|
||||
cpu_min_freq[cpu] = 0;
|
||||
cpu_max_freq[cpu] = 0;
|
||||
@@ -198,7 +217,6 @@ EXPORT_SYMBOL(cpufreq_gov_userspace);
|
||||
|
||||
static int __init cpufreq_gov_userspace_init(void)
|
||||
{
|
||||
cpufreq_register_notifier(&userspace_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
|
||||
return cpufreq_register_governor(&cpufreq_gov_userspace);
|
||||
}
|
||||
|
||||
@@ -206,7 +224,6 @@ static int __init cpufreq_gov_userspace_init(void)
|
||||
static void __exit cpufreq_gov_userspace_exit(void)
|
||||
{
|
||||
cpufreq_unregister_governor(&cpufreq_gov_userspace);
|
||||
cpufreq_unregister_notifier(&userspace_cpufreq_notifier_block, CPUFREQ_TRANSITION_NOTIFIER);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user