On (01/21/13 15:31), Sergey Senozhatsky wrote:
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.
Oops my bad, don't mention it. Eventually we reset this data.
-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
>