cpufreq: Move common part from governors to separate file, v2
Multiple cpufreq governers have defined similar get_cpu_idle_time_***() routines. These routines must be moved to some common place, so that all governors can use them. So moving them to cpufreq_governor.c, which seems to be a better place for keeping these routines. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
This commit is contained in:
parent
4b972f0b04
commit
2aacdfff9c
5 changed files with 59 additions and 70 deletions
|
@ -7,8 +7,8 @@ obj-$(CONFIG_CPU_FREQ_STAT) += cpufreq_stats.o
|
||||||
obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE) += cpufreq_performance.o
|
obj-$(CONFIG_CPU_FREQ_GOV_PERFORMANCE) += cpufreq_performance.o
|
||||||
obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE) += cpufreq_powersave.o
|
obj-$(CONFIG_CPU_FREQ_GOV_POWERSAVE) += cpufreq_powersave.o
|
||||||
obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o
|
obj-$(CONFIG_CPU_FREQ_GOV_USERSPACE) += cpufreq_userspace.o
|
||||||
obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o
|
obj-$(CONFIG_CPU_FREQ_GOV_ONDEMAND) += cpufreq_ondemand.o cpufreq_governor.o
|
||||||
obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o
|
obj-$(CONFIG_CPU_FREQ_GOV_CONSERVATIVE) += cpufreq_conservative.o cpufreq_governor.o
|
||||||
|
|
||||||
# CPUfreq cross-arch helpers
|
# CPUfreq cross-arch helpers
|
||||||
obj-$(CONFIG_CPU_FREQ_TABLE) += freq_table.o
|
obj-$(CONFIG_CPU_FREQ_TABLE) += freq_table.o
|
||||||
|
|
|
@ -95,40 +95,6 @@ static struct dbs_tuners {
|
||||||
.freq_step = 5,
|
.freq_step = 5,
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
|
|
||||||
{
|
|
||||||
u64 idle_time;
|
|
||||||
u64 cur_wall_time;
|
|
||||||
u64 busy_time;
|
|
||||||
|
|
||||||
cur_wall_time = jiffies64_to_cputime64(get_jiffies_64());
|
|
||||||
|
|
||||||
busy_time = kcpustat_cpu(cpu).cpustat[CPUTIME_USER];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];
|
|
||||||
|
|
||||||
idle_time = cur_wall_time - busy_time;
|
|
||||||
if (wall)
|
|
||||||
*wall = jiffies_to_usecs(cur_wall_time);
|
|
||||||
|
|
||||||
return jiffies_to_usecs(idle_time);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline cputime64_t get_cpu_idle_time(unsigned int cpu, cputime64_t *wall)
|
|
||||||
{
|
|
||||||
u64 idle_time = get_cpu_idle_time_us(cpu, NULL);
|
|
||||||
|
|
||||||
if (idle_time == -1ULL)
|
|
||||||
return get_cpu_idle_time_jiffy(cpu, wall);
|
|
||||||
else
|
|
||||||
idle_time += get_cpu_iowait_time_us(cpu, wall);
|
|
||||||
|
|
||||||
return idle_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* keep track of frequency transitions */
|
/* keep track of frequency transitions */
|
||||||
static int
|
static int
|
||||||
dbs_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
|
dbs_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
|
||||||
|
|
52
drivers/cpufreq/cpufreq_governor.c
Normal file
52
drivers/cpufreq/cpufreq_governor.c
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
/*
|
||||||
|
* drivers/cpufreq/cpufreq_governor.c
|
||||||
|
*
|
||||||
|
* CPUFREQ governors common code
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm/cputime.h>
|
||||||
|
#include <linux/export.h>
|
||||||
|
#include <linux/kernel_stat.h>
|
||||||
|
#include <linux/tick.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
/*
|
||||||
|
* Code picked from earlier governer implementations
|
||||||
|
*/
|
||||||
|
static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
|
||||||
|
{
|
||||||
|
u64 idle_time;
|
||||||
|
u64 cur_wall_time;
|
||||||
|
u64 busy_time;
|
||||||
|
|
||||||
|
cur_wall_time = jiffies64_to_cputime64(get_jiffies_64());
|
||||||
|
|
||||||
|
busy_time = kcpustat_cpu(cpu).cpustat[CPUTIME_USER];
|
||||||
|
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];
|
||||||
|
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];
|
||||||
|
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];
|
||||||
|
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
|
||||||
|
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];
|
||||||
|
|
||||||
|
idle_time = cur_wall_time - busy_time;
|
||||||
|
if (wall)
|
||||||
|
*wall = jiffies_to_usecs(cur_wall_time);
|
||||||
|
|
||||||
|
return jiffies_to_usecs(idle_time);
|
||||||
|
}
|
||||||
|
|
||||||
|
cputime64_t get_cpu_idle_time(unsigned int cpu, cputime64_t *wall)
|
||||||
|
{
|
||||||
|
u64 idle_time = get_cpu_idle_time_us(cpu, NULL);
|
||||||
|
|
||||||
|
if (idle_time == -1ULL)
|
||||||
|
return get_cpu_idle_time_jiffy(cpu, wall);
|
||||||
|
else
|
||||||
|
idle_time += get_cpu_iowait_time_us(cpu, wall);
|
||||||
|
|
||||||
|
return idle_time;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(get_cpu_idle_time);
|
|
@ -119,40 +119,6 @@ static struct dbs_tuners {
|
||||||
.powersave_bias = 0,
|
.powersave_bias = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
|
|
||||||
{
|
|
||||||
u64 idle_time;
|
|
||||||
u64 cur_wall_time;
|
|
||||||
u64 busy_time;
|
|
||||||
|
|
||||||
cur_wall_time = jiffies64_to_cputime64(get_jiffies_64());
|
|
||||||
|
|
||||||
busy_time = kcpustat_cpu(cpu).cpustat[CPUTIME_USER];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
|
|
||||||
busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];
|
|
||||||
|
|
||||||
idle_time = cur_wall_time - busy_time;
|
|
||||||
if (wall)
|
|
||||||
*wall = jiffies_to_usecs(cur_wall_time);
|
|
||||||
|
|
||||||
return jiffies_to_usecs(idle_time);
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline cputime64_t get_cpu_idle_time(unsigned int cpu, cputime64_t *wall)
|
|
||||||
{
|
|
||||||
u64 idle_time = get_cpu_idle_time_us(cpu, NULL);
|
|
||||||
|
|
||||||
if (idle_time == -1ULL)
|
|
||||||
return get_cpu_idle_time_jiffy(cpu, wall);
|
|
||||||
else
|
|
||||||
idle_time += get_cpu_iowait_time_us(cpu, wall);
|
|
||||||
|
|
||||||
return idle_time;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline cputime64_t get_cpu_iowait_time(unsigned int cpu, cputime64_t *wall)
|
static inline cputime64_t get_cpu_iowait_time(unsigned int cpu, cputime64_t *wall)
|
||||||
{
|
{
|
||||||
u64 iowait_time = get_cpu_iowait_time_us(cpu, wall);
|
u64 iowait_time = get_cpu_iowait_time_us(cpu, wall);
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
#ifndef _LINUX_CPUFREQ_H
|
#ifndef _LINUX_CPUFREQ_H
|
||||||
#define _LINUX_CPUFREQ_H
|
#define _LINUX_CPUFREQ_H
|
||||||
|
|
||||||
|
#include <asm/cputime.h>
|
||||||
#include <linux/mutex.h>
|
#include <linux/mutex.h>
|
||||||
#include <linux/notifier.h>
|
#include <linux/notifier.h>
|
||||||
#include <linux/threads.h>
|
#include <linux/threads.h>
|
||||||
|
@ -407,5 +408,9 @@ void cpufreq_frequency_table_get_attr(struct cpufreq_frequency_table *table,
|
||||||
|
|
||||||
void cpufreq_frequency_table_put_attr(unsigned int cpu);
|
void cpufreq_frequency_table_put_attr(unsigned int cpu);
|
||||||
|
|
||||||
|
/*********************************************************************
|
||||||
|
* Governor Helpers *
|
||||||
|
*********************************************************************/
|
||||||
|
cputime64_t get_cpu_idle_time(unsigned int cpu, cputime64_t *wall);
|
||||||
|
|
||||||
#endif /* _LINUX_CPUFREQ_H */
|
#endif /* _LINUX_CPUFREQ_H */
|
||||||
|
|
Loading…
Add table
Reference in a new issue