From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756105AbcAIQ3Y (ORCPT ); Sat, 9 Jan 2016 11:29:24 -0500 Received: from terminus.zytor.com ([198.137.202.10]:41877 "EHLO terminus.zytor.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754652AbcAIQ3W (ORCPT ); Sat, 9 Jan 2016 11:29:22 -0500 Date: Sat, 9 Jan 2016 08:28:30 -0800 From: tip-bot for Namhyung Kim Message-ID: Cc: peterz@infradead.org, jolsa@kernel.org, hpa@zytor.com, tglx@linutronix.de, linux-kernel@vger.kernel.org, namhyung@kernel.org, andi@firstfloor.org, wangnan0@huawei.com, mingo@kernel.org, dsahern@gmail.com, rostedt@goodmis.org, fweisbec@gmail.com, acme@redhat.com Reply-To: mingo@kernel.org, acme@redhat.com, dsahern@gmail.com, fweisbec@gmail.com, rostedt@goodmis.org, namhyung@kernel.org, linux-kernel@vger.kernel.org, tglx@linutronix.de, peterz@infradead.org, jolsa@kernel.org, hpa@zytor.com, andi@firstfloor.org, wangnan0@huawei.com In-Reply-To: <1451991518-25673-2-git-send-email-namhyung@kernel.org> References: <1451991518-25673-2-git-send-email-namhyung@kernel.org> To: linux-tip-commits@vger.kernel.org Subject: [tip:perf/core] perf tools: Add all matching dynamic sort keys for field name Git-Commit-ID: 9735be24ec086fbccee321471cc21dedefa956a6 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: 9735be24ec086fbccee321471cc21dedefa956a6 Gitweb: http://git.kernel.org/tip/9735be24ec086fbccee321471cc21dedefa956a6 Author: Namhyung Kim AuthorDate: Tue, 5 Jan 2016 19:58:35 +0900 Committer: Arnaldo Carvalho de Melo CommitDate: Wed, 6 Jan 2016 20:11:14 -0300 perf tools: Add all matching dynamic sort keys for field name When a perf.data file has multiple events, it's likely to be similar (tracepoint) events. In that case, they might have same field name so add all of them to sort keys instead of bailing out. Signed-off-by: Namhyung Kim Acked-by: Jiri Olsa Cc: Andi Kleen Cc: David Ahern Cc: Frederic Weisbecker Cc: Peter Zijlstra Cc: Steven Rostedt Cc: Wang Nan Link: http://lkml.kernel.org/r/1451991518-25673-2-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- tools/perf/util/sort.c | 48 ++++++++++++++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 16 deletions(-) diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c index 4b4b1c5..04e2a5c 100644 --- a/tools/perf/util/sort.c +++ b/tools/perf/util/sort.c @@ -1863,10 +1863,9 @@ static int parse_field_name(char *str, char **event, char **field, char **opt) } /* find match evsel using a given event name. The event name can be: - * 1. NULL - only valid for single event session - * 2. '%' + event index (e.g. '%1' for first event) - * 3. full event name (e.g. sched:sched_switch) - * 4. partial event name (should not contain ':') + * 1. '%' + event index (e.g. '%1' for first event) + * 2. full event name (e.g. sched:sched_switch) + * 3. partial event name (should not contain ':') */ static struct perf_evsel *find_evsel(struct perf_evlist *evlist, char *event_name) { @@ -1875,16 +1874,6 @@ static struct perf_evsel *find_evsel(struct perf_evlist *evlist, char *event_nam bool full_name; /* case 1 */ - if (event_name == NULL) { - if (evlist->nr_entries != 1) { - pr_debug("event name should be given\n"); - return NULL; - } - - return perf_evlist__first(evlist); - } - - /* case 2 */ if (event_name[0] == '%') { int nr = strtol(event_name+1, NULL, 0); @@ -1900,10 +1889,10 @@ static struct perf_evsel *find_evsel(struct perf_evlist *evlist, char *event_nam full_name = !!strchr(event_name, ':'); evlist__for_each(evlist, pos) { - /* case 3 */ + /* case 2 */ if (full_name && !strcmp(pos->name, event_name)) return pos; - /* case 4 */ + /* case 3 */ if (!full_name && strstr(pos->name, event_name)) { if (evsel) { pr_debug("'%s' event is ambiguous: it can be %s or %s\n", @@ -1965,6 +1954,28 @@ static int add_all_dynamic_fields(struct perf_evlist *evlist, bool raw_trace) return 0; } +static int add_all_matching_fields(struct perf_evlist *evlist, + char *field_name, bool raw_trace) +{ + int ret = -ESRCH; + struct perf_evsel *evsel; + struct format_field *field; + + evlist__for_each(evlist, evsel) { + if (evsel->attr.type != PERF_TYPE_TRACEPOINT) + continue; + + field = pevent_find_any_field(evsel->tp_format, field_name); + if (field == NULL) + continue; + + ret = __dynamic_dimension__add(evsel, field, raw_trace); + if (ret < 0) + break; + } + return ret; +} + static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok) { char *str, *event_name, *field_name, *opt_name; @@ -1999,6 +2010,11 @@ static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok) goto out; } + if (event_name == NULL) { + ret = add_all_matching_fields(evlist, field_name, raw_trace); + goto out; + } + evsel = find_evsel(evlist, event_name); if (evsel == NULL) { pr_debug("Cannot find event: %s\n", event_name);