diff options
author | Jinyoung Park <jinyoungp@nvidia.com> | 2013-08-21 23:33:46 +0900 |
---|---|---|
committer | Gabby Lee <galee@nvidia.com> | 2013-08-29 19:47:02 -0700 |
commit | 5e0968a40df300cd2d43fcad80a0c1eff5025a0b (patch) | |
tree | 68889a1701197f09c70031cb081beb9e23a7ac23 | |
parent | d9c94e230fccb2e1faa9eb36025abae7a84d23dd (diff) |
cpufreq: interactive: Add consecutive I/O
Treat I/O wait as CPU busy if I/O processing is occurred on
the consecutive samples.
Bug 1332115
Bug 1351808
Change-Id: Ie47737a10b4896c8bef09181cca644f888ab2ac4
Signed-off-by: Jinyoung Park <jinyoungp@nvidia.com>
Reviewed-on: http://git-master/r/264419
Reviewed-by: Automatic_Commit_Validation_User
GVS: Gerrit_Virtual_Submit
Reviewed-by: Gabby Lee <galee@nvidia.com>
-rw-r--r-- | drivers/cpufreq/cpufreq_interactive.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/cpufreq/cpufreq_interactive.c b/drivers/cpufreq/cpufreq_interactive.c index 42a9ad59ea46..9369e888b5d9 100644 --- a/drivers/cpufreq/cpufreq_interactive.c +++ b/drivers/cpufreq/cpufreq_interactive.c @@ -43,6 +43,7 @@ struct cpufreq_interactive_cpuinfo { u64 freq_change_time; u64 freq_change_time_in_idle; u64 freq_change_time_in_iowait; + unsigned int io_consecutive; u64 last_high_freq_time; struct cpufreq_policy *policy; struct cpufreq_frequency_table *freq_table; @@ -70,6 +71,9 @@ static unsigned long max_boost; /* Consider IO as busy */ static unsigned long io_is_busy; +/* Consider IO as busy if consecutive IOs are above this value. */ +static unsigned long io_busy_threshold; + /* * Targeted sustainable load relatively to current frequency. * If 0, target is set realtively to the max speed @@ -190,6 +194,7 @@ static void cpufreq_interactive_timer(unsigned long data) unsigned int delta_idle; unsigned int delta_iowait; unsigned int delta_time; + unsigned int io_consecutive; int cpu_load; int load_since_change; u64 time_in_idle; @@ -231,6 +236,7 @@ static void cpufreq_interactive_timer(unsigned long data) delta_idle = (unsigned int)(now_idle - time_in_idle); delta_iowait = (unsigned int)(now_iowait - time_in_iowait); delta_time = (unsigned int)(pcpu->timer_run_time - idle_exit_time); + io_consecutive = pcpu->io_consecutive; /* * If timer ran less than 1ms after short-term sample started, retry. @@ -238,7 +244,13 @@ static void cpufreq_interactive_timer(unsigned long data) if (delta_time < 1000) goto rearm; - if (!io_is_busy) + if (io_busy_threshold && delta_iowait) + io_consecutive++; + else if (io_consecutive) + io_consecutive = 0; + + if (!io_is_busy && + (!io_consecutive || (io_consecutive < io_busy_threshold))) delta_idle += delta_iowait; if (delta_idle > delta_time) @@ -246,6 +258,8 @@ static void cpufreq_interactive_timer(unsigned long data) else cpu_load = 100 * (delta_time - delta_idle) / delta_time; + pcpu->io_consecutive = io_consecutive; + delta_idle = (unsigned int)(now_idle - pcpu->freq_change_time_in_idle); delta_iowait = (unsigned int)(now_iowait - pcpu->freq_change_time_in_iowait); delta_time = (unsigned int)(pcpu->timer_run_time - pcpu->freq_change_time); @@ -374,6 +388,7 @@ static void cpufreq_interactive_idle_start(void) smp_processor_id(), &pcpu->idle_exit_time); pcpu->time_in_iowait = get_cpu_iowait_time( smp_processor_id(), NULL); + pcpu->io_consecutive = 0; pcpu->timer_idlecancel = 0; mod_timer(&pcpu->cpu_timer, jiffies + usecs_to_jiffies(timer_rate)); @@ -431,6 +446,7 @@ static void cpufreq_interactive_idle_end(void) pcpu->time_in_iowait = get_cpu_iowait_time(smp_processor_id(), NULL); + pcpu->io_consecutive = 0; pcpu->timer_idlecancel = 0; mod_timer(&pcpu->cpu_timer, jiffies + usecs_to_jiffies(timer_rate)); @@ -526,6 +542,7 @@ DECL_CPUFREQ_INTERACTIVE_ATTR(midrange_freq) DECL_CPUFREQ_INTERACTIVE_ATTR(midrange_go_maxspeed_load) DECL_CPUFREQ_INTERACTIVE_ATTR(boost_factor) DECL_CPUFREQ_INTERACTIVE_ATTR(io_is_busy) +DECL_CPUFREQ_INTERACTIVE_ATTR(io_busy_threshold) DECL_CPUFREQ_INTERACTIVE_ATTR(max_boost) DECL_CPUFREQ_INTERACTIVE_ATTR(midrange_max_boost) DECL_CPUFREQ_INTERACTIVE_ATTR(sustain_load) @@ -544,6 +561,7 @@ static struct attribute *interactive_attributes[] = { &max_boost_attr.attr, &midrange_max_boost_attr.attr, &io_is_busy_attr.attr, + &io_busy_threshold_attr.attr, &sustain_load_attr.attr, &min_sample_time_attr.attr, &timer_rate_attr.attr, @@ -606,6 +624,7 @@ static int cpufreq_governor_interactive(struct cpufreq_policy *policy, pcpu->freq_change_time_in_iowait = get_cpu_iowait_time(j, NULL); pcpu->time_in_iowait = pcpu->freq_change_time_in_iowait; + pcpu->io_consecutive = 0; if (!pcpu->last_high_freq_time) pcpu->last_high_freq_time = pcpu->freq_change_time; pcpu->timer_idlecancel = 1; |