Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > linux.kernel > #1311398 > unrolled thread

[RFC 00/26] perf tools: Introduce hists specific format entries

Started byJiri Olsa <jolsa@kernel.org>
First post2016-01-18 10:30 +0100
Last post2016-01-25 15:40 +0100
Articles 20 on this page of 28 — 3 participants

Back to article view | Back to linux.kernel


Contents

  [RFC 00/26] perf tools: Introduce hists specific format entries Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 14/26] perf tools: Introduce struct perf_hpp_list Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
      Re: [PATCH 14/26] perf tools: Introduce struct perf_hpp_list Namhyung Kim <namhyung@kernel.org> - 2016-01-25 16:10 +0100
        Re: [PATCH 14/26] perf tools: Introduce struct perf_hpp_list Jiri Olsa <jolsa@redhat.com> - 2016-01-25 16:10 +0100
    [PATCH 21/26] perf tools: Introduce perf_hpp_list__for_each_sort_list macro Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 16/26] perf tools: Add perf_hpp_list register helpers Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 17/26] perf tools: Pass perf_hpp_list all the way through setup_sort_list Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 09/26] perf tools: Allocate output sort field Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 13/26] perf tools: Separate output fields parsing into setup_output_list function Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 15/26] perf tools: Introduce perf_hpp_list__init function Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 11/26] perf tools: Properly release format fields Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 07/26] perf tools: Make hpp setup function generic Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 12/26] perf tools: Separate sort fields parsing into setup_sort_list function Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 20/26] perf tools: Introduce perf_hpp_list__for_each_format_safe macro Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 23/26] perf tools: Add struct perf_hpp_list argument to helper functions Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 26/26] perf tools: Introduce hists__for_each_sort_list macro Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 06/26] perf tools: Add hpp__equal callback function Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 22/26] perf tools: Introduce perf_hpp_list__for_each_sort_list_safe macro Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 19/26] perf tools: Introduce perf_hpp_list__for_each_format macro Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 25/26] perf tools: Introduce hists__for_each_format macro Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:30 +0100
    [PATCH 01/26] perf tools: Factor output_resort from hists__output_resort Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:40 +0100
    [PATCH 05/26] perf tools: Add equal method to perf_hpp_fmt struct Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:40 +0100
    [PATCH 03/26] perf tools: Add _idx fields into struct perf_hpp_fmt Jiri Olsa <jolsa@kernel.org> - 2016-01-18 10:40 +0100
    Re: [RFC 00/26] perf tools: Introduce hists specific format entries Namhyung Kim <namhyung@kernel.org> - 2016-01-19 14:00 +0100
      Re: [RFC 00/26] perf tools: Introduce hists specific format entries Jiri Olsa <jolsa@redhat.com> - 2016-01-19 14:30 +0100
    Re: [RFC 00/26] perf tools: Introduce hists specific format entries Jiri Olsa <jolsa@redhat.com> - 2016-01-25 08:20 +0100
      Re: [RFC 00/26] perf tools: Introduce hists specific format entries Namhyung Kim <namhyung@kernel.org> - 2016-01-25 15:30 +0100
        Re: [RFC 00/26] perf tools: Introduce hists specific format entries Jiri Olsa <jolsa@redhat.com> - 2016-01-25 15:40 +0100

Page 1 of 2  [1] 2  Next page →


#1311398 — [RFC 00/26] perf tools: Introduce hists specific format entries

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[RFC 00/26] perf tools: Introduce hists specific format entries
Message-ID<qSeil-73y-3@gated-at.bofh.it>
hi,
currently we have global format sort and output
lists. This rfc patchset introduces hists object
based format entries to allow the hist object to
carry specific format entries.

This will allow to have distinguished hist objects
displaying different stuff in output.

Also available in:
  git://git.kernel.org/pub/scm/linux/kernel/git/jolsa/perf.git
  perf/hists_fmt

thanks for comments,
jirka


---
Jiri Olsa (26):
      perf tools: Factor output_resort from hists__output_resort
      perf tools: Introduce perf_evsel__output_resort function
      perf tools: Add _idx fields into struct perf_hpp_fmt
      perf tools: Use struct perf_hpp_fmt::idx in perf_hpp__reset_width
      perf tools: Add equal method to perf_hpp_fmt struct
      perf tools: Add hpp__equal callback function
      perf tools: Make hpp setup function generic
      perf report: Move ui initialization ahead of sort setup
      perf tools: Allocate output sort field
      perf tools: Remove perf_hpp__column_(disable|enable)
      perf tools: Properly release format fields
      perf tools: Separate sort fields parsing into setup_sort_list function
      perf tools: Separate output fields parsing into setup_output_list function
      perf tools: Introduce struct perf_hpp_list
      perf tools: Introduce perf_hpp_list__init function
      perf tools: Add perf_hpp_list register helpers
      perf tools: Pass perf_hpp_list all the way through setup_sort_list
      perf tools: Pass perf_hpp_list all the way through setup_output_list
      perf tools: Introduce perf_hpp_list__for_each_format macro
      perf tools: Introduce perf_hpp_list__for_each_format_safe macro
      perf tools: Introduce perf_hpp_list__for_each_sort_list macro
      perf tools: Introduce perf_hpp_list__for_each_sort_list_safe macro
      perf tools: Add struct perf_hpp_list argument to helper functions
      perf tools: Add hpp_list into struct hists object
      perf tools: Introduce hists__for_each_format macro
      perf tools: Introduce hists__for_each_sort_list macro

 tools/perf/builtin-annotate.c     |   2 +-
 tools/perf/builtin-report.c       |  20 ++++-----
 tools/perf/builtin-top.c          |  10 +++--
 tools/perf/tests/hists_cumulate.c |   2 +-
 tools/perf/tests/hists_filter.c   |   2 +-
 tools/perf/tests/hists_output.c   |  10 ++---
 tools/perf/ui/browsers/hists.c    |   8 ++--
 tools/perf/ui/gtk/hists.c         |   6 +--
 tools/perf/ui/hist.c              | 170 +++++++++++++++++++++++++++++++++++++----------------------------------
 tools/perf/ui/stdio/hist.c        |  10 ++---
 tools/perf/util/hist.c            |  47 ++++++++++++++------
 tools/perf/util/hist.h            |  65 ++++++++++++++++++++--------
 tools/perf/util/sort.c            | 231 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
 13 files changed, 359 insertions(+), 224 deletions(-)

[toc] | [next] | [standalone]


#1311399 — [PATCH 14/26] perf tools: Introduce struct perf_hpp_list

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 14/26] perf tools: Introduce struct perf_hpp_list
Message-ID<qSeim-73y-15@gated-at.bofh.it>
In reply to#1311398
Gather output and sort lists under struct perf_hpp_list,
so we could have multiple instancies of sort/output format
entries.

Replacing current perf_hpp__list and perf_hpp__sort_list
lists with single perf_hpp_list instance.

Link: http://lkml.kernel.org/n/tip-bdn1hamlwp2529thajbrh2w7@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c   | 11 ++++++-----
 tools/perf/util/hist.h | 16 ++++++++++------
 2 files changed, 16 insertions(+), 11 deletions(-)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index 2cd1a03bf375..1253a62c422f 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -436,9 +436,10 @@ struct perf_hpp_fmt perf_hpp__format[] = {
 	HPP__PRINT_FNS("Period", period, PERIOD)
 };
 
-LIST_HEAD(perf_hpp__list);
-LIST_HEAD(perf_hpp__sort_list);
-
+struct perf_hpp_list perf_hpp_list = {
+	.list		= LIST_HEAD_INIT(perf_hpp_list.list),
+	.sort_list	= LIST_HEAD_INIT(perf_hpp_list.sort_list),
+};
 
 #undef HPP__COLOR_PRINT_FNS
 #undef HPP__COLOR_ACC_PRINT_FNS
@@ -506,7 +507,7 @@ void perf_hpp__init(void)
 
 void perf_hpp__column_register(struct perf_hpp_fmt *format)
 {
-	list_add_tail(&format->list, &perf_hpp__list);
+	list_add_tail(&format->list, &perf_hpp_list.list);
 }
 
 void perf_hpp__column_unregister(struct perf_hpp_fmt *format)
@@ -516,7 +517,7 @@ void perf_hpp__column_unregister(struct perf_hpp_fmt *format)
 
 void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
 {
-	list_add_tail(&format->sort_list, &perf_hpp__sort_list);
+	list_add_tail(&format->sort_list, &perf_hpp_list.sort_list);
 }
 
 void perf_hpp__cancel_cumulate(void)
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index f3bcf2d38733..a9c8ccfcc284 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -226,20 +226,24 @@ struct perf_hpp_fmt {
 	int idx;
 };
 
-extern struct list_head perf_hpp__list;
-extern struct list_head perf_hpp__sort_list;
+struct perf_hpp_list {
+	struct list_head list;
+	struct list_head sort_list;
+};
+
+extern struct perf_hpp_list perf_hpp_list;
 
 #define perf_hpp__for_each_format(format) \
-	list_for_each_entry(format, &perf_hpp__list, list)
+	list_for_each_entry(format, &perf_hpp_list.list, list)
 
 #define perf_hpp__for_each_format_safe(format, tmp)	\
-	list_for_each_entry_safe(format, tmp, &perf_hpp__list, list)
+	list_for_each_entry_safe(format, tmp, &perf_hpp_list.list, list)
 
 #define perf_hpp__for_each_sort_list(format) \
-	list_for_each_entry(format, &perf_hpp__sort_list, sort_list)
+	list_for_each_entry(format, &perf_hpp_list.sort_list, sort_list)
 
 #define perf_hpp__for_each_sort_list_safe(format, tmp)	\
-	list_for_each_entry_safe(format, tmp, &perf_hpp__sort_list, sort_list)
+	list_for_each_entry_safe(format, tmp, &perf_hpp_list.sort_list, sort_list)
 
 extern struct perf_hpp_fmt perf_hpp__format[];
 
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1316802 — Re: [PATCH 14/26] perf tools: Introduce struct perf_hpp_list

FromNamhyung Kim <namhyung@kernel.org>
Date2016-01-25 16:10 +0100
SubjectRe: [PATCH 14/26] perf tools: Introduce struct perf_hpp_list
Message-ID<qUQWe-5Ow-35@gated-at.bofh.it>
In reply to#1311399
On Mon, Jan 18, 2016 at 10:24:12AM +0100, Jiri Olsa wrote:
> Gather output and sort lists under struct perf_hpp_list,
> so we could have multiple instancies of sort/output format
> entries.
> 
> Replacing current perf_hpp__list and perf_hpp__sort_list
> lists with single perf_hpp_list instance.
> 
> Link: http://lkml.kernel.org/n/tip-bdn1hamlwp2529thajbrh2w7@git.kernel.org
> Signed-off-by: Jiri Olsa <jolsa@kernel.org>
> ---
>  tools/perf/ui/hist.c   | 11 ++++++-----
>  tools/perf/util/hist.h | 16 ++++++++++------
>  2 files changed, 16 insertions(+), 11 deletions(-)
> 
> diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
> index 2cd1a03bf375..1253a62c422f 100644
> --- a/tools/perf/ui/hist.c
> +++ b/tools/perf/ui/hist.c
> @@ -436,9 +436,10 @@ struct perf_hpp_fmt perf_hpp__format[] = {
>  	HPP__PRINT_FNS("Period", period, PERIOD)
>  };
>  
> -LIST_HEAD(perf_hpp__list);
> -LIST_HEAD(perf_hpp__sort_list);
> -
> +struct perf_hpp_list perf_hpp_list = {
> +	.list		= LIST_HEAD_INIT(perf_hpp_list.list),
> +	.sort_list	= LIST_HEAD_INIT(perf_hpp_list.sort_list),

As the struct name already contains 'list', I don't think we need to
repeat it in the fields.  


> +};
>  
>  #undef HPP__COLOR_PRINT_FNS
>  #undef HPP__COLOR_ACC_PRINT_FNS
> @@ -506,7 +507,7 @@ void perf_hpp__init(void)
>  
>  void perf_hpp__column_register(struct perf_hpp_fmt *format)
>  {
> -	list_add_tail(&format->list, &perf_hpp__list);
> +	list_add_tail(&format->list, &perf_hpp_list.list);
>  }
>  
>  void perf_hpp__column_unregister(struct perf_hpp_fmt *format)
> @@ -516,7 +517,7 @@ void perf_hpp__column_unregister(struct perf_hpp_fmt *format)
>  
>  void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
>  {
> -	list_add_tail(&format->sort_list, &perf_hpp__sort_list);
> +	list_add_tail(&format->sort_list, &perf_hpp_list.sort_list);
>  }
>  
>  void perf_hpp__cancel_cumulate(void)
> diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
> index f3bcf2d38733..a9c8ccfcc284 100644
> --- a/tools/perf/util/hist.h
> +++ b/tools/perf/util/hist.h
> @@ -226,20 +226,24 @@ struct perf_hpp_fmt {
>  	int idx;
>  };
>  
> -extern struct list_head perf_hpp__list;
> -extern struct list_head perf_hpp__sort_list;
> +struct perf_hpp_list {
> +	struct list_head list;
> +	struct list_head sort_list;
> +};

What about this?

  struct perf_hpp_list {
    struct list_head fields;
    struct list_head sorts;
  };

This also aligns with the option names.

Thanks,
Namhyung


> +
> +extern struct perf_hpp_list perf_hpp_list;
>  
>  #define perf_hpp__for_each_format(format) \
> -	list_for_each_entry(format, &perf_hpp__list, list)
> +	list_for_each_entry(format, &perf_hpp_list.list, list)
>  
>  #define perf_hpp__for_each_format_safe(format, tmp)	\
> -	list_for_each_entry_safe(format, tmp, &perf_hpp__list, list)
> +	list_for_each_entry_safe(format, tmp, &perf_hpp_list.list, list)
>  
>  #define perf_hpp__for_each_sort_list(format) \
> -	list_for_each_entry(format, &perf_hpp__sort_list, sort_list)
> +	list_for_each_entry(format, &perf_hpp_list.sort_list, sort_list)
>  
>  #define perf_hpp__for_each_sort_list_safe(format, tmp)	\
> -	list_for_each_entry_safe(format, tmp, &perf_hpp__sort_list, sort_list)
> +	list_for_each_entry_safe(format, tmp, &perf_hpp_list.sort_list, sort_list)
>  
>  extern struct perf_hpp_fmt perf_hpp__format[];
>  
> -- 
> 2.4.3
> 

[toc] | [prev] | [next] | [standalone]


#1316805 — Re: [PATCH 14/26] perf tools: Introduce struct perf_hpp_list

FromJiri Olsa <jolsa@redhat.com>
Date2016-01-25 16:10 +0100
SubjectRe: [PATCH 14/26] perf tools: Introduce struct perf_hpp_list
Message-ID<qUQWf-5Ow-45@gated-at.bofh.it>
In reply to#1316802
On Tue, Jan 26, 2016 at 12:00:46AM +0900, Namhyung Kim wrote:

SNIP

> >  void perf_hpp__cancel_cumulate(void)
> > diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
> > index f3bcf2d38733..a9c8ccfcc284 100644
> > --- a/tools/perf/util/hist.h
> > +++ b/tools/perf/util/hist.h
> > @@ -226,20 +226,24 @@ struct perf_hpp_fmt {
> >  	int idx;
> >  };
> >  
> > -extern struct list_head perf_hpp__list;
> > -extern struct list_head perf_hpp__sort_list;
> > +struct perf_hpp_list {
> > +	struct list_head list;
> > +	struct list_head sort_list;
> > +};
> 
> What about this?
> 
>   struct perf_hpp_list {
>     struct list_head fields;
>     struct list_head sorts;
>   };
> 
> This also aligns with the option names.

yep, sounds better ;-)

thanks,
jirka

[toc] | [prev] | [next] | [standalone]


#1311400 — [PATCH 21/26] perf tools: Introduce perf_hpp_list__for_each_sort_list macro

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 21/26] perf tools: Introduce perf_hpp_list__for_each_sort_list macro
Message-ID<qSeim-73y-19@gated-at.bofh.it>
In reply to#1311398
Introducing perf_hpp_list__for_each_sort_list macro
to iterate perf_hpp_list object's sort entries.

Link: http://lkml.kernel.org/n/tip-b2r6j96rjzp7c3ys2e0pqvo5@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c   | 4 ++--
 tools/perf/util/hist.c | 6 +++---
 tools/perf/util/hist.h | 4 ++--
 3 files changed, 7 insertions(+), 7 deletions(-)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index 4fbb2f43ba3a..c8d74b357d5e 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -553,7 +553,7 @@ void perf_hpp__setup_output_field(void)
 	struct perf_hpp_fmt *fmt;
 
 	/* append sort keys to output field */
-	perf_hpp__for_each_sort_list(fmt) {
+	perf_hpp_list__for_each_sort_list(&perf_hpp_list, fmt) {
 		struct perf_hpp_fmt *pos;
 
 		perf_hpp_list__for_each_format(&perf_hpp_list, pos) {
@@ -575,7 +575,7 @@ void perf_hpp__append_sort_keys(void)
 	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		struct perf_hpp_fmt *pos;
 
-		perf_hpp__for_each_sort_list(pos) {
+		perf_hpp_list__for_each_sort_list(&perf_hpp_list, pos) {
 			if (fmt_equal(fmt, pos))
 				goto next;
 		}
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index c80f01460e3b..3ba70b7868d5 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -952,7 +952,7 @@ hist_entry__cmp(struct hist_entry *left, struct hist_entry *right)
 	struct perf_hpp_fmt *fmt;
 	int64_t cmp = 0;
 
-	perf_hpp__for_each_sort_list(fmt) {
+	perf_hpp_list__for_each_sort_list(&perf_hpp_list, fmt) {
 		cmp = fmt->cmp(fmt, left, right);
 		if (cmp)
 			break;
@@ -967,7 +967,7 @@ hist_entry__collapse(struct hist_entry *left, struct hist_entry *right)
 	struct perf_hpp_fmt *fmt;
 	int64_t cmp = 0;
 
-	perf_hpp__for_each_sort_list(fmt) {
+	perf_hpp_list__for_each_sort_list(&perf_hpp_list, fmt) {
 		cmp = fmt->collapse(fmt, left, right);
 		if (cmp)
 			break;
@@ -1111,7 +1111,7 @@ static int hist_entry__sort(struct hist_entry *a, struct hist_entry *b)
 	struct perf_hpp_fmt *fmt;
 	int64_t cmp = 0;
 
-	perf_hpp__for_each_sort_list(fmt) {
+	perf_hpp_list__for_each_sort_list(&perf_hpp_list, fmt) {
 		if (perf_hpp__should_skip(fmt, a->hists))
 			continue;
 
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index ac0cfb68018c..130f825235a3 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -254,8 +254,8 @@ static inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
 #define perf_hpp_list__for_each_format_safe(_list, format, tmp)	\
 	list_for_each_entry_safe(format, tmp, &(_list)->list, list)
 
-#define perf_hpp__for_each_sort_list(format) \
-	list_for_each_entry(format, &perf_hpp_list.sort_list, sort_list)
+#define perf_hpp_list__for_each_sort_list(_list, format) \
+	list_for_each_entry(format, &(_list)->sort_list, sort_list)
 
 #define perf_hpp__for_each_sort_list_safe(format, tmp)	\
 	list_for_each_entry_safe(format, tmp, &perf_hpp_list.sort_list, sort_list)
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311401 — [PATCH 16/26] perf tools: Add perf_hpp_list register helpers

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 16/26] perf tools: Add perf_hpp_list register helpers
Message-ID<qSeim-73y-21@gated-at.bofh.it>
In reply to#1311398
Add ing 2 perf_hpp_list register helpers:
  perf_hpp_list__column_register
  perf_hpp_list__register_sort_field

to be called within existing helpers:
  perf_hpp__column_register
  perf_hpp__register_sort_field

to register format entries within global
perf_hpp_list object.

Link: http://lkml.kernel.org/n/tip-oklhquvszc18kzox0vscjxtt@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c   | 14 ++++++++------
 tools/perf/util/hist.h | 18 +++++++++++++++---
 2 files changed, 23 insertions(+), 9 deletions(-)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index 1253a62c422f..7200349b44b9 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -505,19 +505,21 @@ void perf_hpp__init(void)
 		hpp_dimension__add_output(PERF_HPP__PERIOD);
 }
 
-void perf_hpp__column_register(struct perf_hpp_fmt *format)
+void perf_hpp_list__column_register(struct perf_hpp_list *list,
+				    struct perf_hpp_fmt *format)
 {
-	list_add_tail(&format->list, &perf_hpp_list.list);
+	list_add_tail(&format->list, &list->list);
 }
 
-void perf_hpp__column_unregister(struct perf_hpp_fmt *format)
+void perf_hpp_list__register_sort_field(struct perf_hpp_list *list,
+					struct perf_hpp_fmt *format)
 {
-	list_del(&format->list);
+	list_add_tail(&format->sort_list, &list->sort_list);
 }
 
-void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
+void perf_hpp__column_unregister(struct perf_hpp_fmt *format)
 {
-	list_add_tail(&format->sort_list, &perf_hpp_list.sort_list);
+	list_del(&format->list);
 }
 
 void perf_hpp__cancel_cumulate(void)
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index ea50a9cf2316..dfa11777efbe 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -233,6 +233,21 @@ struct perf_hpp_list {
 
 extern struct perf_hpp_list perf_hpp_list;
 
+void perf_hpp_list__column_register(struct perf_hpp_list *list,
+				    struct perf_hpp_fmt *format);
+void perf_hpp_list__register_sort_field(struct perf_hpp_list *list,
+					struct perf_hpp_fmt *format);
+
+static inline void perf_hpp__column_register(struct perf_hpp_fmt *format)
+{
+	perf_hpp_list__column_register(&perf_hpp_list, format);
+}
+
+static inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
+{
+	perf_hpp_list__register_sort_field(&perf_hpp_list, format);
+}
+
 #define perf_hpp__for_each_format(format) \
 	list_for_each_entry(format, &perf_hpp_list.list, list)
 
@@ -262,11 +277,8 @@ enum {
 };
 
 void perf_hpp__init(void);
-void perf_hpp__column_register(struct perf_hpp_fmt *format);
 void perf_hpp__column_unregister(struct perf_hpp_fmt *format);
 void perf_hpp__cancel_cumulate(void);
-
-void perf_hpp__register_sort_field(struct perf_hpp_fmt *format);
 void perf_hpp__setup_output_field(void);
 void perf_hpp__reset_output_field(void);
 void perf_hpp__append_sort_keys(void);
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311402 — [PATCH 17/26] perf tools: Pass perf_hpp_list all the way through setup_sort_list

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 17/26] perf tools: Pass perf_hpp_list all the way through setup_sort_list
Message-ID<qSeim-73y-25@gated-at.bofh.it>
In reply to#1311398
Passing perf_hpp_list all the way through setup_sort_list
so the sort entry could be added on the arbitrary list.

Link: http://lkml.kernel.org/n/tip-1r0tlhwdfolal61gvciii07e@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/sort.c | 34 +++++++++++++++++++---------------
 1 file changed, 19 insertions(+), 15 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 3461198217fc..020b3244aec9 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1604,14 +1604,15 @@ static struct perf_hpp_fmt *__hpp_dimension__alloc_hpp(struct hpp_dimension *hd)
 	return fmt;
 }
 
-static int __sort_dimension__add_hpp_sort(struct sort_dimension *sd)
+static int __sort_dimension__add_hpp_sort(struct perf_hpp_list *list,
+					  struct sort_dimension *sd)
 {
 	struct hpp_sort_entry *hse = __sort_dimension__alloc_hpp(sd);
 
 	if (hse == NULL)
 		return -1;
 
-	perf_hpp__register_sort_field(&hse->hpp);
+	perf_hpp_list__register_sort_field(list, &hse->hpp);
 	return 0;
 }
 
@@ -2084,12 +2085,13 @@ out:
 	return ret;
 }
 
-static int __sort_dimension__add(struct sort_dimension *sd)
+static int __sort_dimension__add(struct perf_hpp_list *list,
+				 struct sort_dimension *sd)
 {
 	if (sd->taken)
 		return 0;
 
-	if (__sort_dimension__add_hpp_sort(sd) < 0)
+	if (__sort_dimension__add_hpp_sort(list, sd) < 0)
 		return -1;
 
 	if (sd->entry->se_collapse)
@@ -2100,7 +2102,8 @@ static int __sort_dimension__add(struct sort_dimension *sd)
 	return 0;
 }
 
-static int __hpp_dimension__add(struct hpp_dimension *hd)
+static int __hpp_dimension__add(struct perf_hpp_list *list,
+				struct hpp_dimension *hd)
 {
 	struct perf_hpp_fmt *fmt;
 
@@ -2112,7 +2115,7 @@ static int __hpp_dimension__add(struct hpp_dimension *hd)
 		return -1;
 
 	hd->taken = 1;
-	perf_hpp__register_sort_field(fmt);
+	perf_hpp_list__register_sort_field(list, fmt);
 	return 0;
 }
 
@@ -2150,7 +2153,7 @@ int hpp_dimension__add_output(unsigned col)
 	return __hpp_dimension__add_output(&hpp_sort_dimensions[col]);
 }
 
-static int sort_dimension__add(const char *tok,
+static int sort_dimension__add(struct perf_hpp_list *list, const char *tok,
 			       struct perf_evlist *evlist __maybe_unused)
 {
 	unsigned int i;
@@ -2188,7 +2191,7 @@ static int sort_dimension__add(const char *tok,
 			sort__has_socket = 1;
 		}
 
-		return __sort_dimension__add(sd);
+		return __sort_dimension__add(list, sd);
 	}
 
 	for (i = 0; i < ARRAY_SIZE(hpp_sort_dimensions); i++) {
@@ -2197,7 +2200,7 @@ static int sort_dimension__add(const char *tok,
 		if (strncasecmp(tok, hd->name, strlen(tok)))
 			continue;
 
-		return __hpp_dimension__add(hd);
+		return __hpp_dimension__add(list, hd);
 	}
 
 	for (i = 0; i < ARRAY_SIZE(bstack_sort_dimensions); i++) {
@@ -2212,7 +2215,7 @@ static int sort_dimension__add(const char *tok,
 		if (sd->entry == &sort_sym_from || sd->entry == &sort_sym_to)
 			sort__has_sym = 1;
 
-		__sort_dimension__add(sd);
+		__sort_dimension__add(list, sd);
 		return 0;
 	}
 
@@ -2228,7 +2231,7 @@ static int sort_dimension__add(const char *tok,
 		if (sd->entry == &sort_mem_daddr_sym)
 			sort__has_sym = 1;
 
-		__sort_dimension__add(sd);
+		__sort_dimension__add(list, sd);
 		return 0;
 	}
 
@@ -2238,14 +2241,15 @@ static int sort_dimension__add(const char *tok,
 	return -ESRCH;
 }
 
-static int setup_sort_list(char *str, struct perf_evlist *evlist)
+static int setup_sort_list(struct perf_hpp_list *list, char *str,
+			   struct perf_evlist *evlist)
 {
 	char *tmp, *tok;
 	int ret = 0;
 
 	for (tok = strtok_r(str, ", ", &tmp);
 			tok; tok = strtok_r(NULL, ", ", &tmp)) {
-		ret = sort_dimension__add(tok, evlist);
+		ret = sort_dimension__add(list, tok, evlist);
 		if (ret == -EINVAL) {
 			error("Invalid --sort key: `%s'", tok);
 			break;
@@ -2390,7 +2394,7 @@ static int __setup_sorting(struct perf_evlist *evlist)
 		}
 	}
 
-	ret = setup_sort_list(str, evlist);
+	ret = setup_sort_list(&perf_hpp_list, str, evlist);
 
 	free(str);
 	return ret;
@@ -2612,7 +2616,7 @@ int setup_sorting(struct perf_evlist *evlist)
 		return err;
 
 	if (parent_pattern != default_parent_pattern) {
-		err = sort_dimension__add("parent", evlist);
+		err = sort_dimension__add(&perf_hpp_list, "parent", evlist);
 		if (err < 0)
 			return err;
 	}
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311403 — [PATCH 09/26] perf tools: Allocate output sort field

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 09/26] perf tools: Allocate output sort field
Message-ID<qSeim-73y-23@gated-at.bofh.it>
In reply to#1311398
Currently we use static output fields, because we
have single global list of all sort/output fields.

We will add hists specific sort and output lists in
following patches, so we need all format entries to
be dynamically allocated. Adding support to allocate
output sort field.

Link: http://lkml.kernel.org/n/tip-35p3t3tqxcjbua9bhnkehady@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c   | 16 ++++++++++++++--
 tools/perf/util/sort.c | 41 +++++++++++++++++++++++++++++++++--------
 2 files changed, 47 insertions(+), 10 deletions(-)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index b0fcaecb7d1d..c877c52ff4bc 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -533,11 +533,23 @@ void perf_hpp__column_disable(unsigned col)
 
 void perf_hpp__cancel_cumulate(void)
 {
+	struct perf_hpp_fmt *fmt, *acc, *ovh, *tmp;
+
 	if (is_strict_order(field_order))
 		return;
 
-	perf_hpp__column_disable(PERF_HPP__OVERHEAD_ACC);
-	perf_hpp__format[PERF_HPP__OVERHEAD].name = "Overhead";
+	ovh = &perf_hpp__format[PERF_HPP__OVERHEAD];
+	acc = &perf_hpp__format[PERF_HPP__OVERHEAD_ACC];
+
+	perf_hpp__for_each_format_safe(fmt, tmp) {
+		if (acc->equal(acc, fmt)) {
+			perf_hpp__column_unregister(fmt);
+			continue;
+		}
+
+		if (ovh->equal(ovh, fmt))
+			fmt->name = "Overhead";
+	}
 }
 
 static bool fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b)
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 1b57ec9d7c2f..a4ce4807fbb7 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1576,6 +1576,19 @@ __sort_dimension__alloc_hpp(struct sort_dimension *sd)
 	return hse;
 }
 
+static struct perf_hpp_fmt *__hpp_dimension__alloc_hpp(struct hpp_dimension *hd)
+{
+	struct perf_hpp_fmt *fmt;
+
+	fmt = memdup(hd->fmt, sizeof(*fmt));
+	if (fmt) {
+		INIT_LIST_HEAD(&fmt->list);
+		INIT_LIST_HEAD(&fmt->sort_list);
+	}
+
+	return fmt;
+}
+
 static int __sort_dimension__add_hpp_sort(struct sort_dimension *sd)
 {
 	struct hpp_sort_entry *hse = __sort_dimension__alloc_hpp(sd);
@@ -2065,11 +2078,17 @@ static int __sort_dimension__add(struct sort_dimension *sd)
 
 static int __hpp_dimension__add(struct hpp_dimension *hd)
 {
-	if (!hd->taken) {
-		hd->taken = 1;
+	struct perf_hpp_fmt *fmt;
 
-		perf_hpp__register_sort_field(hd->fmt);
-	}
+	if (hd->taken)
+		return 0;
+
+	fmt = __hpp_dimension__alloc_hpp(hd);
+	if (!fmt)
+		return -1;
+
+	hd->taken = 1;
+	perf_hpp__register_sort_field(fmt);
 	return 0;
 }
 
@@ -2087,11 +2106,17 @@ static int __sort_dimension__add_output(struct sort_dimension *sd)
 
 static int __hpp_dimension__add_output(struct hpp_dimension *hd)
 {
-	if (!hd->taken) {
-		hd->taken = 1;
+	struct perf_hpp_fmt *fmt;
 
-		perf_hpp__column_register(hd->fmt);
-	}
+	if (hd->taken)
+		return 0;
+
+	fmt = __hpp_dimension__alloc_hpp(hd);
+	if (!fmt)
+		return -1;
+
+	hd->taken = 1;
+	perf_hpp__column_register(fmt);
 	return 0;
 }
 
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311404 — [PATCH 13/26] perf tools: Separate output fields parsing into setup_output_list function

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 13/26] perf tools: Separate output fields parsing into setup_output_list function
Message-ID<qSeim-73y-27@gated-at.bofh.it>
In reply to#1311398
Separating output fields parsing into setup_output_list
function, so it's separated from field_order  string
setup and could be reused later in following patches.

Link: http://lkml.kernel.org/n/tip-4f4bt1un7gyfbyat7lah65dc@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/sort.c | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 844c97f51198..3461198217fc 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -2532,6 +2532,26 @@ static int output_field_add(char *tok)
 	return -ESRCH;
 }
 
+static int setup_output_list(char *str)
+{
+	char *tmp, *tok;
+	int ret = 0;
+
+	for (tok = strtok_r(str, ", ", &tmp);
+			tok; tok = strtok_r(NULL, ", ", &tmp)) {
+		ret = output_field_add(tok);
+		if (ret == -EINVAL) {
+			error("Invalid --fields key: `%s'", tok);
+			break;
+		} else if (ret == -ESRCH) {
+			error("Unknown --fields key: `%s'", tok);
+			break;
+		}
+	}
+
+	return ret;
+}
+
 static void reset_dimensions(void)
 {
 	unsigned int i;
@@ -2556,7 +2576,7 @@ bool is_strict_order(const char *order)
 
 static int __setup_output_field(void)
 {
-	char *tmp, *tok, *str, *strp;
+	char *str, *strp;
 	int ret = -EINVAL;
 
 	if (field_order == NULL)
@@ -2576,17 +2596,7 @@ static int __setup_output_field(void)
 		goto out;
 	}
 
-	for (tok = strtok_r(strp, ", ", &tmp);
-			tok; tok = strtok_r(NULL, ", ", &tmp)) {
-		ret = output_field_add(tok);
-		if (ret == -EINVAL) {
-			error("Invalid --fields key: `%s'", tok);
-			break;
-		} else if (ret == -ESRCH) {
-			error("Unknown --fields key: `%s'", tok);
-			break;
-		}
-	}
+	ret = setup_output_list(strp);
 
 out:
 	free(str);
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311405 — [PATCH 15/26] perf tools: Introduce perf_hpp_list__init function

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 15/26] perf tools: Introduce perf_hpp_list__init function
Message-ID<qSeim-73y-29@gated-at.bofh.it>
In reply to#1311398
Introducing perf_hpp_list__init function to have
an easy way to initialize perf_hpp_list struct.

Link: http://lkml.kernel.org/n/tip-6ucnvu4gdd1rl9rsojgn6t1f@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/hist.c | 6 ++++++
 tools/perf/util/hist.h | 2 ++
 2 files changed, 8 insertions(+)

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index a94067c8f753..c80f01460e3b 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -1658,3 +1658,9 @@ int hists__init(void)
 
 	return err;
 }
+
+void perf_hpp_list__init(struct perf_hpp_list *list)
+{
+	INIT_LIST_HEAD(&list->list);
+	INIT_LIST_HEAD(&list->sort_list);
+}
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index a9c8ccfcc284..ea50a9cf2316 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -386,4 +386,6 @@ int parse_filter_percentage(const struct option *opt __maybe_unused,
 			    const char *arg, int unset __maybe_unused);
 int perf_hist_config(const char *var, const char *value);
 
+void perf_hpp_list__init(struct perf_hpp_list *list);
+
 #endif	/* __PERF_HIST_H */
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311407 — [PATCH 11/26] perf tools: Properly release format fields

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 11/26] perf tools: Properly release format fields
Message-ID<qSeim-73y-33@gated-at.bofh.it>
In reply to#1311398
With multiple list holding format entries, we need the
support support to properly release format output/sort
fields.

Link: http://lkml.kernel.org/n/tip-4gs7pj4kgbvgs38vyj7m9z0i@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c   |  8 ++++++++
 tools/perf/util/hist.h |  1 +
 tools/perf/util/sort.c | 24 ++++++++++++++++++++++++
 3 files changed, 33 insertions(+)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index 80d63a997287..2cd1a03bf375 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -583,6 +583,12 @@ next:
 	}
 }
 
+static void fmt_free(struct perf_hpp_fmt *fmt)
+{
+	if (fmt->free)
+		fmt->free(fmt);
+}
+
 void perf_hpp__reset_output_field(void)
 {
 	struct perf_hpp_fmt *fmt, *tmp;
@@ -591,12 +597,14 @@ void perf_hpp__reset_output_field(void)
 	perf_hpp__for_each_format_safe(fmt, tmp) {
 		list_del_init(&fmt->list);
 		list_del_init(&fmt->sort_list);
+		fmt_free(fmt);
 	}
 
 	/* reset sort keys */
 	perf_hpp__for_each_sort_list_safe(fmt, tmp) {
 		list_del_init(&fmt->list);
 		list_del_init(&fmt->sort_list);
+		fmt_free(fmt);
 	}
 }
 
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 1f9e21dd53f3..f3bcf2d38733 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -216,6 +216,7 @@ struct perf_hpp_fmt {
 	int64_t (*sort)(struct perf_hpp_fmt *fmt,
 			struct hist_entry *a, struct hist_entry *b);
 	bool (*equal)(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b);
+	void (*free)(struct perf_hpp_fmt *fmt);
 
 	struct list_head list;
 	struct list_head sort_list;
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index a4ce4807fbb7..a7eed4485afc 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -1544,6 +1544,14 @@ static bool __sort__hpp_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b)
 	return hse_a->se == hse_b->se;
 }
 
+static void hse_free(struct perf_hpp_fmt *fmt)
+{
+	struct hpp_sort_entry *hse;
+
+	hse = container_of(fmt, struct hpp_sort_entry, hpp);
+	free(hse);
+}
+
 static struct hpp_sort_entry *
 __sort_dimension__alloc_hpp(struct sort_dimension *sd)
 {
@@ -1566,6 +1574,7 @@ __sort_dimension__alloc_hpp(struct sort_dimension *sd)
 	hse->hpp.collapse = __sort__hpp_collapse;
 	hse->hpp.sort = __sort__hpp_sort;
 	hse->hpp.equal = __sort__hpp_equal;
+	hse->hpp.free = hse_free;
 
 	INIT_LIST_HEAD(&hse->hpp.list);
 	INIT_LIST_HEAD(&hse->hpp.sort_list);
@@ -1576,6 +1585,11 @@ __sort_dimension__alloc_hpp(struct sort_dimension *sd)
 	return hse;
 }
 
+static void hpp_free(struct perf_hpp_fmt *fmt)
+{
+	free(fmt);
+}
+
 static struct perf_hpp_fmt *__hpp_dimension__alloc_hpp(struct hpp_dimension *hd)
 {
 	struct perf_hpp_fmt *fmt;
@@ -1584,6 +1598,7 @@ static struct perf_hpp_fmt *__hpp_dimension__alloc_hpp(struct hpp_dimension *hd)
 	if (fmt) {
 		INIT_LIST_HEAD(&fmt->list);
 		INIT_LIST_HEAD(&fmt->sort_list);
+		fmt->free = hpp_free;
 	}
 
 	return fmt;
@@ -1817,6 +1832,14 @@ bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *fmt)
 	return fmt->cmp == __sort__hde_cmp;
 }
 
+static void hde_free(struct perf_hpp_fmt *fmt)
+{
+	struct hpp_dynamic_entry *hde;
+
+	hde = container_of(fmt, struct hpp_dynamic_entry, hpp);
+	free(hde);
+}
+
 static struct hpp_dynamic_entry *
 __alloc_dynamic_entry(struct perf_evsel *evsel, struct format_field *field)
 {
@@ -1841,6 +1864,7 @@ __alloc_dynamic_entry(struct perf_evsel *evsel, struct format_field *field)
 	hde->hpp.cmp = __sort__hde_cmp;
 	hde->hpp.collapse = __sort__hde_cmp;
 	hde->hpp.sort = __sort__hde_cmp;
+	hde->hpp.free = hde_free;
 
 	INIT_LIST_HEAD(&hde->hpp.list);
 	INIT_LIST_HEAD(&hde->hpp.sort_list);
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311408 — [PATCH 07/26] perf tools: Make hpp setup function generic

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 07/26] perf tools: Make hpp setup function generic
Message-ID<qSein-73y-37@gated-at.bofh.it>
In reply to#1311398
Now we have equal method implemented for hpp format entries
we can ease up the logic in following functions and make
them generic wrt comparing format entries:

  perf_hpp__setup_output_field
  perf_hpp__append_sort_keys

Link: http://lkml.kernel.org/n/tip-6ncdmurfcmyk4sfy7fr4bkr1@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c | 36 ++++++++----------------------------
 1 file changed, 8 insertions(+), 28 deletions(-)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index b543f4b7d7d3..b0fcaecb7d1d 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -551,21 +551,11 @@ void perf_hpp__setup_output_field(void)
 
 	/* append sort keys to output field */
 	perf_hpp__for_each_sort_list(fmt) {
-		if (!list_empty(&fmt->list))
-			continue;
+		struct perf_hpp_fmt *pos;
 
-		/*
-		 * sort entry fields are dynamically created,
-		 * so they can share a same sort key even though
-		 * the list is empty.
-		 */
-		if (perf_hpp__is_sort_entry(fmt)) {
-			struct perf_hpp_fmt *pos;
-
-			perf_hpp__for_each_format(pos) {
-				if (fmt_equal(fmt, pos))
-					goto next;
-			}
+		perf_hpp__for_each_format(pos) {
+			if (fmt_equal(fmt, pos))
+				goto next;
 		}
 
 		perf_hpp__column_register(fmt);
@@ -580,21 +570,11 @@ void perf_hpp__append_sort_keys(void)
 
 	/* append output fields to sort keys */
 	perf_hpp__for_each_format(fmt) {
-		if (!list_empty(&fmt->sort_list))
-			continue;
+		struct perf_hpp_fmt *pos;
 
-		/*
-		 * sort entry fields are dynamically created,
-		 * so they can share a same sort key even though
-		 * the list is empty.
-		 */
-		if (perf_hpp__is_sort_entry(fmt)) {
-			struct perf_hpp_fmt *pos;
-
-			perf_hpp__for_each_sort_list(pos) {
-				if (fmt_equal(fmt, pos))
-					goto next;
-			}
+		perf_hpp__for_each_sort_list(pos) {
+			if (fmt_equal(fmt, pos))
+				goto next;
 		}
 
 		perf_hpp__register_sort_field(fmt);
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311409 — [PATCH 12/26] perf tools: Separate sort fields parsing into setup_sort_list function

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 12/26] perf tools: Separate sort fields parsing into setup_sort_list function
Message-ID<qSein-73y-43@gated-at.bofh.it>
In reply to#1311398
Separating sort fields parsing into setup_sort_list
function, so it's separated from sort_order string
setup and could be reused later in following patches.

Link: http://lkml.kernel.org/n/tip-9h0ujdlvbx73llz3c7vo8j75@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/sort.c | 34 ++++++++++++++++++++++------------
 1 file changed, 22 insertions(+), 12 deletions(-)

diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index a7eed4485afc..844c97f51198 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -2238,6 +2238,26 @@ static int sort_dimension__add(const char *tok,
 	return -ESRCH;
 }
 
+static int setup_sort_list(char *str, struct perf_evlist *evlist)
+{
+	char *tmp, *tok;
+	int ret = 0;
+
+	for (tok = strtok_r(str, ", ", &tmp);
+			tok; tok = strtok_r(NULL, ", ", &tmp)) {
+		ret = sort_dimension__add(tok, evlist);
+		if (ret == -EINVAL) {
+			error("Invalid --sort key: `%s'", tok);
+			break;
+		} else if (ret == -ESRCH) {
+			error("Unknown --sort key: `%s'", tok);
+			break;
+		}
+	}
+
+	return ret;
+}
+
 static const char *get_default_sort_order(struct perf_evlist *evlist)
 {
 	const char *default_sort_orders[] = {
@@ -2332,7 +2352,7 @@ static char *setup_overhead(char *keys)
 
 static int __setup_sorting(struct perf_evlist *evlist)
 {
-	char *tmp, *tok, *str;
+	char *str;
 	const char *sort_keys;
 	int ret = 0;
 
@@ -2370,17 +2390,7 @@ static int __setup_sorting(struct perf_evlist *evlist)
 		}
 	}
 
-	for (tok = strtok_r(str, ", ", &tmp);
-			tok; tok = strtok_r(NULL, ", ", &tmp)) {
-		ret = sort_dimension__add(tok, evlist);
-		if (ret == -EINVAL) {
-			error("Invalid --sort key: `%s'", tok);
-			break;
-		} else if (ret == -ESRCH) {
-			error("Unknown --sort key: `%s'", tok);
-			break;
-		}
-	}
+	ret = setup_sort_list(str, evlist);
 
 	free(str);
 	return ret;
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311411 — [PATCH 20/26] perf tools: Introduce perf_hpp_list__for_each_format_safe macro

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 20/26] perf tools: Introduce perf_hpp_list__for_each_format_safe macro
Message-ID<qSeim-73y-35@gated-at.bofh.it>
In reply to#1311398
Introducing perf_hpp_list__for_each_format_safe macro
to iterate perf_hpp_list object's output entries safely.

Link: http://lkml.kernel.org/n/tip-nj3kp5noe7yt3jodpaha75ed@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c   | 4 ++--
 tools/perf/util/hist.h | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index dd0bb4a00d00..4fbb2f43ba3a 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -532,7 +532,7 @@ void perf_hpp__cancel_cumulate(void)
 	ovh = &perf_hpp__format[PERF_HPP__OVERHEAD];
 	acc = &perf_hpp__format[PERF_HPP__OVERHEAD_ACC];
 
-	perf_hpp__for_each_format_safe(fmt, tmp) {
+	perf_hpp_list__for_each_format_safe(&perf_hpp_list, fmt, tmp) {
 		if (acc->equal(acc, fmt)) {
 			perf_hpp__column_unregister(fmt);
 			continue;
@@ -597,7 +597,7 @@ void perf_hpp__reset_output_field(void)
 	struct perf_hpp_fmt *fmt, *tmp;
 
 	/* reset output fields */
-	perf_hpp__for_each_format_safe(fmt, tmp) {
+	perf_hpp_list__for_each_format_safe(&perf_hpp_list, fmt, tmp) {
 		list_del_init(&fmt->list);
 		list_del_init(&fmt->sort_list);
 		fmt_free(fmt);
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 31add4d1d860..ac0cfb68018c 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -251,8 +251,8 @@ static inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
 #define perf_hpp_list__for_each_format(_list, format) \
 	list_for_each_entry(format, &(_list)->list, list)
 
-#define perf_hpp__for_each_format_safe(format, tmp)	\
-	list_for_each_entry_safe(format, tmp, &perf_hpp_list.list, list)
+#define perf_hpp_list__for_each_format_safe(_list, format, tmp)	\
+	list_for_each_entry_safe(format, tmp, &(_list)->list, list)
 
 #define perf_hpp__for_each_sort_list(format) \
 	list_for_each_entry(format, &perf_hpp_list.sort_list, sort_list)
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311412 — [PATCH 23/26] perf tools: Add struct perf_hpp_list argument to helper functions

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 23/26] perf tools: Add struct perf_hpp_list argument to helper functions
Message-ID<qSein-73y-41@gated-at.bofh.it>
In reply to#1311398
Adding struct perf_hpp_list argument to following helper functions:
  void perf_hpp__setup_output_field(struct perf_hpp_list *list);
  void perf_hpp__reset_output_field(struct perf_hpp_list *list);
  void perf_hpp__append_sort_keys(struct perf_hpp_list *list);

so they could be used on hists's hpp_list.

Link: http://lkml.kernel.org/n/tip-t5g9q42thptl6qaorydp2v16@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c   | 19 ++++++++++---------
 tools/perf/util/hist.h |  7 ++++---
 tools/perf/util/sort.c |  6 +++---
 3 files changed, 17 insertions(+), 15 deletions(-)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index 35b28caf4a76..e904ed7b4e8a 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -548,15 +548,15 @@ static bool fmt_equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b)
 	return a->equal && a->equal(a, b);
 }
 
-void perf_hpp__setup_output_field(void)
+void perf_hpp__setup_output_field(struct perf_hpp_list *list)
 {
 	struct perf_hpp_fmt *fmt;
 
 	/* append sort keys to output field */
-	perf_hpp_list__for_each_sort_list(&perf_hpp_list, fmt) {
+	perf_hpp_list__for_each_sort_list(list, fmt) {
 		struct perf_hpp_fmt *pos;
 
-		perf_hpp_list__for_each_format(&perf_hpp_list, pos) {
+		perf_hpp_list__for_each_format(list, pos) {
 			if (fmt_equal(fmt, pos))
 				goto next;
 		}
@@ -567,15 +567,15 @@ next:
 	}
 }
 
-void perf_hpp__append_sort_keys(void)
+void perf_hpp__append_sort_keys(struct perf_hpp_list *list)
 {
 	struct perf_hpp_fmt *fmt;
 
 	/* append output fields to sort keys */
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+	perf_hpp_list__for_each_format(list, fmt) {
 		struct perf_hpp_fmt *pos;
 
-		perf_hpp_list__for_each_sort_list(&perf_hpp_list, pos) {
+		perf_hpp_list__for_each_sort_list(list, pos) {
 			if (fmt_equal(fmt, pos))
 				goto next;
 		}
@@ -586,25 +586,26 @@ next:
 	}
 }
 
+
 static void fmt_free(struct perf_hpp_fmt *fmt)
 {
 	if (fmt->free)
 		fmt->free(fmt);
 }
 
-void perf_hpp__reset_output_field(void)
+void perf_hpp__reset_output_field(struct perf_hpp_list *list)
 {
 	struct perf_hpp_fmt *fmt, *tmp;
 
 	/* reset output fields */
-	perf_hpp_list__for_each_format_safe(&perf_hpp_list, fmt, tmp) {
+	perf_hpp_list__for_each_format_safe(list, fmt, tmp) {
 		list_del_init(&fmt->list);
 		list_del_init(&fmt->sort_list);
 		fmt_free(fmt);
 	}
 
 	/* reset sort keys */
-	perf_hpp_list__for_each_sort_list_safe(&perf_hpp_list, fmt, tmp) {
+	perf_hpp_list__for_each_sort_list_safe(list, fmt, tmp) {
 		list_del_init(&fmt->list);
 		list_del_init(&fmt->sort_list);
 		fmt_free(fmt);
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index c9bd23537c1d..01c321e07cb3 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -279,9 +279,10 @@ enum {
 void perf_hpp__init(void);
 void perf_hpp__column_unregister(struct perf_hpp_fmt *format);
 void perf_hpp__cancel_cumulate(void);
-void perf_hpp__setup_output_field(void);
-void perf_hpp__reset_output_field(void);
-void perf_hpp__append_sort_keys(void);
+void perf_hpp__setup_output_field(struct perf_hpp_list *list);
+void perf_hpp__reset_output_field(struct perf_hpp_list *list);
+void perf_hpp__append_sort_keys(struct perf_hpp_list *list);
+
 
 bool perf_hpp__is_sort_entry(struct perf_hpp_fmt *format);
 bool perf_hpp__is_dynamic_entry(struct perf_hpp_fmt *format);
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 0194dd145401..b4f9841392fa 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -2637,9 +2637,9 @@ int setup_sorting(struct perf_evlist *evlist)
 		return err;
 
 	/* copy sort keys to output fields */
-	perf_hpp__setup_output_field();
+	perf_hpp__setup_output_field(&perf_hpp_list);
 	/* and then copy output fields to sort keys */
-	perf_hpp__append_sort_keys();
+	perf_hpp__append_sort_keys(&perf_hpp_list);
 
 	return 0;
 }
@@ -2655,5 +2655,5 @@ void reset_output_field(void)
 	sort_order = NULL;
 
 	reset_dimensions();
-	perf_hpp__reset_output_field();
+	perf_hpp__reset_output_field(&perf_hpp_list);
 }
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311413 — [PATCH 26/26] perf tools: Introduce hists__for_each_sort_list macro

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 26/26] perf tools: Introduce hists__for_each_sort_list macro
Message-ID<qSein-73y-49@gated-at.bofh.it>
In reply to#1311398
With the hist object having the perf_hpp_list we can
now iterate sort format entries based in the hists
object. Adding hists__for_each_sort_list macro to do
that.

Link: http://lkml.kernel.org/n/tip-t5g9q42thptl6qaorydp2v16@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/util/hist.c | 9 ++++++---
 tools/perf/util/hist.h | 3 +++
 2 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index 7ac32bdf53ee..6c058d7739cc 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -949,10 +949,11 @@ out:
 int64_t
 hist_entry__cmp(struct hist_entry *left, struct hist_entry *right)
 {
+	struct hists *hists = left->hists;
 	struct perf_hpp_fmt *fmt;
 	int64_t cmp = 0;
 
-	perf_hpp_list__for_each_sort_list(&perf_hpp_list, fmt) {
+	hists__for_each_sort_list(hists, fmt) {
 		cmp = fmt->cmp(fmt, left, right);
 		if (cmp)
 			break;
@@ -964,10 +965,11 @@ hist_entry__cmp(struct hist_entry *left, struct hist_entry *right)
 int64_t
 hist_entry__collapse(struct hist_entry *left, struct hist_entry *right)
 {
+	struct hists *hists = left->hists;
 	struct perf_hpp_fmt *fmt;
 	int64_t cmp = 0;
 
-	perf_hpp_list__for_each_sort_list(&perf_hpp_list, fmt) {
+	hists__for_each_sort_list(hists, fmt) {
 		cmp = fmt->collapse(fmt, left, right);
 		if (cmp)
 			break;
@@ -1108,10 +1110,11 @@ void hists__collapse_resort(struct hists *hists, struct ui_progress *prog)
 
 static int hist_entry__sort(struct hist_entry *a, struct hist_entry *b)
 {
+	struct hists *hists = a->hists;
 	struct perf_hpp_fmt *fmt;
 	int64_t cmp = 0;
 
-	perf_hpp_list__for_each_sort_list(&perf_hpp_list, fmt) {
+	hists__for_each_sort_list(hists, fmt) {
 		if (perf_hpp__should_skip(fmt, a->hists))
 			continue;
 
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index e67542b8c126..3fa24b55ebf3 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -264,6 +264,9 @@ static inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
 #define hists__for_each_format(hists, format) \
 	perf_hpp_list__for_each_format((hists)->hpp_list, fmt)
 
+#define hists__for_each_sort_list(hists, format) \
+	perf_hpp_list__for_each_sort_list((hists)->hpp_list, fmt)
+
 extern struct perf_hpp_fmt perf_hpp__format[];
 
 enum {
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311414 — [PATCH 06/26] perf tools: Add hpp__equal callback function

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 06/26] perf tools: Add hpp__equal callback function
Message-ID<qSein-73y-47@gated-at.bofh.it>
In reply to#1311398
Adding hpp__equal callback function to compare
hpp output format entries.

Link: http://lkml.kernel.org/n/tip-3amekjgmmufx5lz7slhpmqx3@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c | 16 ++++++++++++++++
 1 file changed, 16 insertions(+)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index 71c8bb71a350..b543f4b7d7d3 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -371,6 +371,19 @@ static int64_t hpp__nop_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
 	return 0;
 }
 
+static bool perf_hpp__is_hpp_entry(struct perf_hpp_fmt *a)
+{
+	return a->header == hpp__header_fn;
+}
+
+static bool hpp__equal(struct perf_hpp_fmt *a, struct perf_hpp_fmt *b)
+{
+	if (!perf_hpp__is_hpp_entry(a) || !perf_hpp__is_hpp_entry(b))
+		return false;
+
+	return a->idx == b->idx;
+}
+
 #define HPP__COLOR_PRINT_FNS(_name, _fn, _idx)		\
 	{						\
 		.name   = _name,			\
@@ -382,6 +395,7 @@ static int64_t hpp__nop_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
 		.collapse = hpp__nop_cmp,		\
 		.sort	= hpp__sort_ ## _fn,		\
 		.idx	= PERF_HPP__ ## _idx,		\
+		.equal	= hpp__equal,			\
 	}
 
 #define HPP__COLOR_ACC_PRINT_FNS(_name, _fn, _idx)	\
@@ -395,6 +409,7 @@ static int64_t hpp__nop_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
 		.collapse = hpp__nop_cmp,		\
 		.sort	= hpp__sort_ ## _fn,		\
 		.idx	= PERF_HPP__ ## _idx,		\
+		.equal	= hpp__equal,			\
 	}
 
 #define HPP__PRINT_FNS(_name, _fn, _idx)		\
@@ -407,6 +422,7 @@ static int64_t hpp__nop_cmp(struct perf_hpp_fmt *fmt __maybe_unused,
 		.collapse = hpp__nop_cmp,		\
 		.sort	= hpp__sort_ ## _fn,		\
 		.idx	= PERF_HPP__ ## _idx,		\
+		.equal	= hpp__equal,			\
 	}
 
 struct perf_hpp_fmt perf_hpp__format[] = {
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311415 — [PATCH 22/26] perf tools: Introduce perf_hpp_list__for_each_sort_list_safe macro

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 22/26] perf tools: Introduce perf_hpp_list__for_each_sort_list_safe macro
Message-ID<qSein-73y-53@gated-at.bofh.it>
In reply to#1311398
Introducing perf_hpp_list__for_each_sort_list_safe macro
to iterate perf_hpp_list object's sort entries safely.

Link: http://lkml.kernel.org/n/tip-wvj348z8j4s9o79810vommpr@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/hist.c   | 2 +-
 tools/perf/util/hist.h | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index c8d74b357d5e..35b28caf4a76 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -604,7 +604,7 @@ void perf_hpp__reset_output_field(void)
 	}
 
 	/* reset sort keys */
-	perf_hpp__for_each_sort_list_safe(fmt, tmp) {
+	perf_hpp_list__for_each_sort_list_safe(&perf_hpp_list, fmt, tmp) {
 		list_del_init(&fmt->list);
 		list_del_init(&fmt->sort_list);
 		fmt_free(fmt);
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 130f825235a3..c9bd23537c1d 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -257,8 +257,8 @@ static inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
 #define perf_hpp_list__for_each_sort_list(_list, format) \
 	list_for_each_entry(format, &(_list)->sort_list, sort_list)
 
-#define perf_hpp__for_each_sort_list_safe(format, tmp)	\
-	list_for_each_entry_safe(format, tmp, &perf_hpp_list.sort_list, sort_list)
+#define perf_hpp_list__for_each_sort_list_safe(_list, format, tmp)	\
+	list_for_each_entry_safe(format, tmp, &(_list)->sort_list, sort_list)
 
 extern struct perf_hpp_fmt perf_hpp__format[];
 
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311416 — [PATCH 19/26] perf tools: Introduce perf_hpp_list__for_each_format macro

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 19/26] perf tools: Introduce perf_hpp_list__for_each_format macro
Message-ID<qSein-73y-55@gated-at.bofh.it>
In reply to#1311398
Introducing perf_hpp_list__for_each_format macro
to iterate perf_hpp_list object's output entries.

Link: http://lkml.kernel.org/n/tip-5iwpt2svvvvuthdjjlw6uaqm@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/browsers/hists.c |  8 ++++----
 tools/perf/ui/gtk/hists.c      |  6 +++---
 tools/perf/ui/hist.c           |  8 ++++----
 tools/perf/ui/stdio/hist.c     | 10 +++++-----
 tools/perf/util/hist.h         |  4 ++--
 tools/perf/util/sort.c         |  8 ++++----
 6 files changed, 22 insertions(+), 22 deletions(-)

diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 08c09ad755d2..4416540f2bba 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -1040,7 +1040,7 @@ static int hist_browser__show_entry(struct hist_browser *browser,
 
 		hist_browser__gotorc(browser, row, 0);
 
-		perf_hpp__for_each_format(fmt) {
+		perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 			if (perf_hpp__should_skip(fmt, entry->hists) ||
 			    column++ < browser->b.horiz_scroll)
 				continue;
@@ -1144,7 +1144,7 @@ static int hists_browser__scnprintf_headers(struct hist_browser *browser, char *
 			return ret;
 	}
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (perf_hpp__should_skip(fmt, hists)  || column++ < browser->b.horiz_scroll)
 			continue;
 
@@ -1414,7 +1414,7 @@ static int hist_browser__fprintf_entry(struct hist_browser *browser,
 	if (symbol_conf.use_callchain)
 		printed += fprintf(fp, "%c ", folded_sign);
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (perf_hpp__should_skip(fmt, he->hists))
 			continue;
 
@@ -2077,7 +2077,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
 	memset(options, 0, sizeof(options));
 	memset(actions, 0, sizeof(actions));
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		perf_hpp__reset_width(fmt, hists);
 		/*
 		 * This is done just once, and activates the horizontal scrolling
diff --git a/tools/perf/ui/gtk/hists.c b/tools/perf/ui/gtk/hists.c
index 0f8dcfdfb10f..eca5151f91d7 100644
--- a/tools/perf/ui/gtk/hists.c
+++ b/tools/perf/ui/gtk/hists.c
@@ -306,7 +306,7 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,
 
 	nr_cols = 0;
 
-	perf_hpp__for_each_format(fmt)
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt)
 		col_types[nr_cols++] = G_TYPE_STRING;
 
 	store = gtk_tree_store_newv(nr_cols, col_types);
@@ -317,7 +317,7 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,
 
 	col_idx = 0;
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (perf_hpp__should_skip(fmt, hists))
 			continue;
 
@@ -367,7 +367,7 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,
 
 		col_idx = 0;
 
-		perf_hpp__for_each_format(fmt) {
+		perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 			if (perf_hpp__should_skip(fmt, h->hists))
 				continue;
 
diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index 7200349b44b9..dd0bb4a00d00 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -556,7 +556,7 @@ void perf_hpp__setup_output_field(void)
 	perf_hpp__for_each_sort_list(fmt) {
 		struct perf_hpp_fmt *pos;
 
-		perf_hpp__for_each_format(pos) {
+		perf_hpp_list__for_each_format(&perf_hpp_list, pos) {
 			if (fmt_equal(fmt, pos))
 				goto next;
 		}
@@ -572,7 +572,7 @@ void perf_hpp__append_sort_keys(void)
 	struct perf_hpp_fmt *fmt;
 
 	/* append output fields to sort keys */
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		struct perf_hpp_fmt *pos;
 
 		perf_hpp__for_each_sort_list(pos) {
@@ -621,7 +621,7 @@ unsigned int hists__sort_list_width(struct hists *hists)
 	bool first = true;
 	struct perf_hpp dummy_hpp;
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (perf_hpp__should_skip(fmt, hists))
 			continue;
 
@@ -674,7 +674,7 @@ void perf_hpp__set_user_width(const char *width_list_str)
 	struct perf_hpp_fmt *fmt;
 	const char *ptr = width_list_str;
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		char *p;
 
 		int len = strtol(ptr, &p, 10);
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
index 387110d50b00..f40b05e109cd 100644
--- a/tools/perf/ui/stdio/hist.c
+++ b/tools/perf/ui/stdio/hist.c
@@ -360,7 +360,7 @@ static size_t hist_entry__callchain_fprintf(struct hist_entry *he,
 				    !prefixcmp(sort_order, "comm"))) {
 		struct perf_hpp_fmt *fmt;
 
-		perf_hpp__for_each_format(fmt) {
+		perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 			if (!perf_hpp__is_sort_entry(fmt))
 				continue;
 
@@ -384,7 +384,7 @@ static int hist_entry__snprintf(struct hist_entry *he, struct perf_hpp *hpp)
 	if (symbol_conf.exclude_other && !he->parent)
 		return 0;
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (perf_hpp__should_skip(fmt, he->hists))
 			continue;
 
@@ -452,7 +452,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
 
 	init_rem_hits();
 
-	perf_hpp__for_each_format(fmt)
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt)
 		perf_hpp__reset_width(fmt, hists);
 
 	if (symbol_conf.col_width_list_str)
@@ -463,7 +463,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
 
 	fprintf(fp, "# ");
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (perf_hpp__should_skip(fmt, hists))
 			continue;
 
@@ -487,7 +487,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
 
 	fprintf(fp, "# ");
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		unsigned int i;
 
 		if (perf_hpp__should_skip(fmt, hists))
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index dfa11777efbe..31add4d1d860 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -248,8 +248,8 @@ static inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
 	perf_hpp_list__register_sort_field(&perf_hpp_list, format);
 }
 
-#define perf_hpp__for_each_format(format) \
-	list_for_each_entry(format, &perf_hpp_list.list, list)
+#define perf_hpp_list__for_each_format(_list, format) \
+	list_for_each_entry(format, &(_list)->list, list)
 
 #define perf_hpp__for_each_format_safe(format, tmp)	\
 	list_for_each_entry_safe(format, tmp, &perf_hpp_list.list, list)
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 3daa7e6ced23..0194dd145401 100644
--- a/tools/perf/util/sort.c
+++ b/tools/perf/util/sort.c
@@ -2408,7 +2408,7 @@ void perf_hpp__set_elide(int idx, bool elide)
 	struct perf_hpp_fmt *fmt;
 	struct hpp_sort_entry *hse;
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (!perf_hpp__is_sort_entry(fmt))
 			continue;
 
@@ -2468,7 +2468,7 @@ void sort__setup_elide(FILE *output)
 	struct perf_hpp_fmt *fmt;
 	struct hpp_sort_entry *hse;
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (!perf_hpp__is_sort_entry(fmt))
 			continue;
 
@@ -2480,7 +2480,7 @@ void sort__setup_elide(FILE *output)
 	 * It makes no sense to elide all of sort entries.
 	 * Just revert them to show up again.
 	 */
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (!perf_hpp__is_sort_entry(fmt))
 			continue;
 
@@ -2488,7 +2488,7 @@ void sort__setup_elide(FILE *output)
 			return;
 	}
 
-	perf_hpp__for_each_format(fmt) {
+	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
 		if (!perf_hpp__is_sort_entry(fmt))
 			continue;
 
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


#1311417 — [PATCH 25/26] perf tools: Introduce hists__for_each_format macro

FromJiri Olsa <jolsa@kernel.org>
Date2016-01-18 10:30 +0100
Subject[PATCH 25/26] perf tools: Introduce hists__for_each_format macro
Message-ID<qSein-73y-51@gated-at.bofh.it>
In reply to#1311398
With the hist object having the perf_hpp_list we can
now iterate output format entries based in the hists
object. Adding hists__for_each_format macro to do that.

Link: http://lkml.kernel.org/n/tip-z96h1i1fdz4obdgouz8ryhy4@git.kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
---
 tools/perf/ui/browsers/hists.c |  8 ++++----
 tools/perf/ui/gtk/hists.c      |  6 +++---
 tools/perf/ui/hist.c           |  2 +-
 tools/perf/ui/stdio/hist.c     | 10 +++++-----
 tools/perf/util/hist.h         |  3 +++
 5 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c
index 4416540f2bba..d96afb006206 100644
--- a/tools/perf/ui/browsers/hists.c
+++ b/tools/perf/ui/browsers/hists.c
@@ -1040,7 +1040,7 @@ static int hist_browser__show_entry(struct hist_browser *browser,
 
 		hist_browser__gotorc(browser, row, 0);
 
-		perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+		hists__for_each_format(browser->hists, fmt) {
 			if (perf_hpp__should_skip(fmt, entry->hists) ||
 			    column++ < browser->b.horiz_scroll)
 				continue;
@@ -1144,7 +1144,7 @@ static int hists_browser__scnprintf_headers(struct hist_browser *browser, char *
 			return ret;
 	}
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+	hists__for_each_format(browser->hists, fmt) {
 		if (perf_hpp__should_skip(fmt, hists)  || column++ < browser->b.horiz_scroll)
 			continue;
 
@@ -1414,7 +1414,7 @@ static int hist_browser__fprintf_entry(struct hist_browser *browser,
 	if (symbol_conf.use_callchain)
 		printed += fprintf(fp, "%c ", folded_sign);
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+	hists__for_each_format(browser->hists, fmt) {
 		if (perf_hpp__should_skip(fmt, he->hists))
 			continue;
 
@@ -2077,7 +2077,7 @@ static int perf_evsel__hists_browse(struct perf_evsel *evsel, int nr_events,
 	memset(options, 0, sizeof(options));
 	memset(actions, 0, sizeof(actions));
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+	hists__for_each_format(browser->hists, fmt) {
 		perf_hpp__reset_width(fmt, hists);
 		/*
 		 * This is done just once, and activates the horizontal scrolling
diff --git a/tools/perf/ui/gtk/hists.c b/tools/perf/ui/gtk/hists.c
index eca5151f91d7..32cc38a5b57f 100644
--- a/tools/perf/ui/gtk/hists.c
+++ b/tools/perf/ui/gtk/hists.c
@@ -306,7 +306,7 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,
 
 	nr_cols = 0;
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt)
+	hists__for_each_format(hists, fmt)
 		col_types[nr_cols++] = G_TYPE_STRING;
 
 	store = gtk_tree_store_newv(nr_cols, col_types);
@@ -317,7 +317,7 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,
 
 	col_idx = 0;
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+	hists__for_each_format(hists, fmt) {
 		if (perf_hpp__should_skip(fmt, hists))
 			continue;
 
@@ -367,7 +367,7 @@ static void perf_gtk__show_hists(GtkWidget *window, struct hists *hists,
 
 		col_idx = 0;
 
-		perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+		hists__for_each_format(hists, fmt) {
 			if (perf_hpp__should_skip(fmt, h->hists))
 				continue;
 
diff --git a/tools/perf/ui/hist.c b/tools/perf/ui/hist.c
index e904ed7b4e8a..b92e567372dd 100644
--- a/tools/perf/ui/hist.c
+++ b/tools/perf/ui/hist.c
@@ -622,7 +622,7 @@ unsigned int hists__sort_list_width(struct hists *hists)
 	bool first = true;
 	struct perf_hpp dummy_hpp;
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+	hists__for_each_format(hists, fmt) {
 		if (perf_hpp__should_skip(fmt, hists))
 			continue;
 
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c
index f40b05e109cd..89778a9d7ae6 100644
--- a/tools/perf/ui/stdio/hist.c
+++ b/tools/perf/ui/stdio/hist.c
@@ -360,7 +360,7 @@ static size_t hist_entry__callchain_fprintf(struct hist_entry *he,
 				    !prefixcmp(sort_order, "comm"))) {
 		struct perf_hpp_fmt *fmt;
 
-		perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+		hists__for_each_format(hists, fmt) {
 			if (!perf_hpp__is_sort_entry(fmt))
 				continue;
 
@@ -384,7 +384,7 @@ static int hist_entry__snprintf(struct hist_entry *he, struct perf_hpp *hpp)
 	if (symbol_conf.exclude_other && !he->parent)
 		return 0;
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+	hists__for_each_format(he->hists, fmt) {
 		if (perf_hpp__should_skip(fmt, he->hists))
 			continue;
 
@@ -452,7 +452,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
 
 	init_rem_hits();
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt)
+	hists__for_each_format(hists, fmt)
 		perf_hpp__reset_width(fmt, hists);
 
 	if (symbol_conf.col_width_list_str)
@@ -463,7 +463,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
 
 	fprintf(fp, "# ");
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+	hists__for_each_format(hists, fmt) {
 		if (perf_hpp__should_skip(fmt, hists))
 			continue;
 
@@ -487,7 +487,7 @@ size_t hists__fprintf(struct hists *hists, bool show_header, int max_rows,
 
 	fprintf(fp, "# ");
 
-	perf_hpp_list__for_each_format(&perf_hpp_list, fmt) {
+	hists__for_each_format(hists, fmt) {
 		unsigned int i;
 
 		if (perf_hpp__should_skip(fmt, hists))
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 32599fc7b39f..e67542b8c126 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -261,6 +261,9 @@ static inline void perf_hpp__register_sort_field(struct perf_hpp_fmt *format)
 #define perf_hpp_list__for_each_sort_list_safe(_list, format, tmp)	\
 	list_for_each_entry_safe(format, tmp, &(_list)->sort_list, sort_list)
 
+#define hists__for_each_format(hists, format) \
+	perf_hpp_list__for_each_format((hists)->hpp_list, fmt)
+
 extern struct perf_hpp_fmt perf_hpp__format[];
 
 enum {
-- 
2.4.3

[toc] | [prev] | [next] | [standalone]


Page 1 of 2  [1] 2  Next page →

Back to top | Article view | linux.kernel


csiph-web