diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/cpufreq/cpufreq_ondemand.c | 30 |
1 files changed, 28 insertions, 2 deletions
diff --git a/drivers/cpufreq/cpufreq_ondemand.c b/drivers/cpufreq/cpufreq_ondemand.c index bd444dc93cf2..ed472f8dfb72 100644 --- a/drivers/cpufreq/cpufreq_ondemand.c +++ b/drivers/cpufreq/cpufreq_ondemand.c | |||
| @@ -73,6 +73,7 @@ enum {DBS_NORMAL_SAMPLE, DBS_SUB_SAMPLE}; | |||
| 73 | 73 | ||
| 74 | struct cpu_dbs_info_s { | 74 | struct cpu_dbs_info_s { |
| 75 | cputime64_t prev_cpu_idle; | 75 | cputime64_t prev_cpu_idle; |
| 76 | cputime64_t prev_cpu_iowait; | ||
| 76 | cputime64_t prev_cpu_wall; | 77 | cputime64_t prev_cpu_wall; |
| 77 | cputime64_t prev_cpu_nice; | 78 | cputime64_t prev_cpu_nice; |
| 78 | struct cpufreq_policy *cur_policy; | 79 | struct cpufreq_policy *cur_policy; |
| @@ -148,6 +149,16 @@ static inline cputime64_t get_cpu_idle_time(unsigned int cpu, cputime64_t *wall) | |||
| 148 | return idle_time; | 149 | return idle_time; |
| 149 | } | 150 | } |
| 150 | 151 | ||
| 152 | static inline cputime64_t get_cpu_iowait_time(unsigned int cpu, cputime64_t *wall) | ||
| 153 | { | ||
| 154 | u64 iowait_time = get_cpu_iowait_time_us(cpu, wall); | ||
| 155 | |||
| 156 | if (iowait_time == -1ULL) | ||
| 157 | return 0; | ||
| 158 | |||
| 159 | return iowait_time; | ||
| 160 | } | ||
| 161 | |||
| 151 | /* | 162 | /* |
| 152 | * Find right freq to be set now with powersave_bias on. | 163 | * Find right freq to be set now with powersave_bias on. |
| 153 | * Returns the freq_hi to be used right now and will set freq_hi_jiffies, | 164 | * Returns the freq_hi to be used right now and will set freq_hi_jiffies, |
| @@ -470,14 +481,15 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info) | |||
| 470 | 481 | ||
| 471 | for_each_cpu(j, policy->cpus) { | 482 | for_each_cpu(j, policy->cpus) { |
| 472 | struct cpu_dbs_info_s *j_dbs_info; | 483 | struct cpu_dbs_info_s *j_dbs_info; |
| 473 | cputime64_t cur_wall_time, cur_idle_time; | 484 | cputime64_t cur_wall_time, cur_idle_time, cur_iowait_time; |
| 474 | unsigned int idle_time, wall_time; | 485 | unsigned int idle_time, wall_time, iowait_time; |
| 475 | unsigned int load, load_freq; | 486 | unsigned int load, load_freq; |
| 476 | int freq_avg; | 487 | int freq_avg; |
| 477 | 488 | ||
| 478 | j_dbs_info = &per_cpu(od_cpu_dbs_info, j); | 489 | j_dbs_info = &per_cpu(od_cpu_dbs_info, j); |
| 479 | 490 | ||
| 480 | cur_idle_time = get_cpu_idle_time(j, &cur_wall_time); | 491 | cur_idle_time = get_cpu_idle_time(j, &cur_wall_time); |
| 492 | cur_iowait_time = get_cpu_iowait_time(j, &cur_wall_time); | ||
| 481 | 493 | ||
| 482 | wall_time = (unsigned int) cputime64_sub(cur_wall_time, | 494 | wall_time = (unsigned int) cputime64_sub(cur_wall_time, |
| 483 | j_dbs_info->prev_cpu_wall); | 495 | j_dbs_info->prev_cpu_wall); |
| @@ -487,6 +499,10 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info) | |||
| 487 | j_dbs_info->prev_cpu_idle); | 499 | j_dbs_info->prev_cpu_idle); |
| 488 | j_dbs_info->prev_cpu_idle = cur_idle_time; | 500 | j_dbs_info->prev_cpu_idle = cur_idle_time; |
| 489 | 501 | ||
| 502 | iowait_time = (unsigned int) cputime64_sub(cur_iowait_time, | ||
| 503 | j_dbs_info->prev_cpu_iowait); | ||
| 504 | j_dbs_info->prev_cpu_iowait = cur_iowait_time; | ||
| 505 | |||
| 490 | if (dbs_tuners_ins.ignore_nice) { | 506 | if (dbs_tuners_ins.ignore_nice) { |
| 491 | cputime64_t cur_nice; | 507 | cputime64_t cur_nice; |
| 492 | unsigned long cur_nice_jiffies; | 508 | unsigned long cur_nice_jiffies; |
| @@ -504,6 +520,16 @@ static void dbs_check_cpu(struct cpu_dbs_info_s *this_dbs_info) | |||
| 504 | idle_time += jiffies_to_usecs(cur_nice_jiffies); | 520 | idle_time += jiffies_to_usecs(cur_nice_jiffies); |
| 505 | } | 521 | } |
| 506 | 522 | ||
| 523 | /* | ||
| 524 | * For the purpose of ondemand, waiting for disk IO is an | ||
| 525 | * indication that you're performance critical, and not that | ||
| 526 | * the system is actually idle. So subtract the iowait time | ||
| 527 | * from the cpu idle time. | ||
| 528 | */ | ||
| 529 | |||
| 530 | if (idle_time >= iowait_time) | ||
| 531 | idle_time -= iowait_time; | ||
| 532 | |||
| 507 | if (unlikely(!wall_time || wall_time < idle_time)) | 533 | if (unlikely(!wall_time || wall_time < idle_time)) |
| 508 | continue; | 534 | continue; |
| 509 | 535 | ||
