[PATCH] perf report: Support --total-cycles --group in the tui mode

kan.liang@linux.intel.com posted 1 patch 1 year, 5 months ago
tools/perf/builtin-report.c    |  6 +++++-
tools/perf/ui/browsers/hists.c | 12 ++++++++++--
2 files changed, 15 insertions(+), 3 deletions(-)
[PATCH] perf report: Support --total-cycles --group in the tui mode
Posted by kan.liang@linux.intel.com 1 year, 5 months ago
From: Kan Liang <kan.liang@linux.intel.com>

With the --total-cycles, the --group is only supported in the stdio
mode, but not supported in the tui mode. The output is inconsistent
with different modes.

if symbol_conf.event_group is applied, always output the event group
information together in tui mode as well.

$perf record -e "{cycles,instructions}",cache-misses -b sleep 1
$perf report --total-cycles --group --tui

Before the patch,

Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
          6.45%            2.0K        0.57%         667    [dl-cacheinfo.h:164 -> dl
          5.62%            1.7K        0.74%         871            [dl-cache.c:230 -
          5.21%            1.6K        1.37%        1.6K          [setup-vdso.h:37 ->
          4.92%            1.5K        0.09%         109            [dl-cache.c:367 -

Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
          5.62%            1.7K        2.76%         871            [dl-cache.c:230 -
          4.92%            1.5K        0.35%         109            [dl-cache.c:367 -
          1.12%             346        0.55%         173
          0.87%             270        0.43%         135                    [rtld.c:5
          0.64%             197        0.03%           8      [dl-tunables.c:305 -> d
          0.60%             185        0.01%           3      [dl-tunables.c:305 -> d

Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
          5.90%            1.8K        1.28%        1.8K                  [strtod.c:8
          5.70%            1.8K        1.24%        1.8K            [strtod_l.c:681 -
          5.68%            1.8K        1.24%        1.8K            [strtod_l.c:508 -
          5.48%            1.7K        1.19%        1.7K          [strtod_l.c:1175 ->
          5.21%            1.6K        1.13%        1.6K          [setup-vdso.h:37 ->

With the patch,

Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
          6.45%            2.0K        0.57%         667    [dl-cacheinfo.h:164 -> dl
          5.62%            1.7K        0.74%         871            [dl-cache.c:230 -
          5.21%            1.6K        1.37%        1.6K          [setup-vdso.h:37 ->
          4.92%            1.5K        0.09%         109            [dl-cache.c:367 -

Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
          5.90%            1.8K        1.28%        1.8K                  [strtod.c:8
          5.70%            1.8K        1.24%        1.8K            [strtod_l.c:681 -
          5.68%            1.8K        1.24%        1.8K            [strtod_l.c:508 -
          5.48%            1.7K        1.19%        1.7K          [strtod_l.c:1175 ->
          5.21%            1.6K        1.13%        1.6K          [setup-vdso.h:37 ->

Fixes: 7fa46cbf20d3 ("perf report: Sort by sampled cycles percent per block for tui")
Closes: https://lore.kernel.org/lkml/ZrupfUSZwem-hCZm@x1/
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
---
 tools/perf/builtin-report.c    |  6 +++++-
 tools/perf/ui/browsers/hists.c | 12 ++++++++++--
 2 files changed, 15 insertions(+), 3 deletions(-)

diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
index 1643113616f4..574342fb7269 100644
--- a/tools/perf/builtin-report.c
+++ b/tools/perf/builtin-report.c
@@ -541,7 +541,11 @@ static int evlist__tui_block_hists_browse(struct evlist *evlist, struct report *
 	int i = 0, ret;
 
 	evlist__for_each_entry(evlist, pos) {
-		ret = report__browse_block_hists(&rep->block_reports[i++].hist,
+		i++;
+		if (symbol_conf.event_group && !evsel__is_group_leader(pos))
+			continue;
+
+		ret = report__browse_block_hists(&rep->block_reports[i - 1].hist,
 						 rep->min_percent, pos,
 						 &rep->session->header.env);
 		if (ret != 0)
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 49ba82bf3391..22af1a6e29d6 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -3665,11 +3665,19 @@ single_entry: {
 static int block_hists_browser__title(struct hist_browser *browser, char *bf,
 				      size_t size)
 {
-	struct hists *hists = evsel__hists(browser->block_evsel);
-	const char *evname = evsel__name(browser->block_evsel);
+	struct evsel *evsel = browser->block_evsel;
+	struct hists *hists = evsel__hists(evsel);
 	unsigned long nr_samples = hists->stats.nr_samples;
+	const char *evname;
+	char buf[512];
 	int ret;
 
+	if (evsel__is_group_event(evsel)) {
+		evsel__group_desc(evsel, buf, sizeof(buf));
+		evname = buf;
+	} else
+		evname = evsel__name(evsel);
+
 	ret = scnprintf(bf, size, "# Samples: %lu", nr_samples);
 	if (evname)
 		scnprintf(bf + ret, size -  ret, " of event '%s'", evname);
-- 
2.38.1
Re: [PATCH] perf report: Support --total-cycles --group in the tui mode
Posted by Namhyung Kim 1 year, 5 months ago
Hi Kan,

On Wed, Aug 14, 2024 at 7:19 AM <kan.liang@linux.intel.com> wrote:
>
> From: Kan Liang <kan.liang@linux.intel.com>
>
> With the --total-cycles, the --group is only supported in the stdio
> mode, but not supported in the tui mode. The output is inconsistent
> with different modes.
>
> if symbol_conf.event_group is applied, always output the event group
> information together in tui mode as well.
>
> $perf record -e "{cycles,instructions}",cache-misses -b sleep 1
> $perf report --total-cycles --group --tui
>
> Before the patch,
>
> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>           6.45%            2.0K        0.57%         667    [dl-cacheinfo.h:164 -> dl
>           5.62%            1.7K        0.74%         871            [dl-cache.c:230 -
>           5.21%            1.6K        1.37%        1.6K          [setup-vdso.h:37 ->
>           4.92%            1.5K        0.09%         109            [dl-cache.c:367 -
>
> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>           5.62%            1.7K        2.76%         871            [dl-cache.c:230 -
>           4.92%            1.5K        0.35%         109            [dl-cache.c:367 -
>           1.12%             346        0.55%         173
>           0.87%             270        0.43%         135                    [rtld.c:5
>           0.64%             197        0.03%           8      [dl-tunables.c:305 -> d
>           0.60%             185        0.01%           3      [dl-tunables.c:305 -> d
>
> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>           5.90%            1.8K        1.28%        1.8K                  [strtod.c:8
>           5.70%            1.8K        1.24%        1.8K            [strtod_l.c:681 -
>           5.68%            1.8K        1.24%        1.8K            [strtod_l.c:508 -
>           5.48%            1.7K        1.19%        1.7K          [strtod_l.c:1175 ->
>           5.21%            1.6K        1.13%        1.6K          [setup-vdso.h:37 ->
>
> With the patch,
>
> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>           6.45%            2.0K        0.57%         667    [dl-cacheinfo.h:164 -> dl
>           5.62%            1.7K        0.74%         871            [dl-cache.c:230 -
>           5.21%            1.6K        1.37%        1.6K          [setup-vdso.h:37 ->
>           4.92%            1.5K        0.09%         109            [dl-cache.c:367 -

Hmm.. it seems the output just removed the second one.
I guess it should combine the first and second output somehow.

Thanks,
Namhyung

>
> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>           5.90%            1.8K        1.28%        1.8K                  [strtod.c:8
>           5.70%            1.8K        1.24%        1.8K            [strtod_l.c:681 -
>           5.68%            1.8K        1.24%        1.8K            [strtod_l.c:508 -
>           5.48%            1.7K        1.19%        1.7K          [strtod_l.c:1175 ->
>           5.21%            1.6K        1.13%        1.6K          [setup-vdso.h:37 ->
>
> Fixes: 7fa46cbf20d3 ("perf report: Sort by sampled cycles percent per block for tui")
> Closes: https://lore.kernel.org/lkml/ZrupfUSZwem-hCZm@x1/
> Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
> ---
>  tools/perf/builtin-report.c    |  6 +++++-
>  tools/perf/ui/browsers/hists.c | 12 ++++++++++--
>  2 files changed, 15 insertions(+), 3 deletions(-)
>
> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
> index 1643113616f4..574342fb7269 100644
> --- a/tools/perf/builtin-report.c
> +++ b/tools/perf/builtin-report.c
> @@ -541,7 +541,11 @@ static int evlist__tui_block_hists_browse(struct evlist *evlist, struct report *
>         int i = 0, ret;
>
>         evlist__for_each_entry(evlist, pos) {
> -               ret = report__browse_block_hists(&rep->block_reports[i++].hist,
> +               i++;
> +               if (symbol_conf.event_group && !evsel__is_group_leader(pos))
> +                       continue;
> +
> +               ret = report__browse_block_hists(&rep->block_reports[i - 1].hist,
>                                                  rep->min_percent, pos,
>                                                  &rep->session->header.env);
>                 if (ret != 0)
> diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
> index 49ba82bf3391..22af1a6e29d6 100644
> --- a/tools/perf/ui/browsers/hists.c
> +++ b/tools/perf/ui/browsers/hists.c
> @@ -3665,11 +3665,19 @@ single_entry: {
>  static int block_hists_browser__title(struct hist_browser *browser, char *bf,
>                                       size_t size)
>  {
> -       struct hists *hists = evsel__hists(browser->block_evsel);
> -       const char *evname = evsel__name(browser->block_evsel);
> +       struct evsel *evsel = browser->block_evsel;
> +       struct hists *hists = evsel__hists(evsel);
>         unsigned long nr_samples = hists->stats.nr_samples;
> +       const char *evname;
> +       char buf[512];
>         int ret;
>
> +       if (evsel__is_group_event(evsel)) {
> +               evsel__group_desc(evsel, buf, sizeof(buf));
> +               evname = buf;
> +       } else
> +               evname = evsel__name(evsel);
> +
>         ret = scnprintf(bf, size, "# Samples: %lu", nr_samples);
>         if (evname)
>                 scnprintf(bf + ret, size -  ret, " of event '%s'", evname);
> --
> 2.38.1
>
Re: [PATCH] perf report: Support --total-cycles --group in the tui mode
Posted by Liang, Kan 1 year, 5 months ago

On 2024-08-15 6:44 p.m., Namhyung Kim wrote:
> Hi Kan,
> 
> On Wed, Aug 14, 2024 at 7:19 AM <kan.liang@linux.intel.com> wrote:
>>
>> From: Kan Liang <kan.liang@linux.intel.com>
>>
>> With the --total-cycles, the --group is only supported in the stdio
>> mode, but not supported in the tui mode. The output is inconsistent
>> with different modes.
>>
>> if symbol_conf.event_group is applied, always output the event group
>> information together in tui mode as well.
>>
>> $perf record -e "{cycles,instructions}",cache-misses -b sleep 1
>> $perf report --total-cycles --group --tui
>>
>> Before the patch,
>>
>> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>>           6.45%            2.0K        0.57%         667    [dl-cacheinfo.h:164 -> dl
>>           5.62%            1.7K        0.74%         871            [dl-cache.c:230 -
>>           5.21%            1.6K        1.37%        1.6K          [setup-vdso.h:37 ->
>>           4.92%            1.5K        0.09%         109            [dl-cache.c:367 -
>>
>> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>>           5.62%            1.7K        2.76%         871            [dl-cache.c:230 -
>>           4.92%            1.5K        0.35%         109            [dl-cache.c:367 -
>>           1.12%             346        0.55%         173
>>           0.87%             270        0.43%         135                    [rtld.c:5
>>           0.64%             197        0.03%           8      [dl-tunables.c:305 -> d
>>           0.60%             185        0.01%           3      [dl-tunables.c:305 -> d
>>
>> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>>           5.90%            1.8K        1.28%        1.8K                  [strtod.c:8
>>           5.70%            1.8K        1.24%        1.8K            [strtod_l.c:681 -
>>           5.68%            1.8K        1.24%        1.8K            [strtod_l.c:508 -
>>           5.48%            1.7K        1.19%        1.7K          [strtod_l.c:1175 ->
>>           5.21%            1.6K        1.13%        1.6K          [setup-vdso.h:37 ->
>>
>> With the patch,
>>
>> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>>           6.45%            2.0K        0.57%         667    [dl-cacheinfo.h:164 -> dl
>>           5.62%            1.7K        0.74%         871            [dl-cache.c:230 -
>>           5.21%            1.6K        1.37%        1.6K          [setup-vdso.h:37 ->
>>           4.92%            1.5K        0.09%         109            [dl-cache.c:367 -
> 
> Hmm.. it seems the output just removed the second one.
> I guess it should combine the first and second output somehow.
>

The patch is just to make the behavior/output the same between --stdio
and the tui mode for --group. I didn't change the algorithm of
calculating the cycles.

Yes, it looks suspicious. I will take a deep look and see how the group
information are processed.

Thanks,
Kan

> Thanks,
> Namhyung
> 
>>
>> Sampled Cycles%  Sampled Cycles  Avg Cycles%  Avg Cycles                         [Pro
>>           5.90%            1.8K        1.28%        1.8K                  [strtod.c:8
>>           5.70%            1.8K        1.24%        1.8K            [strtod_l.c:681 -
>>           5.68%            1.8K        1.24%        1.8K            [strtod_l.c:508 -
>>           5.48%            1.7K        1.19%        1.7K          [strtod_l.c:1175 ->
>>           5.21%            1.6K        1.13%        1.6K          [setup-vdso.h:37 ->
>>
>> Fixes: 7fa46cbf20d3 ("perf report: Sort by sampled cycles percent per block for tui")
>> Closes: https://lore.kernel.org/lkml/ZrupfUSZwem-hCZm@x1/
>> Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
>> ---
>>  tools/perf/builtin-report.c    |  6 +++++-
>>  tools/perf/ui/browsers/hists.c | 12 ++++++++++--
>>  2 files changed, 15 insertions(+), 3 deletions(-)
>>
>> diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c
>> index 1643113616f4..574342fb7269 100644
>> --- a/tools/perf/builtin-report.c
>> +++ b/tools/perf/builtin-report.c
>> @@ -541,7 +541,11 @@ static int evlist__tui_block_hists_browse(struct evlist *evlist, struct report *
>>         int i = 0, ret;
>>
>>         evlist__for_each_entry(evlist, pos) {
>> -               ret = report__browse_block_hists(&rep->block_reports[i++].hist,
>> +               i++;
>> +               if (symbol_conf.event_group && !evsel__is_group_leader(pos))
>> +                       continue;
>> +
>> +               ret = report__browse_block_hists(&rep->block_reports[i - 1].hist,
>>                                                  rep->min_percent, pos,
>>                                                  &rep->session->header.env);
>>                 if (ret != 0)
>> diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
>> index 49ba82bf3391..22af1a6e29d6 100644
>> --- a/tools/perf/ui/browsers/hists.c
>> +++ b/tools/perf/ui/browsers/hists.c
>> @@ -3665,11 +3665,19 @@ single_entry: {
>>  static int block_hists_browser__title(struct hist_browser *browser, char *bf,
>>                                       size_t size)
>>  {
>> -       struct hists *hists = evsel__hists(browser->block_evsel);
>> -       const char *evname = evsel__name(browser->block_evsel);
>> +       struct evsel *evsel = browser->block_evsel;
>> +       struct hists *hists = evsel__hists(evsel);
>>         unsigned long nr_samples = hists->stats.nr_samples;
>> +       const char *evname;
>> +       char buf[512];
>>         int ret;
>>
>> +       if (evsel__is_group_event(evsel)) {
>> +               evsel__group_desc(evsel, buf, sizeof(buf));
>> +               evname = buf;
>> +       } else
>> +               evname = evsel__name(evsel);
>> +
>>         ret = scnprintf(bf, size, "# Samples: %lu", nr_samples);
>>         if (evname)
>>                 scnprintf(bf + ret, size -  ret, " of event '%s'", evname);
>> --
>> 2.38.1
>>
>