On (01/15/13 19:05), Austin Zhang wrote:
Date: Tue, 15 Jan 2013 19:05:18 +0800
From: Austin Zhang <zhang.austin(a)gmail.com>
To: powertop(a)lists.01.org
Subject: [Powertop] [PATCH] Fix C states and P states presentation issue.
X-Mailer: git-send-email 1.7.5.4
If using '10' in this 'for' loop, for P states, once the processor
provides more than 10 P states, those additional ones cannot been
presented; and for C states, once the processor provides maximize
C states level more than 9, for example, it only has POLL, C1, C3,
C6, C10, the additional one like C10 also cannot be presented.
Now we get the loop numbers from the system information we had got
before.
Signed-off-by: Austin Zhang <zhang.austin(a)gmail.com>
---
src/cpu/cpu.cpp | 35 +++++++++++++++++++++++++++++------
1 files changed, 29 insertions(+), 6 deletions(-)
diff --git a/src/cpu/cpu.cpp b/src/cpu/cpu.cpp
index 7f3af69..28f77b7 100644
--- a/src/cpu/cpu.cpp
+++ b/src/cpu/cpu.cpp
@@ -404,6 +404,15 @@ void report_display_cpu_cstates(void)
unsigned int package, core, cpu;
int line;
class abstract_cpu *_package, * _core, * _cpu;
+ unsigned int i, j, cstates_num;
+
+ for (i = 0, cstates_num = 0; i < all_cpus.size(); i++) {
+ if (all_cpus[i])
+ for (j = 0; j < all_cpus[i]->cstates.size(); j++)
+ if ((all_cpus[i]->cstates[j])->line_level >= 0 &&
+ (all_cpus[i]->cstates[j])->line_level > cstates_num)
+ cstates_num = (all_cpus[i]->cstates[j])->line_level;
+ }
report.begin_section(SECTION_CPUIDLE);
report.add_header("Processor Idle state report");
@@ -421,7 +430,7 @@ void report_display_cpu_cstates(void)
if (!_core)
continue;
- for (line = LEVEL_HEADER; line < 10; line++) {
+ for (line = LEVEL_HEADER; line <= (int)cstates_num; line++) {
bool first_cpu = true;
if (!_package->has_cstate_level(line))
@@ -628,14 +637,29 @@ void impl_w_display_cpu_states(int state)
char buffer[128];
char linebuf[1024];
unsigned int package, core, cpu;
- int line;
+ int line, loop;
class abstract_cpu *_package, * _core, * _cpu;
int ctr = 0;
+ unsigned int i, j, cstates_num, pstates_num;
+
+ for (i = 0, cstates_num = 0, pstates_num = 0; i < all_cpus.size(); i++) {
+ if (all_cpus[i] && all_cpus[i]->pstates.size() > pstates_num)
+ pstates_num = all_cpus[i]->pstates.size();
- if (state == PSTATE)
+ if (all_cpus[i])
+ for (j = 0; j < all_cpus[i]->cstates.size(); j++)
+ if ((all_cpus[i]->cstates[j])->line_level >= 0 &&
+ (all_cpus[i]->cstates[j])->line_level > cstates_num)
+ cstates_num = (all_cpus[i]->cstates[j])->line_level;
+ }
+
Hm, I think it'd be better to have these (cstates_num, pstates_num) as a cpu members
and set max
P/C state when we insert new P/C state. Iterating through constant data on every
display(/report)
seems like overkill.
-ss
+ if (state == PSTATE) {
win = get_ncurses_win("Frequency stats");
- else
+ loop = (int)pstates_num;
+ } else {
win = get_ncurses_win("Idle stats");
+ loop = (int)cstates_num;
+ }
if (!win)
return;
@@ -656,8 +680,7 @@ void impl_w_display_cpu_states(int state)
if (!_core->has_pstates() && state == PSTATE)
continue;
-
- for (line = LEVEL_HEADER; line < 10; line++) {
+ for (line = LEVEL_HEADER; line <= loop; line++) {
int first = 1;
ctr = 0;
linebuf[0] = 0;
--
1.7.5.4
_______________________________________________
PowerTop mailing list
PowerTop(a)lists.01.org
https://lists.01.org/mailman/listinfo/powertop