aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2012-08-05 09:57:49 -0700
committerChris E Ferron <chris.e.ferron@linux.intel.com>2012-08-06 09:26:17 -0700
commitb323d85f41f186d681967cfd23a992359032ba3a (patch)
treeedb5af1673562296a7cb50ea74614a3d579875a2
parentc03e509376a0d7abab9fe7637d9894d583d4ce46 (diff)
Make the "which C state line" logic better
the ARM guys complained that their human-readable C state names didn't have numbers in them, and that as a result, the output is all messed up. Using the "linux_name" instead is only a partial solution; it messes up the x86 side of the logic. This patch fixes the logic to make the code use the human readable logic first, but if there's no numbers there, fall back to the Linux name. In addition, the patch allows callers to specify the line directly, overriding both sets of logic.
-rw-r--r--src/cpu/abstract_cpu.cpp21
-rw-r--r--src/cpu/cpu.h4
2 files changed, 20 insertions, 5 deletions
diff --git a/src/cpu/abstract_cpu.cpp b/src/cpu/abstract_cpu.cpp
index cd4eba0..8b4c650 100644
--- a/src/cpu/abstract_cpu.cpp
+++ b/src/cpu/abstract_cpu.cpp
@@ -130,7 +130,7 @@ void abstract_cpu::measurement_end(void)
}
}
-void abstract_cpu::insert_cstate(const char *linux_name, const char *human_name, uint64_t usage, uint64_t duration, int count)
+void abstract_cpu::insert_cstate(const char *linux_name, const char *human_name, uint64_t usage, uint64_t duration, int count, int level)
{
struct idle_state *state;
const char *c;
@@ -147,6 +147,8 @@ void abstract_cpu::insert_cstate(const char *linux_name, const char *human_name,
strcpy(state->linux_name, linux_name);
strcpy(state->human_name, human_name);
+ state->line_level = -1;
+
c = human_name;
while (*c) {
if (strcmp(linux_name, "active")==0) {
@@ -160,6 +162,19 @@ void abstract_cpu::insert_cstate(const char *linux_name, const char *human_name,
c++;
}
+ /* some architectures (ARM) don't have good numbers in thier human name.. fall back to the linux name for those */
+ c = linux_name;
+ while (*c && state->line_level < 0) {
+ if (*c >= '0' && *c <='9') {
+ state->line_level = strtoull(c, NULL, 10);
+ break;
+ }
+ c++;
+ }
+
+ if (level >= 0)
+ state->line_level = level;
+
state->usage_before = usage;
state->duration_before = duration;
state->before_count = count;
@@ -187,7 +202,7 @@ void abstract_cpu::finalize_cstate(const char *linux_name, uint64_t usage, uint6
state->after_count += count;
}
-void abstract_cpu::update_cstate(const char *linux_name, const char *human_name, uint64_t usage, uint64_t duration, int count)
+void abstract_cpu::update_cstate(const char *linux_name, const char *human_name, uint64_t usage, uint64_t duration, int count, int level)
{
unsigned int i;
struct idle_state *state = NULL;
@@ -200,7 +215,7 @@ void abstract_cpu::update_cstate(const char *linux_name, const char *human_name,
}
if (!state) {
- insert_cstate(linux_name, human_name, usage, duration, count);
+ insert_cstate(linux_name, human_name, usage, duration, count, level);
return;
}
diff --git a/src/cpu/cpu.h b/src/cpu/cpu.h
index b48ada9..d51e3b2 100644
--- a/src/cpu/cpu.h
+++ b/src/cpu/cpu.h
@@ -111,8 +111,8 @@ public:
/* C state related methods */
- void insert_cstate(const char *linux_name, const char *human_name, uint64_t usage, uint64_t duration, int count);
- void update_cstate(const char *linux_name, const char *human_name, uint64_t usage, uint64_t duration, int count);
+ void insert_cstate(const char *linux_name, const char *human_name, uint64_t usage, uint64_t duration, int count, int level = -1);
+ void update_cstate(const char *linux_name, const char *human_name, uint64_t usage, uint64_t duration, int count, int level = -1);
void finalize_cstate(const char *linux_name, uint64_t usage, uint64_t duration, int count);
virtual int has_cstate_level(int level);