diff options
Diffstat (limited to 'drivers/cpufreq/cpufreq_governor.c')
-rw-r--r-- | drivers/cpufreq/cpufreq_governor.c | 50 |
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 | ||
33 | static 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 | |||
41 | static struct attribute_group *get_sysfs_attr(struct dbs_data *dbs_data) | 32 | static 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 | ||
49 | static 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 | |||
71 | u64 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 | } | ||
82 | EXPORT_SYMBOL_GPL(get_cpu_idle_time); | ||
83 | |||
84 | void dbs_check_cpu(struct dbs_data *dbs_data, int cpu) | 40 | void 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; |