diff options
author | Arjan van de Ven <arjan@linux.intel.com> | 2010-08-08 20:03:31 -0700 |
---|---|---|
committer | Arjan van de Ven <arjan@linux.intel.com> | 2010-08-08 20:03:31 -0700 |
commit | ccdd664003d56634a3b650a69071c0ebf6a80356 (patch) | |
tree | 24d359fd561aeddab0c08947e7c1dde1d988db55 /cpu | |
parent | df73d86b49dbd61e99556db16f7dd0aae724bc7a (diff) | |
download | powertop-ccdd664003d56634a3b650a69071c0ebf6a80356.tar.gz |
collapse cores if cpus and cores are the same
Diffstat (limited to 'cpu')
-rw-r--r-- | cpu/cpu.cpp | 50 | ||||
-rw-r--r-- | cpu/cpu.h | 6 | ||||
-rw-r--r-- | cpu/intel_cpus.h | 3 |
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]; @@ -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;}; }; |