diff options
author | Rajagopal Venkat <rajagopal.venkat@linaro.org> | 2012-11-22 12:41:11 +0530 |
---|---|---|
committer | Rajagopal Venkat <rajagopal.venkat@linaro.org> | 2012-12-07 20:02:39 +0530 |
commit | c138a3ddc2b2ed2c9dd2ebfd23be12e5aad9261e (patch) | |
tree | 483e060a9f7a2b23a760d308caee5e39f3858660 | |
parent | a440d1ddd4f439231f4d4df36d8bd1cc529165a5 (diff) | |
download | powertop-2.0-v2-c138a3ddc2b2ed2c9dd2ebfd23be12e5aad9261e.tar.gz |
Allow frequency stats when cpuidle is not enabled
Powertop fails to display frequency stats when cpuidle subsystem
is not enabled. Fix it.
Signed-off-by: Rajagopal Venkat <rajagopal.venkat@linaro.org>
-rw-r--r-- | src/cpu/cpu.h | 7 | ||||
-rw-r--r-- | src/cpu/cpu_linux.cpp | 36 |
2 files changed, 33 insertions, 10 deletions
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h index 4480b11..781e33c 100644 --- a/src/cpu/cpu.h +++ b/src/cpu/cpu.h @@ -159,7 +159,12 @@ extern vector<class abstract_cpu *> all_cpus; class cpu_linux: public abstract_cpu { - void account_freq(uint64_t frequency, uint64_t duration); + void account_freq(uint64_t frequency, uint64_t duration); + void parse_pstates_start(void); + void parse_cstates_start(void); + void parse_pstates_end(void); + void parse_cstates_end(void); + public: virtual void measurement_start(void); virtual void measurement_end(void); diff --git a/src/cpu/cpu_linux.cpp b/src/cpu/cpu_linux.cpp index d6caf45..e7a3d37 100644 --- a/src/cpu/cpu_linux.cpp +++ b/src/cpu/cpu_linux.cpp @@ -47,17 +47,13 @@ static int is_turbo(uint64_t freq, uint64_t max, uint64_t maxmo) return 1; } -void cpu_linux::measurement_start(void) +void cpu_linux::parse_cstates_start(void) { ifstream file; - DIR *dir; struct dirent *entry; char filename[256]; int len; - unsigned int i; - - abstract_cpu::measurement_start(); len = sprintf(filename, "/sys/devices/system/cpu/cpu%i/cpuidle", number); @@ -111,9 +107,16 @@ void cpu_linux::measurement_start(void) } closedir(dir); +} - last_stamp = 0; +void cpu_linux::parse_pstates_start(void) +{ + ifstream file; + char filename[256]; + unsigned int i; + + last_stamp = 0; for (i = 0; i < children.size(); i++) if (children[i]) children[i]->wiggle(); @@ -136,8 +139,14 @@ void cpu_linux::measurement_start(void) account_freq(0, 0); } +void cpu_linux::measurement_start(void) +{ + abstract_cpu::measurement_start(); + parse_cstates_start(); + parse_pstates_start(); +} -void cpu_linux::measurement_end(void) +void cpu_linux::parse_cstates_end(void) { DIR *dir; struct dirent *entry; @@ -187,6 +196,12 @@ void cpu_linux::measurement_end(void) } closedir(dir); +} + +void cpu_linux::parse_pstates_end(void) +{ + char filename[256]; + ifstream file; sprintf(filename, "/sys/devices/system/cpu/cpu%i/cpufreq/stats/time_in_state", number); @@ -216,12 +231,15 @@ void cpu_linux::measurement_end(void) } file.close(); } +} - +void cpu_linux::measurement_end(void) +{ + parse_cstates_end(); + parse_pstates_end(); abstract_cpu::measurement_end(); } - char * cpu_linux::fill_cstate_line(int line_nr, char *buffer, const char *separator) { unsigned int i; |