Powertop fails to display frequency stats when cpuidle subsystem
is not enabled. Fix it.

Signed-off-by: Rajagopal Venkat <rajagopal.ven...@linaro.org>
---
 src/cpu/cpu.h         |  7 ++++++-
 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;
-- 
1.7.11.3


_______________________________________________
linaro-dev mailing list
linaro-dev@lists.linaro.org
http://lists.linaro.org/mailman/listinfo/linaro-dev

Reply via email to