From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756159AbcJVIed (ORCPT ); Sat, 22 Oct 2016 04:34:33 -0400 Received: from terminus.zytor.com ([198.137.202.10]:56730 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753568AbcJVIea (ORCPT ); Sat, 22 Oct 2016 04:34:30 -0400 Date: Sat, 22 Oct 2016 01:34:16 -0700 From: tip-bot for Jiri Olsa Message-ID: Cc: a.p.zijlstra@chello.nl, namhyung@kernel.org, linux-kernel@vger.kernel.org, jmario@redhat.com, tglx@linutronix.de, dzickus@redhat.com, andi@firstfloor.org, dsahern@gmail.com, hpa@zytor.com, jolsa@kernel.org, acme@redhat.com, mingo@kernel.org Reply-To: hpa@zytor.com, jolsa@kernel.org, mingo@kernel.org, acme@redhat.com, linux-kernel@vger.kernel.org, tglx@linutronix.de, jmario@redhat.com, a.p.zijlstra@chello.nl, namhyung@kernel.org, andi@firstfloor.org, dsahern@gmail.com, dzickus@redhat.com In-Reply-To: <1474558645-19956-15-git-send-email-jolsa@kernel.org> References: <1474558645-19956-15-git-send-email-jolsa@kernel.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf c2c report: Add sort_entry dimension support Git-Commit-ID: 8d3f938dc757549dd75d1b4df4f7faf92dc5dfc3 X-Mailer: tip-git-log-daemon Robot-ID: Robot-Unsubscribe: Contact to get blacklisted from these emails MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain; charset=UTF-8 Content-Disposition: inline Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Commit-ID: 8d3f938dc757549dd75d1b4df4f7faf92dc5dfc3 Gitweb: http://git.kernel.org/tip/8d3f938dc757549dd75d1b4df4f7faf92dc5dfc3 Author: Jiri Olsa AuthorDate: Thu, 22 Sep 2016 17:36:42 +0200 Committer: Arnaldo Carvalho de Melo CommitDate: Wed, 19 Oct 2016 13:18:31 -0300 perf c2c report: Add sort_entry dimension support Allow to reuse 'struct sort_entry' objects within c2c dimension support. In case the 'struct sort_entry' object meets the need of c2c report we will use it directly in following patches. Signed-off-by: Jiri Olsa Cc: Andi Kleen Cc: David Ahern Cc: Don Zickus Cc: Joe Mario Cc: Namhyung Kim Cc: Peter Zijlstra Link: http://lkml.kernel.org/r/1474558645-19956-15-git-send-email-jolsa@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/builtin-c2c.c | 82 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 65 insertions(+), 17 deletions(-) diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c index 63c0e2d..6b58b53 100644 --- a/tools/perf/builtin-c2c.c +++ b/tools/perf/builtin-c2c.c @@ -9,6 +9,7 @@ #include "hist.h" #include "tool.h" #include "data.h" +#include "sort.h" struct c2c_hists { struct hists hists; @@ -47,6 +48,7 @@ struct c2c_dimension { struct c2c_header header; const char *name; int width; + struct sort_entry *se; int64_t (*cmp)(struct perf_hpp_fmt *fmt, struct hist_entry *, struct hist_entry *); @@ -66,34 +68,47 @@ static int c2c_width(struct perf_hpp_fmt *fmt, struct hists *hists __maybe_unused) { struct c2c_fmt *c2c_fmt; + struct c2c_dimension *dim; c2c_fmt = container_of(fmt, struct c2c_fmt, fmt); - return c2c_fmt->dim->width; + dim = c2c_fmt->dim; + + return dim->se ? hists__col_len(hists, dim->se->se_width_idx) : + c2c_fmt->dim->width; } static int c2c_header(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, - struct hists *hists __maybe_unused, int line, int *span) + struct hists *hists, int line, int *span) { + struct perf_hpp_list *hpp_list = hists->hpp_list; struct c2c_fmt *c2c_fmt; struct c2c_dimension *dim; - int len = c2c_width(fmt, hpp, hists); - const char *text; + const char *text = NULL; + int width = c2c_width(fmt, hpp, hists); c2c_fmt = container_of(fmt, struct c2c_fmt, fmt); dim = c2c_fmt->dim; - text = dim->header.line[line].text; - if (text == NULL) - text = ""; - - if (*span) { - (*span)--; - return 0; + if (dim->se) { + text = dim->header.line[line].text; + /* Use the last line from sort_entry if not defined. */ + if (!text && (line == hpp_list->nr_header_lines - 1)) + text = dim->se->se_header; } else { - *span = dim->header.line[line].span; + text = dim->header.line[line].text; + + if (*span) { + (*span)--; + return 0; + } else { + *span = dim->header.line[line].span; + } } - return scnprintf(hpp->buf, hpp->size, "%*s", len, text); + if (text == NULL) + text = ""; + + return scnprintf(hpp->buf, hpp->size, "%*s", width, text); } static struct c2c_dimension *dimensions[] = { @@ -130,6 +145,39 @@ static struct c2c_dimension *get_dimension(const char *name) return NULL; } +static int c2c_se_entry(struct perf_hpp_fmt *fmt, struct perf_hpp *hpp, + struct hist_entry *he) +{ + struct c2c_fmt *c2c_fmt = container_of(fmt, struct c2c_fmt, fmt); + struct c2c_dimension *dim = c2c_fmt->dim; + size_t len = fmt->user_len; + + if (!len) + len = hists__col_len(he->hists, dim->se->se_width_idx); + + return dim->se->se_snprintf(he, hpp->buf, hpp->size, len); +} + +static int64_t c2c_se_cmp(struct perf_hpp_fmt *fmt, + struct hist_entry *a, struct hist_entry *b) +{ + struct c2c_fmt *c2c_fmt = container_of(fmt, struct c2c_fmt, fmt); + struct c2c_dimension *dim = c2c_fmt->dim; + + return dim->se->se_cmp(a, b); +} + +static int64_t c2c_se_collapse(struct perf_hpp_fmt *fmt, + struct hist_entry *a, struct hist_entry *b) +{ + struct c2c_fmt *c2c_fmt = container_of(fmt, struct c2c_fmt, fmt); + struct c2c_dimension *dim = c2c_fmt->dim; + int64_t (*collapse_fn)(struct hist_entry *, struct hist_entry *); + + collapse_fn = dim->se->se_collapse ?: dim->se->se_cmp; + return collapse_fn(a, b); +} + static struct c2c_fmt *get_format(const char *name) { struct c2c_dimension *dim = get_dimension(name); @@ -149,12 +197,12 @@ static struct c2c_fmt *get_format(const char *name) INIT_LIST_HEAD(&fmt->list); INIT_LIST_HEAD(&fmt->sort_list); - fmt->cmp = dim->cmp; - fmt->sort = dim->cmp; - fmt->entry = dim->entry; + fmt->cmp = dim->se ? c2c_se_cmp : dim->cmp; + fmt->sort = dim->se ? c2c_se_cmp : dim->cmp; + fmt->entry = dim->se ? c2c_se_entry : dim->entry; fmt->header = c2c_header; fmt->width = c2c_width; - fmt->collapse = dim->cmp; + fmt->collapse = dim->se ? c2c_se_collapse : dim->cmp; fmt->equal = fmt_equal; fmt->free = fmt_free;