aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq_governor.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/cpufreq/cpufreq_governor.c')
-rw-r--r--drivers/cpufreq/cpufreq_governor.c50
1 files changed, 6 insertions, 44 deletions
diff --git a/drivers/cpufreq/cpufreq_governor.c b/drivers/cpufreq/cpufreq_governor.c
index dc9b72e25c1a..a849b2d499fa 100644
--- a/drivers/cpufreq/cpufreq_governor.c
+++ b/drivers/cpufreq/cpufreq_governor.c
@@ -23,21 +23,12 @@
23#include <linux/kernel_stat.h> 23#include <linux/kernel_stat.h>
24#include <linux/mutex.h> 24#include <linux/mutex.h>
25#include <linux/slab.h> 25#include <linux/slab.h>
26#include <linux/tick.h>
27#include <linux/types.h> 26#include <linux/types.h>
28#include <linux/workqueue.h> 27#include <linux/workqueue.h>
29#include <linux/cpu.h> 28#include <linux/cpu.h>
30 29
31#include "cpufreq_governor.h" 30#include "cpufreq_governor.h"
32 31
33static struct kobject *get_governor_parent_kobj(struct cpufreq_policy *policy)
34{
35 if (have_governor_per_policy())
36 return &policy->kobj;
37 else
38 return cpufreq_global_kobject;
39}
40
41static struct attribute_group *get_sysfs_attr(struct dbs_data *dbs_data) 32static struct attribute_group *get_sysfs_attr(struct dbs_data *dbs_data)
42{ 33{
43 if (have_governor_per_policy()) 34 if (have_governor_per_policy())
@@ -46,41 +37,6 @@ static struct attribute_group *get_sysfs_attr(struct dbs_data *dbs_data)
46 return dbs_data->cdata->attr_group_gov_sys; 37 return dbs_data->cdata->attr_group_gov_sys;
47} 38}
48 39
49static inline u64 get_cpu_idle_time_jiffy(unsigned int cpu, u64 *wall)
50{
51 u64 idle_time;
52 u64 cur_wall_time;
53 u64 busy_time;
54
55 cur_wall_time = jiffies64_to_cputime64(get_jiffies_64());
56
57 busy_time = kcpustat_cpu(cpu).cpustat[CPUTIME_USER];
58 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SYSTEM];
59 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_IRQ];
60 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_SOFTIRQ];
61 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_STEAL];
62 busy_time += kcpustat_cpu(cpu).cpustat[CPUTIME_NICE];
63
64 idle_time = cur_wall_time - busy_time;
65 if (wall)
66 *wall = cputime_to_usecs(cur_wall_time);
67
68 return cputime_to_usecs(idle_time);
69}
70
71u64 get_cpu_idle_time(unsigned int cpu, u64 *wall, int io_busy)
72{
73 u64 idle_time = get_cpu_idle_time_us(cpu, io_busy ? wall : NULL);
74
75 if (idle_time == -1ULL)
76 return get_cpu_idle_time_jiffy(cpu, wall);
77 else if (!io_busy)
78 idle_time += get_cpu_iowait_time_us(cpu, wall);
79
80 return idle_time;
81}
82EXPORT_SYMBOL_GPL(get_cpu_idle_time);
83
84void dbs_check_cpu(struct dbs_data *dbs_data, int cpu) 40void dbs_check_cpu(struct dbs_data *dbs_data, int cpu)
85{ 41{
86 struct cpu_dbs_common_info *cdbs = dbs_data->cdata->get_cpu_cdbs(cpu); 42 struct cpu_dbs_common_info *cdbs = dbs_data->cdata->get_cpu_cdbs(cpu);
@@ -278,6 +234,9 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
278 return rc; 234 return rc;
279 } 235 }
280 236
237 if (!have_governor_per_policy())
238 WARN_ON(cpufreq_get_global_kobject());
239
281 rc = sysfs_create_group(get_governor_parent_kobj(policy), 240 rc = sysfs_create_group(get_governor_parent_kobj(policy),
282 get_sysfs_attr(dbs_data)); 241 get_sysfs_attr(dbs_data));
283 if (rc) { 242 if (rc) {
@@ -316,6 +275,9 @@ int cpufreq_governor_dbs(struct cpufreq_policy *policy,
316 sysfs_remove_group(get_governor_parent_kobj(policy), 275 sysfs_remove_group(get_governor_parent_kobj(policy),
317 get_sysfs_attr(dbs_data)); 276 get_sysfs_attr(dbs_data));
318 277
278 if (!have_governor_per_policy())
279 cpufreq_put_global_kobject();
280
319 if ((dbs_data->cdata->governor == GOV_CONSERVATIVE) && 281 if ((dbs_data->cdata->governor == GOV_CONSERVATIVE) &&
320 (policy->governor->initialized == 1)) { 282 (policy->governor->initialized == 1)) {
321 struct cs_ops *cs_ops = dbs_data->cdata->gov_ops; 283 struct cs_ops *cs_ops = dbs_data->cdata->gov_ops;