aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRajagopal Venkat <rajagopal.venkat@linaro.org>2012-11-22 12:41:11 +0530
committerRajagopal Venkat <rajagopal.venkat@linaro.org>2012-12-07 20:02:39 +0530
commitc138a3ddc2b2ed2c9dd2ebfd23be12e5aad9261e (patch)
tree483e060a9f7a2b23a760d308caee5e39f3858660
parenta440d1ddd4f439231f4d4df36d8bd1cc529165a5 (diff)
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.h7
-rw-r--r--src/cpu/cpu_linux.cpp36
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;