aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/cpufreq/cpufreq_governor.h
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-03-14 09:22:03 -0400
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>2016-03-14 09:22:03 -0400
commit4ed39004271280d2b5fc6929b2782c0e330f6895 (patch)
treed0f3bc36dd0598bf6d9d7f7321992111f349bfb3 /drivers/cpufreq/cpufreq_governor.h
parentb5d5fad9bed079a4f182e4d282ca29380e8c08f2 (diff)
parent4fec7ad5f637159525265a45f66482cf8817b45f (diff)
Merge branch 'pm-cpufreq'
* pm-cpufreq: (94 commits) intel_pstate: Do not skip samples partially intel_pstate: Remove freq calculation from intel_pstate_calc_busy() intel_pstate: Move intel_pstate_calc_busy() into get_target_pstate_use_performance() intel_pstate: Optimize calculation for max/min_perf_adj intel_pstate: Remove extra conversions in pid calculation cpufreq: Move scheduler-related code to the sched directory Revert "cpufreq: postfix policy directory with the first CPU in related_cpus" cpufreq: Reduce cpufreq_update_util() overhead a bit cpufreq: Select IRQ_WORK if CPU_FREQ_GOV_COMMON is set cpufreq: Remove 'policy->governor_enabled' cpufreq: Rename __cpufreq_governor() to cpufreq_governor() cpufreq: Relocate handle_update() to kill its declaration cpufreq: governor: Drop unnecessary checks from show() and store() cpufreq: governor: Fix race in dbs_update_util_handler() cpufreq: governor: Make gov_set_update_util() static cpufreq: governor: Narrow down the dbs_data_mutex coverage cpufreq: governor: Make dbs_data_mutex static cpufreq: governor: Relocate definitions of tuners structures cpufreq: governor: Move per-CPU data to the common code cpufreq: governor: Make governor private data per-policy ...
Diffstat (limited to 'drivers/cpufreq/cpufreq_governor.h')
-rw-r--r--drivers/cpufreq/cpufreq_governor.h261
1 files changed, 84 insertions, 177 deletions
diff --git a/drivers/cpufreq/cpufreq_governor.h b/drivers/cpufreq/cpufreq_governor.h
index 91e767a058a7..61ff82fe0613 100644
--- a/drivers/cpufreq/cpufreq_governor.h
+++ b/drivers/cpufreq/cpufreq_governor.h
@@ -18,6 +18,7 @@
18#define _CPUFREQ_GOVERNOR_H 18#define _CPUFREQ_GOVERNOR_H
19 19
20#include <linux/atomic.h> 20#include <linux/atomic.h>
21#include <linux/irq_work.h>
21#include <linux/cpufreq.h> 22#include <linux/cpufreq.h>
22#include <linux/kernel_stat.h> 23#include <linux/kernel_stat.h>
23#include <linux/module.h> 24#include <linux/module.h>
@@ -41,96 +42,68 @@
41enum {OD_NORMAL_SAMPLE, OD_SUB_SAMPLE}; 42enum {OD_NORMAL_SAMPLE, OD_SUB_SAMPLE};
42 43
43/* 44/*
44 * Macro for creating governors sysfs routines 45 * Abbreviations:
45 * 46 * dbs: used as a shortform for demand based switching It helps to keep variable
46 * - gov_sys: One governor instance per whole system 47 * names smaller, simpler
47 * - gov_pol: One governor instance per policy 48 * cdbs: common dbs
49 * od_*: On-demand governor
50 * cs_*: Conservative governor
48 */ 51 */
49 52
50/* Create attributes */ 53/* Governor demand based switching data (per-policy or global). */
51#define gov_sys_attr_ro(_name) \ 54struct dbs_data {
52static struct global_attr _name##_gov_sys = \ 55 int usage_count;
53__ATTR(_name, 0444, show_##_name##_gov_sys, NULL) 56 void *tuners;
54 57 unsigned int min_sampling_rate;
55#define gov_sys_attr_rw(_name) \ 58 unsigned int ignore_nice_load;
56static struct global_attr _name##_gov_sys = \ 59 unsigned int sampling_rate;
57__ATTR(_name, 0644, show_##_name##_gov_sys, store_##_name##_gov_sys) 60 unsigned int sampling_down_factor;
58 61 unsigned int up_threshold;
59#define gov_pol_attr_ro(_name) \ 62 unsigned int io_is_busy;
60static struct freq_attr _name##_gov_pol = \
61__ATTR(_name, 0444, show_##_name##_gov_pol, NULL)
62
63#define gov_pol_attr_rw(_name) \
64static struct freq_attr _name##_gov_pol = \
65__ATTR(_name, 0644, show_##_name##_gov_pol, store_##_name##_gov_pol)
66 63
67#define gov_sys_pol_attr_rw(_name) \ 64 struct kobject kobj;
68 gov_sys_attr_rw(_name); \ 65 struct list_head policy_dbs_list;
69 gov_pol_attr_rw(_name) 66 /*
67 * Protect concurrent updates to governor tunables from sysfs,
68 * policy_dbs_list and usage_count.
69 */
70 struct mutex mutex;
71};
70 72
71#define gov_sys_pol_attr_ro(_name) \ 73/* Governor's specific attributes */
72 gov_sys_attr_ro(_name); \ 74struct dbs_data;
73 gov_pol_attr_ro(_name) 75struct governor_attr {
76 struct attribute attr;
77 ssize_t (*show)(struct dbs_data *dbs_data, char *buf);
78 ssize_t (*store)(struct dbs_data *dbs_data, const char *buf,
79 size_t count);
80};
74 81
75/* Create show/store routines */ 82#define gov_show_one(_gov, file_name) \
76#define show_one(_gov, file_name) \ 83static ssize_t show_##file_name \
77static ssize_t show_##file_name##_gov_sys \ 84(struct dbs_data *dbs_data, char *buf) \
78(struct kobject *kobj, struct attribute *attr, char *buf) \
79{ \ 85{ \
80 struct _gov##_dbs_tuners *tuners = _gov##_dbs_cdata.gdbs_data->tuners; \
81 return sprintf(buf, "%u\n", tuners->file_name); \
82} \
83 \
84static ssize_t show_##file_name##_gov_pol \
85(struct cpufreq_policy *policy, char *buf) \
86{ \
87 struct dbs_data *dbs_data = policy->governor_data; \
88 struct _gov##_dbs_tuners *tuners = dbs_data->tuners; \ 86 struct _gov##_dbs_tuners *tuners = dbs_data->tuners; \
89 return sprintf(buf, "%u\n", tuners->file_name); \ 87 return sprintf(buf, "%u\n", tuners->file_name); \
90} 88}
91 89
92#define store_one(_gov, file_name) \ 90#define gov_show_one_common(file_name) \
93static ssize_t store_##file_name##_gov_sys \ 91static ssize_t show_##file_name \
94(struct kobject *kobj, struct attribute *attr, const char *buf, size_t count) \ 92(struct dbs_data *dbs_data, char *buf) \
95{ \
96 struct dbs_data *dbs_data = _gov##_dbs_cdata.gdbs_data; \
97 return store_##file_name(dbs_data, buf, count); \
98} \
99 \
100static ssize_t store_##file_name##_gov_pol \
101(struct cpufreq_policy *policy, const char *buf, size_t count) \
102{ \ 93{ \
103 struct dbs_data *dbs_data = policy->governor_data; \ 94 return sprintf(buf, "%u\n", dbs_data->file_name); \
104 return store_##file_name(dbs_data, buf, count); \
105} 95}
106 96
107#define show_store_one(_gov, file_name) \ 97#define gov_attr_ro(_name) \
108show_one(_gov, file_name); \ 98static struct governor_attr _name = \
109store_one(_gov, file_name) 99__ATTR(_name, 0444, show_##_name, NULL)
110 100
111/* create helper routines */ 101#define gov_attr_rw(_name) \
112#define define_get_cpu_dbs_routines(_dbs_info) \ 102static struct governor_attr _name = \
113static struct cpu_dbs_info *get_cpu_cdbs(int cpu) \ 103__ATTR(_name, 0644, show_##_name, store_##_name)
114{ \
115 return &per_cpu(_dbs_info, cpu).cdbs; \
116} \
117 \
118static void *get_cpu_dbs_info_s(int cpu) \
119{ \
120 return &per_cpu(_dbs_info, cpu); \
121}
122
123/*
124 * Abbreviations:
125 * dbs: used as a shortform for demand based switching It helps to keep variable
126 * names smaller, simpler
127 * cdbs: common dbs
128 * od_*: On-demand governor
129 * cs_*: Conservative governor
130 */
131 104
132/* Common to all CPUs of a policy */ 105/* Common to all CPUs of a policy */
133struct cpu_common_dbs_info { 106struct policy_dbs_info {
134 struct cpufreq_policy *policy; 107 struct cpufreq_policy *policy;
135 /* 108 /*
136 * Per policy mutex that serializes load evaluation from limit-change 109 * Per policy mutex that serializes load evaluation from limit-change
@@ -138,11 +111,27 @@ struct cpu_common_dbs_info {
138 */ 111 */
139 struct mutex timer_mutex; 112 struct mutex timer_mutex;
140 113
141 ktime_t time_stamp; 114 u64 last_sample_time;
142 atomic_t skip_work; 115 s64 sample_delay_ns;
116 atomic_t work_count;
117 struct irq_work irq_work;
143 struct work_struct work; 118 struct work_struct work;
119 /* dbs_data may be shared between multiple policy objects */
120 struct dbs_data *dbs_data;
121 struct list_head list;
122 /* Multiplier for increasing sample delay temporarily. */
123 unsigned int rate_mult;
124 /* Status indicators */
125 bool is_shared; /* This object is used by multiple CPUs */
126 bool work_in_progress; /* Work is being queued up or in progress */
144}; 127};
145 128
129static inline void gov_update_sample_delay(struct policy_dbs_info *policy_dbs,
130 unsigned int delay_us)
131{
132 policy_dbs->sample_delay_ns = delay_us * NSEC_PER_USEC;
133}
134
146/* Per cpu structures */ 135/* Per cpu structures */
147struct cpu_dbs_info { 136struct cpu_dbs_info {
148 u64 prev_cpu_idle; 137 u64 prev_cpu_idle;
@@ -155,54 +144,14 @@ struct cpu_dbs_info {
155 * wake-up from idle. 144 * wake-up from idle.
156 */ 145 */
157 unsigned int prev_load; 146 unsigned int prev_load;
158 struct timer_list timer; 147 struct update_util_data update_util;
159 struct cpu_common_dbs_info *shared; 148 struct policy_dbs_info *policy_dbs;
160};
161
162struct od_cpu_dbs_info_s {
163 struct cpu_dbs_info cdbs;
164 struct cpufreq_frequency_table *freq_table;
165 unsigned int freq_lo;
166 unsigned int freq_lo_jiffies;
167 unsigned int freq_hi_jiffies;
168 unsigned int rate_mult;
169 unsigned int sample_type:1;
170};
171
172struct cs_cpu_dbs_info_s {
173 struct cpu_dbs_info cdbs;
174 unsigned int down_skip;
175 unsigned int requested_freq;
176};
177
178/* Per policy Governors sysfs tunables */
179struct od_dbs_tuners {
180 unsigned int ignore_nice_load;
181 unsigned int sampling_rate;
182 unsigned int sampling_down_factor;
183 unsigned int up_threshold;
184 unsigned int powersave_bias;
185 unsigned int io_is_busy;
186};
187
188struct cs_dbs_tuners {
189 unsigned int ignore_nice_load;
190 unsigned int sampling_rate;
191 unsigned int sampling_down_factor;
192 unsigned int up_threshold;
193 unsigned int down_threshold;
194 unsigned int freq_step;
195}; 149};
196 150
197/* Common Governor data across policies */ 151/* Common Governor data across policies */
198struct dbs_data; 152struct dbs_governor {
199struct common_dbs_data { 153 struct cpufreq_governor gov;
200 /* Common across governors */ 154 struct kobj_type kobj_type;
201 #define GOV_ONDEMAND 0
202 #define GOV_CONSERVATIVE 1
203 int governor;
204 struct attribute_group *attr_group_gov_sys; /* one governor - system */
205 struct attribute_group *attr_group_gov_pol; /* one governor - policy */
206 155
207 /* 156 /*
208 * Common data for platforms that don't set 157 * Common data for platforms that don't set
@@ -210,74 +159,32 @@ struct common_dbs_data {
210 */ 159 */
211 struct dbs_data *gdbs_data; 160 struct dbs_data *gdbs_data;
212 161
213 struct cpu_dbs_info *(*get_cpu_cdbs)(int cpu); 162 unsigned int (*gov_dbs_timer)(struct cpufreq_policy *policy);
214 void *(*get_cpu_dbs_info_s)(int cpu); 163 struct policy_dbs_info *(*alloc)(void);
215 unsigned int (*gov_dbs_timer)(struct cpufreq_policy *policy, 164 void (*free)(struct policy_dbs_info *policy_dbs);
216 bool modify_all);
217 void (*gov_check_cpu)(int cpu, unsigned int load);
218 int (*init)(struct dbs_data *dbs_data, bool notify); 165 int (*init)(struct dbs_data *dbs_data, bool notify);
219 void (*exit)(struct dbs_data *dbs_data, bool notify); 166 void (*exit)(struct dbs_data *dbs_data, bool notify);
220 167 void (*start)(struct cpufreq_policy *policy);
221 /* Governor specific ops, see below */
222 void *gov_ops;
223
224 /*
225 * Protects governor's data (struct dbs_data and struct common_dbs_data)
226 */
227 struct mutex mutex;
228}; 168};
229 169
230/* Governor Per policy data */ 170static inline struct dbs_governor *dbs_governor_of(struct cpufreq_policy *policy)
231struct dbs_data { 171{
232 struct common_dbs_data *cdata; 172 return container_of(policy->governor, struct dbs_governor, gov);
233 unsigned int min_sampling_rate; 173}
234 int usage_count;
235 void *tuners;
236};
237 174
238/* Governor specific ops, will be passed to dbs_data->gov_ops */ 175/* Governor specific operations */
239struct od_ops { 176struct od_ops {
240 void (*powersave_bias_init_cpu)(int cpu);
241 unsigned int (*powersave_bias_target)(struct cpufreq_policy *policy, 177 unsigned int (*powersave_bias_target)(struct cpufreq_policy *policy,
242 unsigned int freq_next, unsigned int relation); 178 unsigned int freq_next, unsigned int relation);
243 void (*freq_increase)(struct cpufreq_policy *policy, unsigned int freq);
244}; 179};
245 180
246static inline int delay_for_sampling_rate(unsigned int sampling_rate) 181unsigned int dbs_update(struct cpufreq_policy *policy);
247{ 182int cpufreq_governor_dbs(struct cpufreq_policy *policy, unsigned int event);
248 int delay = usecs_to_jiffies(sampling_rate);
249
250 /* We want all CPUs to do sampling nearly on same jiffy */
251 if (num_online_cpus() > 1)
252 delay -= jiffies % delay;
253
254 return delay;
255}
256
257#define declare_show_sampling_rate_min(_gov) \
258static ssize_t show_sampling_rate_min_gov_sys \
259(struct kobject *kobj, struct attribute *attr, char *buf) \
260{ \
261 struct dbs_data *dbs_data = _gov##_dbs_cdata.gdbs_data; \
262 return sprintf(buf, "%u\n", dbs_data->min_sampling_rate); \
263} \
264 \
265static ssize_t show_sampling_rate_min_gov_pol \
266(struct cpufreq_policy *policy, char *buf) \
267{ \
268 struct dbs_data *dbs_data = policy->governor_data; \
269 return sprintf(buf, "%u\n", dbs_data->min_sampling_rate); \
270}
271
272extern struct mutex cpufreq_governor_lock;
273
274void gov_add_timers(struct cpufreq_policy *policy, unsigned int delay);
275void gov_cancel_work(struct cpu_common_dbs_info *shared);
276void dbs_check_cpu(struct dbs_data *dbs_data, int cpu);
277int cpufreq_governor_dbs(struct cpufreq_policy *policy,
278 struct common_dbs_data *cdata, unsigned int event);
279void od_register_powersave_bias_handler(unsigned int (*f) 183void od_register_powersave_bias_handler(unsigned int (*f)
280 (struct cpufreq_policy *, unsigned int, unsigned int), 184 (struct cpufreq_policy *, unsigned int, unsigned int),
281 unsigned int powersave_bias); 185 unsigned int powersave_bias);
282void od_unregister_powersave_bias_handler(void); 186void od_unregister_powersave_bias_handler(void);
187ssize_t store_sampling_rate(struct dbs_data *dbs_data, const char *buf,
188 size_t count);
189void gov_update_cpu_data(struct dbs_data *dbs_data);
283#endif /* _CPUFREQ_GOVERNOR_H */ 190#endif /* _CPUFREQ_GOVERNOR_H */