All of lore.kernel.org
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Namhyung Kim <namhyung@kernel.org>
Cc: Ingo Molnar <mingo@kernel.org>,
	Peter Zijlstra <peterz@infradead.org>,
	Jiri Olsa <jolsa@kernel.org>, LKML <linux-kernel@vger.kernel.org>,
	David Ahern <dsahern@gmail.com>,
	Stephane Eranian <eranian@google.com>,
	Andi Kleen <andi@firstfloor.org>, Wang Nan <wangnan0@huawei.com>
Subject: Re: [PATCH 07/17] perf ui/stdio: Align column header for hierarchy output
Date: Wed, 20 Jan 2016 19:40:43 -0300	[thread overview]
Message-ID: <20160120224043.GL18367@kernel.org> (raw)
In-Reply-To: <1452960197-5323-8-git-send-email-namhyung@kernel.org>

Em Sun, Jan 17, 2016 at 01:03:07AM +0900, Namhyung Kim escreveu:
> The hierarchy output mode is to group entries so the existing columns
> won't fit to the new output.  Treat all sort keys as a single column and
> separate headers by "/".
> 
>   #    Overhead  Command / Shared Object
>   # ...........  ................................
>   #
>       15.11%     swapper
>          14.97%     [kernel.vmlinux]
>           0.09%     [libahci]
>           0.05%     [iwlwifi]
>   ...
> 
> Signed-off-by: Namhyung Kim <namhyung@kernel.org>
> ---
>  tools/perf/ui/stdio/hist.c | 107 +++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 107 insertions(+)
> 
> diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
> index 0cd7c651a0e8..38279478a06d 100644
> --- a/tools/perf/ui/stdio/hist.c
> +++ b/tools/perf/ui/stdio/hist.c
> @@ -502,6 +502,108 @@ static int hist_entry__fprintf(struct hist_entry *he, size_t size,
>  	return ret;
>  }
>  
> +static int print_hierarchy_indent(const char *sep, int nr_sort,
> +				  const char *line, FILE *fp)
> +{
> +	if (sep != NULL || nr_sort < 1)
> +		return 0;
> +
> +	return fprintf(fp, "%-.*s", (nr_sort - 1) * HIERARCHY_INDENT, line);
> +}
> +
> +static int print_hierarchy_header(struct hists *hists, struct perf_hpp *hpp,
> +				  const char *sep, FILE *fp)
> +{
> +	bool first = true;
> +	int nr_sort;
> +	unsigned width = 0;
> +	unsigned header_width = 0;
> +	struct perf_hpp_fmt *fmt;
> +	const char spaces[] = "                                               "
> +	"                                                                     "
> +	"                                                                     ";
> +	const char dots[] = "................................................."
> +	"....................................................................."
> +	".....................................................................";
> +
> +	nr_sort = perf_hpp__count_sort_keys();
> +
> +	/* preserve max indent depth for column headers */
> +	print_hierarchy_indent(sep, nr_sort, spaces, fp);
> +
> +	perf_hpp__for_each_format(fmt) {
> +		if (perf_hpp__is_sort_entry(fmt) || perf_hpp__is_dynamic_entry(fmt))
> +			break;
> +
> +		if (!first)
> +			fprintf(fp, "%s", sep ?: "  ");
> +		else
> +			first = false;
> +
> +		fmt->header(fmt, hpp, hists_to_evsel(hists));
> +		fprintf(fp, "%s", hpp->buf);

We already have code that prints dots or spaces according to a given
width, but in tools/perf/ui/stdio/hist.c hists__fprintf() it does it
using a fprintf loop, gack, would be better to settle in one way.

Can be done later, sure, processing as-is.

- Arnaldo

> +	}
> +
> +	/* combine sort headers with ' / ' */
> +	first = true;
> +	perf_hpp__for_each_format(fmt) {
> +		if (!perf_hpp__is_sort_entry(fmt) && !perf_hpp__is_dynamic_entry(fmt))
> +			continue;
> +
> +		if (!first)
> +			header_width += fprintf(fp, " / ");
> +		else {
> +			header_width += fprintf(fp, "%s", sep ?: "  ");
> +			first = false;
> +		}
> +
> +		fmt->header(fmt, hpp, hists_to_evsel(hists));
> +		rtrim(hpp->buf);
> +
> +		header_width += fprintf(fp, "%s", hpp->buf);
> +	}
> +
> +	/* preserve max indent depth for combined sort headers */
> +	print_hierarchy_indent(sep, nr_sort, spaces, fp);
> +
> +	fprintf(fp, "\n# ");
> +
> +	/* preserve max indent depth for initial dots */
> +	print_hierarchy_indent(sep, nr_sort, dots, fp);
> +
> +	first = true;
> +	perf_hpp__for_each_format(fmt) {
> +		if (perf_hpp__is_sort_entry(fmt) || perf_hpp__is_dynamic_entry(fmt))
> +			break;
> +
> +		if (!first)
> +			fprintf(fp, "%s", sep ?: "  ");
> +		else
> +			first = false;
> +
> +		width = fmt->width(fmt, hpp, hists_to_evsel(hists));
> +		fprintf(fp, "%.*s", width, dots);
> +	}
> +
> +	perf_hpp__for_each_format(fmt) {
> +		if (!perf_hpp__is_sort_entry(fmt) && !perf_hpp__is_dynamic_entry(fmt))
> +			continue;
> +
> +		width = fmt->width(fmt, hpp, hists_to_evsel(hists));
> +		if (width > header_width)
> +			header_width = width;
> +	}
> +
> +	fprintf(fp, "%s%-.*s", sep ?: "  ", header_width, dots);
> +
> +	/* preserve max indent depth for dots under sort headers */
> +	print_hierarchy_indent(sep, nr_sort, dots, fp);
> +
> +	fprintf(fp, "\n#\n");
> +
> +	return 2;
> +}
> +
>  size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
>  		      int max_cols, float min_pcnt, FILE *fp)
>  {
> @@ -533,6 +635,11 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
>  
>  	fprintf(fp, "# ");
>  
> +	if (symbol_conf.report_hierarchy) {
> +		nr_rows += print_hierarchy_header(hists, &dummy_hpp, sep, fp);
> +		goto print_entries;
> +	}
> +
>  	perf_hpp__for_each_format(fmt) {
>  		if (perf_hpp__should_skip(fmt, hists))
>  			continue;
> -- 
> 2.6.4

  reply	other threads:[~2016-01-20 22:40 UTC|newest]

Thread overview: 87+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-01-16 16:03 [RFC/PATCHSET 00/17] perf tools: Add support for hierachy view (v2) Namhyung Kim
2016-01-16 16:03 ` [PATCH 01/17] perf hists: Basic support of hierarchical report view Namhyung Kim
2016-01-17 16:15   ` Jiri Olsa
2016-01-19 10:51     ` Namhyung Kim
2016-01-19 16:50       ` Arnaldo Carvalho de Melo
2016-01-20 17:00         ` Jiri Olsa
2016-01-20 17:09           ` Arnaldo Carvalho de Melo
2016-01-21  4:08           ` Namhyung Kim
2016-01-21 10:43   ` Jiri Olsa
2016-01-21 12:55     ` Namhyung Kim
2016-01-21 13:35       ` Jiri Olsa
2016-01-21 14:02         ` Arnaldo Carvalho de Melo
2016-01-22 10:44           ` Namhyung Kim
2016-01-22 10:43         ` Namhyung Kim
2016-01-22 11:37           ` Jiri Olsa
2016-01-21 11:35   ` Jiri Olsa
2016-01-21 13:01     ` Namhyung Kim
2016-01-16 16:03 ` [PATCH 02/17] perf hists: Resort hist entries with hierarchy Namhyung Kim
2016-01-21 11:41   ` Jiri Olsa
2016-01-21 13:03     ` Namhyung Kim
2016-01-16 16:03 ` [PATCH 03/17] perf hists: Add helper functions for hierarchy mode Namhyung Kim
2016-01-20 22:19   ` Arnaldo Carvalho de Melo
2016-01-21  3:59     ` Namhyung Kim
2016-01-21  4:19       ` [PATCH v2 " Namhyung Kim
2016-01-21 13:05         ` Namhyung Kim
2016-01-16 16:03 ` [PATCH 04/17] perf hists: Cleanup filtering functions Namhyung Kim
2016-01-19 20:39   ` Arnaldo Carvalho de Melo
2016-01-20  1:15     ` [PATCH v2 04.1/17] perf hists: Remove parent filter check in DSO filter function Namhyung Kim
2016-01-20  1:15       ` [PATCH v2 04.2/17] perf hists: Cleanup filtering functions Namhyung Kim
2016-01-21 12:02         ` Jiri Olsa
2016-02-03 10:08         ` [tip:perf/core] " tip-bot for Namhyung Kim
2016-01-21 12:02       ` [PATCH v2 04.1/17] perf hists: Remove parent filter check in DSO filter function Jiri Olsa
2016-02-03 10:07       ` [tip:perf/core] " tip-bot for Namhyung Kim
2016-01-16 16:03 ` [PATCH 05/17] perf hists: Support filtering in hierarchy mode Namhyung Kim
2016-01-16 16:03 ` [PATCH 06/17] perf ui/stdio: Implement hierarchy output mode Namhyung Kim
2016-01-16 16:03 ` [PATCH 07/17] perf ui/stdio: Align column header for hierarchy output Namhyung Kim
2016-01-20 22:40   ` Arnaldo Carvalho de Melo [this message]
2016-01-21  4:00     ` Namhyung Kim
2016-01-16 16:03 ` [PATCH 08/17] perf hists browser: Fix context menu item Namhyung Kim
2016-01-21  0:52   ` Arnaldo Carvalho de Melo
2016-01-21  4:07     ` Namhyung Kim
2016-01-21 23:51       ` Arnaldo Carvalho de Melo
2016-01-22 11:08         ` Namhyung Kim
2016-01-22 14:37   ` Dynamicly add/remove sort keys was: " Arnaldo Carvalho de Melo
2016-02-03 10:10   ` [tip:perf/core] perf sort: Provide a way to find out if per-thread bucketing is in place tip-bot for Namhyung Kim
2016-02-03 10:11   ` [tip:perf/core] perf hists browser: Only 'Zoom into thread' only when sort order has 'pid' tip-bot for Namhyung Kim
2016-02-03 10:11   ` [tip:perf/core] perf hists browser: Only offer symbol scripting when a symbol is under the cursor tip-bot for Namhyung Kim
2016-02-03 10:11   ` [tip:perf/core] perf hists browser: Offer 'Zoom into DSO'/' Map details' only when sort order has 'dso' tip-bot for Namhyung Kim
2016-02-03 10:12   ` [tip:perf/core] perf hists browser: Be a bit more strict about presenting CPU socket zoom tip-bot for Namhyung Kim
2016-02-03 10:12   ` [tip:perf/core] perf hists browser: Offer non-symbol specific menu options for --sort without 'sym' tip-bot for Namhyung Kim
2016-01-16 16:03 ` [PATCH 09/17] perf hists browser: Count number of hierarchy entries Namhyung Kim
2016-01-16 16:03 ` [PATCH 10/17] perf hists browser: Support collapsing/expanding whole entries in hierarchy Namhyung Kim
2016-01-16 16:03 ` [PATCH 11/17] perf hists browser: Factor out hist_browser__show_callchain() Namhyung Kim
2016-01-16 16:03 ` [PATCH 12/17] perf hists browser: Implement hierarchy output Namhyung Kim
2016-01-16 16:03 ` [PATCH 13/17] perf hists browser: Align column header in hierarchy mode Namhyung Kim
2016-01-16 16:03 ` [PATCH 14/17] perf ui/gtk: Implement hierarchy output mode Namhyung Kim
2016-01-16 16:03 ` [PATCH 15/17] perf report: Add --hierarchy option Namhyung Kim
2016-01-16 16:03 ` [PATCH 16/17] perf hists: Support decaying in hierarchy mode Namhyung Kim
2016-01-16 16:03 ` [PATCH 17/17] perf top: Add --hierarchy option Namhyung Kim
2016-01-17 10:25 ` [RFC/PATCHSET 00/17] perf tools: Add support for hierachy view (v2) Pekka Enberg
2016-01-19 10:42   ` Namhyung Kim
2016-01-17 19:31 ` Andi Kleen
2016-01-19 10:45   ` Namhyung Kim
2016-01-19 21:03     ` Arnaldo Carvalho de Melo
2016-01-19 21:07       ` Arnaldo Carvalho de Melo
2016-01-19 22:12     ` Andi Kleen
2016-01-19 22:24       ` Arnaldo Carvalho de Melo
2016-01-20  0:56         ` Namhyung Kim
2016-01-20  1:11           ` Andi Kleen
2016-01-20  1:36             ` Namhyung Kim
2016-01-20  1:43               ` Andi Kleen
2016-01-20 13:34           ` Arnaldo Carvalho de Melo
2016-01-19 20:00 ` Arnaldo Carvalho de Melo
2016-01-19 20:52 ` Arnaldo Carvalho de Melo
2016-01-20  0:19   ` Namhyung Kim
2016-01-19 20:59 ` Arnaldo Carvalho de Melo
2016-01-20  0:34   ` Namhyung Kim
2016-01-20  5:28     ` Andi Kleen
2016-01-20  7:49     ` Taeung Song
2016-01-20 15:08       ` Namhyung Kim
2016-01-20 16:34         ` Taeung Song
2016-01-21  4:17           ` Namhyung Kim
2016-01-21  4:58             ` Taeung Song
2016-01-20 13:32     ` Arnaldo Carvalho de Melo
2016-01-20 15:01       ` Namhyung Kim
2016-01-20 15:25         ` Arnaldo Carvalho de Melo
2016-01-20 15:29           ` Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160120224043.GL18367@kernel.org \
    --to=acme@kernel.org \
    --cc=andi@firstfloor.org \
    --cc=dsahern@gmail.com \
    --cc=eranian@google.com \
    --cc=jolsa@kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=wangnan0@huawei.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.