cpufreq_stats.c (7fb1327ee9b92fca27662f9b9d60c7c3376d6c69) | cpufreq_stats.c (801e0f378fe7d53f87246037bf40567277275418) |
---|---|
1/* 2 * drivers/cpufreq/cpufreq_stats.c 3 * 4 * Copyright (C) 2003-2004 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>. 5 * (C) 2004 Zou Nan hai <nanhai.zou@intel.com>. 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 */ 11 12#include <linux/cpu.h> 13#include <linux/cpufreq.h> 14#include <linux/module.h> 15#include <linux/slab.h> | 1/* 2 * drivers/cpufreq/cpufreq_stats.c 3 * 4 * Copyright (C) 2003-2004 Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>. 5 * (C) 2004 Zou Nan hai <nanhai.zou@intel.com>. 6 * 7 * This program is free software; you can redistribute it and/or modify 8 * it under the terms of the GNU General Public License version 2 as 9 * published by the Free Software Foundation. 10 */ 11 12#include <linux/cpu.h> 13#include <linux/cpufreq.h> 14#include <linux/module.h> 15#include <linux/slab.h> |
16#include <linux/cputime.h> |
|
16 17static DEFINE_SPINLOCK(cpufreq_stats_lock); 18 19struct cpufreq_stats { 20 unsigned int total_trans; 21 unsigned long long last_time; 22 unsigned int max_state; 23 unsigned int state_num; 24 unsigned int last_index; 25 u64 *time_in_state; 26 unsigned int *freq_table; | 17 18static DEFINE_SPINLOCK(cpufreq_stats_lock); 19 20struct cpufreq_stats { 21 unsigned int total_trans; 22 unsigned long long last_time; 23 unsigned int max_state; 24 unsigned int state_num; 25 unsigned int last_index; 26 u64 *time_in_state; 27 unsigned int *freq_table; |
27#ifdef CONFIG_CPU_FREQ_STAT_DETAILS | |
28 unsigned int *trans_table; | 28 unsigned int *trans_table; |
29#endif | |
30}; 31 32static int cpufreq_stats_update(struct cpufreq_stats *stats) 33{ 34 unsigned long long cur_time = get_jiffies_64(); 35 36 spin_lock(&cpufreq_stats_lock); 37 stats->time_in_state[stats->last_index] += cur_time - stats->last_time; 38 stats->last_time = cur_time; 39 spin_unlock(&cpufreq_stats_lock); 40 return 0; 41} 42 43static void cpufreq_stats_clear_table(struct cpufreq_stats *stats) 44{ 45 unsigned int count = stats->max_state; 46 47 memset(stats->time_in_state, 0, count * sizeof(u64)); | 29}; 30 31static int cpufreq_stats_update(struct cpufreq_stats *stats) 32{ 33 unsigned long long cur_time = get_jiffies_64(); 34 35 spin_lock(&cpufreq_stats_lock); 36 stats->time_in_state[stats->last_index] += cur_time - stats->last_time; 37 stats->last_time = cur_time; 38 spin_unlock(&cpufreq_stats_lock); 39 return 0; 40} 41 42static void cpufreq_stats_clear_table(struct cpufreq_stats *stats) 43{ 44 unsigned int count = stats->max_state; 45 46 memset(stats->time_in_state, 0, count * sizeof(u64)); |
48#ifdef CONFIG_CPU_FREQ_STAT_DETAILS | |
49 memset(stats->trans_table, 0, count * count * sizeof(int)); | 47 memset(stats->trans_table, 0, count * count * sizeof(int)); |
50#endif | |
51 stats->last_time = get_jiffies_64(); 52 stats->total_trans = 0; 53} 54 55static ssize_t show_total_trans(struct cpufreq_policy *policy, char *buf) 56{ 57 return sprintf(buf, "%d\n", policy->stats->total_trans); 58} --- 19 unchanged lines hidden (view full) --- 78static ssize_t store_reset(struct cpufreq_policy *policy, const char *buf, 79 size_t count) 80{ 81 /* We don't care what is written to the attribute. */ 82 cpufreq_stats_clear_table(policy->stats); 83 return count; 84} 85 | 48 stats->last_time = get_jiffies_64(); 49 stats->total_trans = 0; 50} 51 52static ssize_t show_total_trans(struct cpufreq_policy *policy, char *buf) 53{ 54 return sprintf(buf, "%d\n", policy->stats->total_trans); 55} --- 19 unchanged lines hidden (view full) --- 75static ssize_t store_reset(struct cpufreq_policy *policy, const char *buf, 76 size_t count) 77{ 78 /* We don't care what is written to the attribute. */ 79 cpufreq_stats_clear_table(policy->stats); 80 return count; 81} 82 |
86#ifdef CONFIG_CPU_FREQ_STAT_DETAILS | |
87static ssize_t show_trans_table(struct cpufreq_policy *policy, char *buf) 88{ 89 struct cpufreq_stats *stats = policy->stats; 90 ssize_t len = 0; 91 int i, j; 92 93 if (policy->fast_switch_enabled) 94 return 0; --- 28 unchanged lines hidden (view full) --- 123 break; 124 len += snprintf(buf + len, PAGE_SIZE - len, "\n"); 125 } 126 if (len >= PAGE_SIZE) 127 return PAGE_SIZE; 128 return len; 129} 130cpufreq_freq_attr_ro(trans_table); | 83static ssize_t show_trans_table(struct cpufreq_policy *policy, char *buf) 84{ 85 struct cpufreq_stats *stats = policy->stats; 86 ssize_t len = 0; 87 int i, j; 88 89 if (policy->fast_switch_enabled) 90 return 0; --- 28 unchanged lines hidden (view full) --- 119 break; 120 len += snprintf(buf + len, PAGE_SIZE - len, "\n"); 121 } 122 if (len >= PAGE_SIZE) 123 return PAGE_SIZE; 124 return len; 125} 126cpufreq_freq_attr_ro(trans_table); |
131#endif | |
132 133cpufreq_freq_attr_ro(total_trans); 134cpufreq_freq_attr_ro(time_in_state); 135cpufreq_freq_attr_wo(reset); 136 137static struct attribute *default_attrs[] = { 138 &total_trans.attr, 139 &time_in_state.attr, 140 &reset.attr, | 127 128cpufreq_freq_attr_ro(total_trans); 129cpufreq_freq_attr_ro(time_in_state); 130cpufreq_freq_attr_wo(reset); 131 132static struct attribute *default_attrs[] = { 133 &total_trans.attr, 134 &time_in_state.attr, 135 &reset.attr, |
141#ifdef CONFIG_CPU_FREQ_STAT_DETAILS | |
142 &trans_table.attr, | 136 &trans_table.attr, |
143#endif | |
144 NULL 145}; 146static struct attribute_group stats_attr_group = { 147 .attrs = default_attrs, 148 .name = "stats" 149}; 150 151static int freq_table_get_index(struct cpufreq_stats *stats, unsigned int freq) --- 42 unchanged lines hidden (view full) --- 194 return; 195 196 /* Find total allocation size */ 197 cpufreq_for_each_valid_entry(pos, table) 198 count++; 199 200 alloc_size = count * sizeof(int) + count * sizeof(u64); 201 | 137 NULL 138}; 139static struct attribute_group stats_attr_group = { 140 .attrs = default_attrs, 141 .name = "stats" 142}; 143 144static int freq_table_get_index(struct cpufreq_stats *stats, unsigned int freq) --- 42 unchanged lines hidden (view full) --- 187 return; 188 189 /* Find total allocation size */ 190 cpufreq_for_each_valid_entry(pos, table) 191 count++; 192 193 alloc_size = count * sizeof(int) + count * sizeof(u64); 194 |
202#ifdef CONFIG_CPU_FREQ_STAT_DETAILS | |
203 alloc_size += count * count * sizeof(int); | 195 alloc_size += count * count * sizeof(int); |
204#endif | |
205 206 /* Allocate memory for time_in_state/freq_table/trans_table in one go */ 207 stats->time_in_state = kzalloc(alloc_size, GFP_KERNEL); 208 if (!stats->time_in_state) 209 goto free_stat; 210 211 stats->freq_table = (unsigned int *)(stats->time_in_state + count); 212 | 196 197 /* Allocate memory for time_in_state/freq_table/trans_table in one go */ 198 stats->time_in_state = kzalloc(alloc_size, GFP_KERNEL); 199 if (!stats->time_in_state) 200 goto free_stat; 201 202 stats->freq_table = (unsigned int *)(stats->time_in_state + count); 203 |
213#ifdef CONFIG_CPU_FREQ_STAT_DETAILS | |
214 stats->trans_table = stats->freq_table + count; | 204 stats->trans_table = stats->freq_table + count; |
215#endif | |
216 217 stats->max_state = count; 218 219 /* Find valid-unique entries */ 220 cpufreq_for_each_valid_entry(pos, table) 221 if (freq_table_get_index(stats, pos->frequency) == -1) 222 stats->freq_table[i++] = pos->frequency; 223 --- 29 unchanged lines hidden (view full) --- 253 254 /* We can't do stats->time_in_state[-1]= .. */ 255 if (old_index == -1 || new_index == -1 || old_index == new_index) 256 return; 257 258 cpufreq_stats_update(stats); 259 260 stats->last_index = new_index; | 205 206 stats->max_state = count; 207 208 /* Find valid-unique entries */ 209 cpufreq_for_each_valid_entry(pos, table) 210 if (freq_table_get_index(stats, pos->frequency) == -1) 211 stats->freq_table[i++] = pos->frequency; 212 --- 29 unchanged lines hidden (view full) --- 242 243 /* We can't do stats->time_in_state[-1]= .. */ 244 if (old_index == -1 || new_index == -1 || old_index == new_index) 245 return; 246 247 cpufreq_stats_update(stats); 248 249 stats->last_index = new_index; |
261#ifdef CONFIG_CPU_FREQ_STAT_DETAILS | |
262 stats->trans_table[old_index * stats->max_state + new_index]++; | 250 stats->trans_table[old_index * stats->max_state + new_index]++; |
263#endif | |
264 stats->total_trans++; 265} | 251 stats->total_trans++; 252} |