diff options
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r-- | drivers/cpufreq/cpufreq_conservative.c | 53 | ||||
-rw-r--r-- | drivers/cpufreq/cpufreq_ondemand.c | 58 |
2 files changed, 38 insertions, 73 deletions
diff --git a/drivers/cpufreq/cpufreq_conservative.c b/drivers/cpufreq/cpufreq_conservative.c index dd2f5b272a4d..3082a3fa5ec4 100644 --- a/drivers/cpufreq/cpufreq_conservative.c +++ b/drivers/cpufreq/cpufreq_conservative.c | |||
@@ -89,6 +89,15 @@ static struct dbs_tuners dbs_tuners_ins = { | |||
89 | .sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR, | 89 | .sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR, |
90 | }; | 90 | }; |
91 | 91 | ||
92 | static inline unsigned int get_cpu_idle_time(unsigned int cpu) | ||
93 | { | ||
94 | return kstat_cpu(cpu).cpustat.idle + | ||
95 | kstat_cpu(cpu).cpustat.iowait + | ||
96 | ( !dbs_tuners_ins.ignore_nice ? | ||
97 | kstat_cpu(cpu).cpustat.nice : | ||
98 | 0); | ||
99 | } | ||
100 | |||
92 | /************************** sysfs interface ************************/ | 101 | /************************** sysfs interface ************************/ |
93 | static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) | 102 | static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) |
94 | { | 103 | { |
@@ -221,16 +230,10 @@ static ssize_t store_ignore_nice(struct cpufreq_policy *policy, | |||
221 | dbs_tuners_ins.ignore_nice = input; | 230 | dbs_tuners_ins.ignore_nice = input; |
222 | 231 | ||
223 | /* we need to re-evaluate prev_cpu_idle_up and prev_cpu_idle_down */ | 232 | /* we need to re-evaluate prev_cpu_idle_up and prev_cpu_idle_down */ |
224 | for_each_cpu_mask(j, policy->cpus) { | 233 | for_each_online_cpu(j) { |
225 | struct cpu_dbs_info_s *j_dbs_info; | 234 | struct cpu_dbs_info_s *j_dbs_info; |
226 | j_dbs_info = &per_cpu(cpu_dbs_info, j); | 235 | j_dbs_info = &per_cpu(cpu_dbs_info, j); |
227 | j_dbs_info->cur_policy = policy; | 236 | j_dbs_info->prev_cpu_idle_up = get_cpu_idle_time(j); |
228 | |||
229 | j_dbs_info->prev_cpu_idle_up = | ||
230 | kstat_cpu(j).cpustat.idle + | ||
231 | kstat_cpu(j).cpustat.iowait + | ||
232 | ( !dbs_tuners_ins.ignore_nice | ||
233 | ? kstat_cpu(j).cpustat.nice : 0 ); | ||
234 | j_dbs_info->prev_cpu_idle_down = j_dbs_info->prev_cpu_idle_up; | 237 | j_dbs_info->prev_cpu_idle_down = j_dbs_info->prev_cpu_idle_up; |
235 | } | 238 | } |
236 | up(&dbs_sem); | 239 | up(&dbs_sem); |
@@ -335,11 +338,7 @@ static void dbs_check_cpu(int cpu) | |||
335 | */ | 338 | */ |
336 | 339 | ||
337 | /* Check for frequency increase */ | 340 | /* Check for frequency increase */ |
338 | total_idle_ticks = kstat_cpu(cpu).cpustat.idle + | 341 | total_idle_ticks = get_cpu_idle_time(cpu); |
339 | kstat_cpu(cpu).cpustat.iowait; | ||
340 | /* consider 'nice' tasks as 'idle' time too if required */ | ||
341 | if (dbs_tuners_ins.ignore_nice == 0) | ||
342 | total_idle_ticks += kstat_cpu(cpu).cpustat.nice; | ||
343 | idle_ticks = total_idle_ticks - | 342 | idle_ticks = total_idle_ticks - |
344 | this_dbs_info->prev_cpu_idle_up; | 343 | this_dbs_info->prev_cpu_idle_up; |
345 | this_dbs_info->prev_cpu_idle_up = total_idle_ticks; | 344 | this_dbs_info->prev_cpu_idle_up = total_idle_ticks; |
@@ -354,11 +353,7 @@ static void dbs_check_cpu(int cpu) | |||
354 | 353 | ||
355 | j_dbs_info = &per_cpu(cpu_dbs_info, j); | 354 | j_dbs_info = &per_cpu(cpu_dbs_info, j); |
356 | /* Check for frequency increase */ | 355 | /* Check for frequency increase */ |
357 | total_idle_ticks = kstat_cpu(j).cpustat.idle + | 356 | total_idle_ticks = get_cpu_idle_time(j); |
358 | kstat_cpu(j).cpustat.iowait; | ||
359 | /* consider 'nice' too? */ | ||
360 | if (dbs_tuners_ins.ignore_nice == 0) | ||
361 | total_idle_ticks += kstat_cpu(j).cpustat.nice; | ||
362 | tmp_idle_ticks = total_idle_ticks - | 357 | tmp_idle_ticks = total_idle_ticks - |
363 | j_dbs_info->prev_cpu_idle_up; | 358 | j_dbs_info->prev_cpu_idle_up; |
364 | j_dbs_info->prev_cpu_idle_up = total_idle_ticks; | 359 | j_dbs_info->prev_cpu_idle_up = total_idle_ticks; |
@@ -373,6 +368,8 @@ static void dbs_check_cpu(int cpu) | |||
373 | usecs_to_jiffies(dbs_tuners_ins.sampling_rate); | 368 | usecs_to_jiffies(dbs_tuners_ins.sampling_rate); |
374 | 369 | ||
375 | if (idle_ticks < up_idle_ticks) { | 370 | if (idle_ticks < up_idle_ticks) { |
371 | down_skip[cpu] = 0; | ||
372 | this_dbs_info->prev_cpu_idle_down = total_idle_ticks; | ||
376 | /* if we are already at full speed then break out early */ | 373 | /* if we are already at full speed then break out early */ |
377 | if (requested_freq[cpu] == policy->max) | 374 | if (requested_freq[cpu] == policy->max) |
378 | return; | 375 | return; |
@@ -389,8 +386,6 @@ static void dbs_check_cpu(int cpu) | |||
389 | 386 | ||
390 | __cpufreq_driver_target(policy, requested_freq[cpu], | 387 | __cpufreq_driver_target(policy, requested_freq[cpu], |
391 | CPUFREQ_RELATION_H); | 388 | CPUFREQ_RELATION_H); |
392 | down_skip[cpu] = 0; | ||
393 | this_dbs_info->prev_cpu_idle_down = total_idle_ticks; | ||
394 | return; | 389 | return; |
395 | } | 390 | } |
396 | 391 | ||
@@ -399,11 +394,7 @@ static void dbs_check_cpu(int cpu) | |||
399 | if (down_skip[cpu] < dbs_tuners_ins.sampling_down_factor) | 394 | if (down_skip[cpu] < dbs_tuners_ins.sampling_down_factor) |
400 | return; | 395 | return; |
401 | 396 | ||
402 | total_idle_ticks = kstat_cpu(cpu).cpustat.idle + | 397 | total_idle_ticks = this_dbs_info->prev_cpu_idle_up; |
403 | kstat_cpu(cpu).cpustat.iowait; | ||
404 | /* consider 'nice' too? */ | ||
405 | if (dbs_tuners_ins.ignore_nice == 0) | ||
406 | total_idle_ticks += kstat_cpu(cpu).cpustat.nice; | ||
407 | idle_ticks = total_idle_ticks - | 398 | idle_ticks = total_idle_ticks - |
408 | this_dbs_info->prev_cpu_idle_down; | 399 | this_dbs_info->prev_cpu_idle_down; |
409 | this_dbs_info->prev_cpu_idle_down = total_idle_ticks; | 400 | this_dbs_info->prev_cpu_idle_down = total_idle_ticks; |
@@ -417,11 +408,7 @@ static void dbs_check_cpu(int cpu) | |||
417 | 408 | ||
418 | j_dbs_info = &per_cpu(cpu_dbs_info, j); | 409 | j_dbs_info = &per_cpu(cpu_dbs_info, j); |
419 | /* Check for frequency increase */ | 410 | /* Check for frequency increase */ |
420 | total_idle_ticks = kstat_cpu(j).cpustat.idle + | 411 | total_idle_ticks = j_dbs_info->prev_cpu_idle_up; |
421 | kstat_cpu(j).cpustat.iowait; | ||
422 | /* consider 'nice' too? */ | ||
423 | if (dbs_tuners_ins.ignore_nice == 0) | ||
424 | total_idle_ticks += kstat_cpu(j).cpustat.nice; | ||
425 | tmp_idle_ticks = total_idle_ticks - | 412 | tmp_idle_ticks = total_idle_ticks - |
426 | j_dbs_info->prev_cpu_idle_down; | 413 | j_dbs_info->prev_cpu_idle_down; |
427 | j_dbs_info->prev_cpu_idle_down = total_idle_ticks; | 414 | j_dbs_info->prev_cpu_idle_down = total_idle_ticks; |
@@ -516,11 +503,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
516 | j_dbs_info = &per_cpu(cpu_dbs_info, j); | 503 | j_dbs_info = &per_cpu(cpu_dbs_info, j); |
517 | j_dbs_info->cur_policy = policy; | 504 | j_dbs_info->cur_policy = policy; |
518 | 505 | ||
519 | j_dbs_info->prev_cpu_idle_up = | 506 | j_dbs_info->prev_cpu_idle_up = get_cpu_idle_time(j); |
520 | kstat_cpu(j).cpustat.idle + | ||
521 | kstat_cpu(j).cpustat.iowait + | ||
522 | ( !dbs_tuners_ins.ignore_nice | ||
523 | ? kstat_cpu(j).cpustat.nice : 0 ); | ||
524 | j_dbs_info->prev_cpu_idle_down | 507 | j_dbs_info->prev_cpu_idle_down |
525 | = j_dbs_info->prev_cpu_idle_up; | 508 | = j_dbs_info->prev_cpu_idle_up; |
526 | } | 509 | } |
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index 056591612467..26cf54b11ba6 100644 --- a/drivers/cpufreq/cpufreq_ondemand.c +++ b/drivers/cpufreq/cpufreq_ondemand.c | |||
@@ -88,6 +88,15 @@ static struct dbs_tuners dbs_tuners_ins = { | |||
88 | .sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR, | 88 | .sampling_down_factor = DEF_SAMPLING_DOWN_FACTOR, |
89 | }; | 89 | }; |
90 | 90 | ||
91 | static inline unsigned int get_cpu_idle_time(unsigned int cpu) | ||
92 | { | ||
93 | return kstat_cpu(cpu).cpustat.idle + | ||
94 | kstat_cpu(cpu).cpustat.iowait + | ||
95 | ( !dbs_tuners_ins.ignore_nice ? | ||
96 | kstat_cpu(cpu).cpustat.nice : | ||
97 | 0); | ||
98 | } | ||
99 | |||
91 | /************************** sysfs interface ************************/ | 100 | /************************** sysfs interface ************************/ |
92 | static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) | 101 | static ssize_t show_sampling_rate_max(struct cpufreq_policy *policy, char *buf) |
93 | { | 102 | { |
@@ -220,16 +229,10 @@ static ssize_t store_ignore_nice(struct cpufreq_policy *policy, | |||
220 | dbs_tuners_ins.ignore_nice = input; | 229 | dbs_tuners_ins.ignore_nice = input; |
221 | 230 | ||
222 | /* we need to re-evaluate prev_cpu_idle_up and prev_cpu_idle_down */ | 231 | /* we need to re-evaluate prev_cpu_idle_up and prev_cpu_idle_down */ |
223 | for_each_cpu_mask(j, policy->cpus) { | 232 | for_each_online_cpu(j) { |
224 | struct cpu_dbs_info_s *j_dbs_info; | 233 | struct cpu_dbs_info_s *j_dbs_info; |
225 | j_dbs_info = &per_cpu(cpu_dbs_info, j); | 234 | j_dbs_info = &per_cpu(cpu_dbs_info, j); |
226 | j_dbs_info->cur_policy = policy; | 235 | j_dbs_info->prev_cpu_idle_up = get_cpu_idle_time(j); |
227 | |||
228 | j_dbs_info->prev_cpu_idle_up = | ||
229 | kstat_cpu(j).cpustat.idle + | ||
230 | kstat_cpu(j).cpustat.iowait + | ||
231 | ( !dbs_tuners_ins.ignore_nice | ||
232 | ? kstat_cpu(j).cpustat.nice : 0 ); | ||
233 | j_dbs_info->prev_cpu_idle_down = j_dbs_info->prev_cpu_idle_up; | 236 | j_dbs_info->prev_cpu_idle_down = j_dbs_info->prev_cpu_idle_up; |
234 | } | 237 | } |
235 | up(&dbs_sem); | 238 | up(&dbs_sem); |
@@ -322,15 +325,10 @@ static void dbs_check_cpu(int cpu) | |||
322 | */ | 325 | */ |
323 | 326 | ||
324 | /* Check for frequency increase */ | 327 | /* Check for frequency increase */ |
325 | total_idle_ticks = kstat_cpu(cpu).cpustat.idle + | 328 | total_idle_ticks = get_cpu_idle_time(cpu); |
326 | kstat_cpu(cpu).cpustat.iowait; | ||
327 | /* consider 'nice' tasks as 'idle' time too if required */ | ||
328 | if (dbs_tuners_ins.ignore_nice == 0) | ||
329 | total_idle_ticks += kstat_cpu(cpu).cpustat.nice; | ||
330 | idle_ticks = total_idle_ticks - | 329 | idle_ticks = total_idle_ticks - |
331 | this_dbs_info->prev_cpu_idle_up; | 330 | this_dbs_info->prev_cpu_idle_up; |
332 | this_dbs_info->prev_cpu_idle_up = total_idle_ticks; | 331 | this_dbs_info->prev_cpu_idle_up = total_idle_ticks; |
333 | |||
334 | 332 | ||
335 | for_each_cpu_mask(j, policy->cpus) { | 333 | for_each_cpu_mask(j, policy->cpus) { |
336 | unsigned int tmp_idle_ticks; | 334 | unsigned int tmp_idle_ticks; |
@@ -341,11 +339,7 @@ static void dbs_check_cpu(int cpu) | |||
341 | 339 | ||
342 | j_dbs_info = &per_cpu(cpu_dbs_info, j); | 340 | j_dbs_info = &per_cpu(cpu_dbs_info, j); |
343 | /* Check for frequency increase */ | 341 | /* Check for frequency increase */ |
344 | total_idle_ticks = kstat_cpu(j).cpustat.idle + | 342 | total_idle_ticks = get_cpu_idle_time(j); |
345 | kstat_cpu(j).cpustat.iowait; | ||
346 | /* consider 'nice' too? */ | ||
347 | if (dbs_tuners_ins.ignore_nice == 0) | ||
348 | total_idle_ticks += kstat_cpu(j).cpustat.nice; | ||
349 | tmp_idle_ticks = total_idle_ticks - | 343 | tmp_idle_ticks = total_idle_ticks - |
350 | j_dbs_info->prev_cpu_idle_up; | 344 | j_dbs_info->prev_cpu_idle_up; |
351 | j_dbs_info->prev_cpu_idle_up = total_idle_ticks; | 345 | j_dbs_info->prev_cpu_idle_up = total_idle_ticks; |
@@ -360,14 +354,14 @@ static void dbs_check_cpu(int cpu) | |||
360 | usecs_to_jiffies(dbs_tuners_ins.sampling_rate); | 354 | usecs_to_jiffies(dbs_tuners_ins.sampling_rate); |
361 | 355 | ||
362 | if (idle_ticks < up_idle_ticks) { | 356 | if (idle_ticks < up_idle_ticks) { |
357 | down_skip[cpu] = 0; | ||
358 | this_dbs_info->prev_cpu_idle_down = total_idle_ticks; | ||
363 | /* if we are already at full speed then break out early */ | 359 | /* if we are already at full speed then break out early */ |
364 | if (policy->cur == policy->max) | 360 | if (policy->cur == policy->max) |
365 | return; | 361 | return; |
366 | 362 | ||
367 | __cpufreq_driver_target(policy, policy->max, | 363 | __cpufreq_driver_target(policy, policy->max, |
368 | CPUFREQ_RELATION_H); | 364 | CPUFREQ_RELATION_H); |
369 | down_skip[cpu] = 0; | ||
370 | this_dbs_info->prev_cpu_idle_down = total_idle_ticks; | ||
371 | return; | 365 | return; |
372 | } | 366 | } |
373 | 367 | ||
@@ -376,11 +370,7 @@ static void dbs_check_cpu(int cpu) | |||
376 | if (down_skip[cpu] < dbs_tuners_ins.sampling_down_factor) | 370 | if (down_skip[cpu] < dbs_tuners_ins.sampling_down_factor) |
377 | return; | 371 | return; |
378 | 372 | ||
379 | total_idle_ticks = kstat_cpu(cpu).cpustat.idle + | 373 | total_idle_ticks = this_dbs_info->prev_cpu_idle_up; |
380 | kstat_cpu(cpu).cpustat.iowait; | ||
381 | /* consider 'nice' too? */ | ||
382 | if (dbs_tuners_ins.ignore_nice == 0) | ||
383 | total_idle_ticks += kstat_cpu(cpu).cpustat.nice; | ||
384 | idle_ticks = total_idle_ticks - | 374 | idle_ticks = total_idle_ticks - |
385 | this_dbs_info->prev_cpu_idle_down; | 375 | this_dbs_info->prev_cpu_idle_down; |
386 | this_dbs_info->prev_cpu_idle_down = total_idle_ticks; | 376 | this_dbs_info->prev_cpu_idle_down = total_idle_ticks; |
@@ -393,12 +383,8 @@ static void dbs_check_cpu(int cpu) | |||
393 | continue; | 383 | continue; |
394 | 384 | ||
395 | j_dbs_info = &per_cpu(cpu_dbs_info, j); | 385 | j_dbs_info = &per_cpu(cpu_dbs_info, j); |
396 | /* Check for frequency increase */ | 386 | /* Check for frequency decrease */ |
397 | total_idle_ticks = kstat_cpu(j).cpustat.idle + | 387 | total_idle_ticks = j_dbs_info->prev_cpu_idle_up; |
398 | kstat_cpu(j).cpustat.iowait; | ||
399 | /* consider 'nice' too? */ | ||
400 | if (dbs_tuners_ins.ignore_nice == 0) | ||
401 | total_idle_ticks += kstat_cpu(j).cpustat.nice; | ||
402 | tmp_idle_ticks = total_idle_ticks - | 388 | tmp_idle_ticks = total_idle_ticks - |
403 | j_dbs_info->prev_cpu_idle_down; | 389 | j_dbs_info->prev_cpu_idle_down; |
404 | j_dbs_info->prev_cpu_idle_down = total_idle_ticks; | 390 | j_dbs_info->prev_cpu_idle_down = total_idle_ticks; |
@@ -414,7 +400,7 @@ static void dbs_check_cpu(int cpu) | |||
414 | freq_down_sampling_rate = dbs_tuners_ins.sampling_rate * | 400 | freq_down_sampling_rate = dbs_tuners_ins.sampling_rate * |
415 | dbs_tuners_ins.sampling_down_factor; | 401 | dbs_tuners_ins.sampling_down_factor; |
416 | down_idle_ticks = (100 - dbs_tuners_ins.down_threshold) * | 402 | down_idle_ticks = (100 - dbs_tuners_ins.down_threshold) * |
417 | usecs_to_jiffies(freq_down_sampling_rate); | 403 | usecs_to_jiffies(freq_down_sampling_rate); |
418 | 404 | ||
419 | if (idle_ticks > down_idle_ticks ) { | 405 | if (idle_ticks > down_idle_ticks ) { |
420 | /* if we are already at the lowest speed then break out early | 406 | /* if we are already at the lowest speed then break out early |
@@ -488,11 +474,7 @@ static int cpufreq_governor_dbs(struct cpufreq_policy *policy, | |||
488 | j_dbs_info = &per_cpu(cpu_dbs_info, j); | 474 | j_dbs_info = &per_cpu(cpu_dbs_info, j); |
489 | j_dbs_info->cur_policy = policy; | 475 | j_dbs_info->cur_policy = policy; |
490 | 476 | ||
491 | j_dbs_info->prev_cpu_idle_up = | 477 | j_dbs_info->prev_cpu_idle_up = get_cpu_idle_time(j); |
492 | kstat_cpu(j).cpustat.idle + | ||
493 | kstat_cpu(j).cpustat.iowait + | ||
494 | ( !dbs_tuners_ins.ignore_nice | ||
495 | ? kstat_cpu(j).cpustat.nice : 0 ); | ||
496 | j_dbs_info->prev_cpu_idle_down | 478 | j_dbs_info->prev_cpu_idle_down |
497 | = j_dbs_info->prev_cpu_idle_up; | 479 | = j_dbs_info->prev_cpu_idle_up; |
498 | } | 480 | } |