aboutsummaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
authorArjan van de Ven <arjan@linux.intel.com>2010-08-08 20:03:31 -0700
committerArjan van de Ven <arjan@linux.intel.com>2010-08-08 20:03:31 -0700
commitccdd664003d56634a3b650a69071c0ebf6a80356 (patch)
tree24d359fd561aeddab0c08947e7c1dde1d988db55 /cpu
parentdf73d86b49dbd61e99556db16f7dd0aae724bc7a (diff)
downloadpowertop-ccdd664003d56634a3b650a69071c0ebf6a80356.tar.gz
collapse cores if cpus and cores are the same
Diffstat (limited to 'cpu')
-rw-r--r--cpu/cpu.cpp50
-rw-r--r--cpu/cpu.h6
-rw-r--r--cpu/intel_cpus.h3
3 files changed, 38 insertions, 21 deletions
diff --git a/cpu/cpu.cpp b/cpu/cpu.cpp
index 4af4e3a..aa46aeb 100644
--- a/cpu/cpu.cpp
+++ b/cpu/cpu.cpp
@@ -86,23 +86,29 @@ static void handle_one_cpu(unsigned int number, char *vendor, int family, int mo
if (system_level.children.size() <= package_number)
system_level.children.resize(package_number + 1);
- if (!system_level.children[package_number])
+ if (!system_level.children[package_number]) {
system_level.children[package_number] = new_package(package_number, number, vendor, family, model);
+ system_level.childcount++;
+ }
package = system_level.children[package_number];
if (package->children.size() <= core_number)
package->children.resize(core_number + 1);
- if (!package->children[core_number])
+ if (!package->children[core_number]) {
package->children[core_number] = new_core(core_number, number, vendor, family, model);
+ package->childcount++;
+ }
core = package->children[core_number];
if (core->children.size() <= number)
core->children.resize(number + 1, NULL);
- if (!core->children[number])
+ if (!core->children[number]) {
core->children[number] = new_cpu(number, vendor, family, model);
+ core->childcount++;
+ }
cpu = core->children[number];
@@ -223,16 +229,17 @@ void display_cpu_cstates(void)
strcat(linebuf, "| ");
+ if (!_core->can_collapse()) {
+ buffer[0] = 0;
+ strcat(linebuf, _core->fill_cstate_name(line, buffer));
+ expand_string(linebuf, ctr + 10);
+ strcat(linebuf, _core->fill_cstate_line(line, buffer));
+ ctr += 20;
+ expand_string(linebuf, ctr);
- buffer[0] = 0;
- strcat(linebuf, _core->fill_cstate_name(line, buffer));
- expand_string(linebuf, ctr + 10);
- strcat(linebuf, _core->fill_cstate_line(line, buffer));
- ctr += 20;
- expand_string(linebuf, ctr);
-
- strcat(linebuf, "| ");
- ctr += 2;
+ strcat(linebuf, "| ");
+ ctr += 2;
+ }
for (cpu = 0; cpu < _core->children.size(); cpu++) {
_cpu = _core->children[cpu];
@@ -304,16 +311,17 @@ void display_cpu_pstates(void)
strcat(linebuf, "| ");
+ if (!_core->can_collapse()) {
+ buffer[0] = 0;
+ strcat(linebuf, _core->fill_pstate_name(line, buffer));
+ expand_string(linebuf, ctr + 10);
+ strcat(linebuf, _core->fill_pstate_line(line, buffer));
+ ctr += 20;
+ expand_string(linebuf, ctr);
- buffer[0] = 0;
- strcat(linebuf, _core->fill_pstate_name(line, buffer));
- expand_string(linebuf, ctr + 10);
- strcat(linebuf, _core->fill_pstate_line(line, buffer));
- ctr += 20;
- expand_string(linebuf, ctr);
-
- strcat(linebuf, "| ");
- ctr += 2;
+ strcat(linebuf, "| ");
+ ctr += 2;
+ }
for (cpu = 0; cpu < _core->children.size(); cpu++) {
_cpu = _core->children[cpu];
diff --git a/cpu/cpu.h b/cpu/cpu.h
index 1d2dad9..44c2747 100644
--- a/cpu/cpu.h
+++ b/cpu/cpu.h
@@ -54,6 +54,7 @@ protected:
uint64_t max_frequency;
uint64_t max_minus_one_frequency;
public:
+ int childcount;
vector<class abstract_cpu *> children;
vector<struct idle_state *> cstates;
vector<struct frequency *> pstates;
@@ -63,6 +64,8 @@ public:
virtual void measurement_start(void);
virtual void measurement_end(void);
+ virtual int can_collapse(void) { return 0;};
+
/* C state related methods */
@@ -109,6 +112,8 @@ public:
virtual char * fill_pstate_line(int line_nr, char *buffer);
virtual char * fill_pstate_name(int line_nr, char *buffer);
+
+ virtual int can_collapse(void) { return childcount == 1;};
};
class cpu_package: public abstract_cpu
@@ -119,6 +124,7 @@ public:
virtual char * fill_pstate_line(int line_nr, char *buffer);
virtual char * fill_pstate_name(int line_nr, char *buffer);
+ virtual int can_collapse(void) { return childcount == 1;};
};
#include "intel_cpus.h"
diff --git a/cpu/intel_cpus.h b/cpu/intel_cpus.h
index a8f824e..ffeab67 100644
--- a/cpu/intel_cpus.h
+++ b/cpu/intel_cpus.h
@@ -22,6 +22,7 @@ private:
public:
virtual void measurement_start(void);
virtual void measurement_end(void);
+ virtual int can_collapse(void) { return 0;};
};
@@ -34,6 +35,7 @@ private:
public:
virtual void measurement_start(void);
virtual void measurement_end(void);
+ virtual int can_collapse(void) { return 0;};
};
@@ -46,6 +48,7 @@ private:
public:
virtual void measurement_start(void);
virtual void measurement_end(void);
+ virtual int can_collapse(void) { return 0;};
};