| From 8381cdd0e32dd748bd34ca3ace476949948bd793 Mon Sep 17 00:00:00 2001 |
| From: Namhyung Kim <namhyung@kernel.org> |
| Date: Wed, 18 Jan 2017 14:14:56 +0900 |
| Subject: perf diff: Fix segfault on 'perf diff -o N' option |
| |
| From: Namhyung Kim <namhyung@kernel.org> |
| |
| commit 8381cdd0e32dd748bd34ca3ace476949948bd793 upstream. |
| |
| The -o/--order option is to select column number to sort a diff result. |
| |
| It does the job by adding a hpp field at the beginning of the sort list. |
| But it should not be added to the output field list as it has no |
| callbacks required by a output field. |
| |
| During the setup_sorting(), the perf_hpp__setup_output_field() appends |
| the given sort keys to the output field if it's not there already. |
| |
| Originally it was checked by fmt->list being non-empty. But commit |
| 3f931f2c4274 ("perf hists: Make hpp setup function generic") changed it |
| to check the ->equal callback. |
| |
| Anyways, we don't need to add the pseudo hpp field to the output field |
| list since it won't be used for output. So just skip fields if they |
| have no ->color or ->entry callbacks. |
| |
| Signed-off-by: Namhyung Kim <namhyung@kernel.org> |
| Acked-by: Jiri Olsa <jolsa@kernel.org> |
| Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> |
| Fixes: 3f931f2c4274 ("perf hists: Make hpp setup function generic") |
| Link: http://lkml.kernel.org/r/20170118051457.30946-1-namhyung@kernel.org |
| Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| tools/perf/ui/hist.c | 4 ++++ |
| 1 file changed, 4 insertions(+) |
| |
| --- a/tools/perf/ui/hist.c |
| +++ b/tools/perf/ui/hist.c |
| @@ -566,6 +566,10 @@ void perf_hpp__setup_output_field(struct |
| perf_hpp_list__for_each_sort_list(list, fmt) { |
| struct perf_hpp_fmt *pos; |
| |
| + /* skip sort-only fields ("sort_compute" in perf diff) */ |
| + if (!fmt->entry && !fmt->color) |
| + continue; |
| + |
| perf_hpp_list__for_each_format(list, pos) { |
| if (fmt_equal(fmt, pos)) |
| goto next; |