summaryrefslogtreecommitdiff
path: root/drivers/cpufreq
diff options
context:
space:
mode:
authorPeter Boonstoppel <pboonstoppel@nvidia.com>2011-08-18 15:24:12 -0700
committerDan Willemsen <dwillemsen@nvidia.com>2011-11-30 21:48:28 -0800
commit378d8af58ca0f47f5adc24f4750a23bb3d4cfa17 (patch)
treea2909448c217662562a0ba0035fc62b840d54443 /drivers/cpufreq
parent9562e6265794d9b07a6d30ae451256614bab611e (diff)
cpufreq: stats: snap freq to next lower freq when not in table
When cpu runs at frequency not in cpufreq table (because of other frequency governing mechanisms), bill time spent at that frequency to next lower frequency in cpufreq stats table. Original-Change-Id: I9cfda4e7a223ca3f773f1adb145d242483209799 Reviewed-on: http://git-master/r/47929 Reviewed-by: Peter Boonstoppel <pboonstoppel@nvidia.com> Tested-by: Peter Boonstoppel <pboonstoppel@nvidia.com> Tested-by: Diwakar Tundlam <dtundlam@nvidia.com> Reviewed-by: Diwakar Tundlam <dtundlam@nvidia.com> Reviewed-by: Scott Williams <scwilliams@nvidia.com> Rebase-Id: Rd25650679bddec2837d92c75b18f8568c7569336
Diffstat (limited to 'drivers/cpufreq')
-rw-r--r--drivers/cpufreq/cpufreq_stats.c22
1 files changed, 15 insertions, 7 deletions
diff --git a/drivers/cpufreq/cpufreq_stats.c b/drivers/cpufreq/cpufreq_stats.c
index 47885b62b247..6037caaf63e0 100644
--- a/drivers/cpufreq/cpufreq_stats.c
+++ b/drivers/cpufreq/cpufreq_stats.c
@@ -159,10 +159,10 @@ static struct attribute_group stats_attr_group = {
static int freq_table_get_index(struct cpufreq_stats *stat, unsigned int freq)
{
int index;
- for (index = 0; index < stat->max_state; index++)
- if (stat->freq_table[index] == freq)
- return index;
- return -1;
+ for (index = 0; index < stat->state_num; index++)
+ if (stat->freq_table[index] > freq)
+ break;
+ return index - 1; /* below lowest freq in table: return -1 */
}
/* should be called late in the CPU removal sequence so that the stats
@@ -193,7 +193,7 @@ static void cpufreq_stats_free_sysfs(unsigned int cpu)
static int cpufreq_stats_create_table(struct cpufreq_policy *policy,
struct cpufreq_frequency_table *table)
{
- unsigned int i, j, count = 0, ret = 0;
+ unsigned int i, j, k, l, count = 0, ret = 0;
struct cpufreq_stats *stat;
struct cpufreq_policy *data;
unsigned int alloc_size;
@@ -245,8 +245,16 @@ static int cpufreq_stats_create_table(struct cpufreq_policy *policy,
unsigned int freq = table[i].frequency;
if (freq == CPUFREQ_ENTRY_INVALID)
continue;
- if (freq_table_get_index(stat, freq) == -1)
- stat->freq_table[j++] = freq;
+
+ /* Insert in sorted stat->freq_table */
+ for (k = 0; k < j && stat->freq_table[k] < freq; k++)
+ ;
+ if (stat->freq_table[k] == freq)
+ continue;
+ for (l = j; l > k; l--)
+ stat->freq_table[l] = stat->freq_table[l - 1];
+ stat->freq_table[k] = freq;
+ j++;
}
stat->state_num = j;
spin_lock(&cpufreq_stats_lock);