aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung@kernel.org>2016-01-05 05:58:35 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2016-01-06 18:11:14 -0500
commit9735be24ec086fbccee321471cc21dedefa956a6 (patch)
treebe09f153752a94c0e888e8d618c3587405a51b1d
parent58683600dfe377c883eb8217b5a9bfcfe231b3ff (diff)
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 <namhyung@kernel.org> Acked-by: Jiri Olsa <jolsa@kernel.org> Cc: Andi Kleen <andi@firstfloor.org> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://lkml.kernel.org/r/1451991518-25673-2-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-rw-r--r--tools/perf/util/sort.c48
1 files changed, 32 insertions, 16 deletions
diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
index 4b4b1c5cccef..04e2a5cb19e3 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)
1863} 1863}
1864 1864
1865/* find match evsel using a given event name. The event name can be: 1865/* find match evsel using a given event name. The event name can be:
1866 * 1. NULL - only valid for single event session 1866 * 1. '%' + event index (e.g. '%1' for first event)
1867 * 2. '%' + event index (e.g. '%1' for first event) 1867 * 2. full event name (e.g. sched:sched_switch)
1868 * 3. full event name (e.g. sched:sched_switch) 1868 * 3. partial event name (should not contain ':')
1869 * 4. partial event name (should not contain ':')
1870 */ 1869 */
1871static struct perf_evsel *find_evsel(struct perf_evlist *evlist, char *event_name) 1870static struct perf_evsel *find_evsel(struct perf_evlist *evlist, char *event_name)
1872{ 1871{
@@ -1875,16 +1874,6 @@ static struct perf_evsel *find_evsel(struct perf_evlist *evlist, char *event_nam
1875 bool full_name; 1874 bool full_name;
1876 1875
1877 /* case 1 */ 1876 /* case 1 */
1878 if (event_name == NULL) {
1879 if (evlist->nr_entries != 1) {
1880 pr_debug("event name should be given\n");
1881 return NULL;
1882 }
1883
1884 return perf_evlist__first(evlist);
1885 }
1886
1887 /* case 2 */
1888 if (event_name[0] == '%') { 1877 if (event_name[0] == '%') {
1889 int nr = strtol(event_name+1, NULL, 0); 1878 int nr = strtol(event_name+1, NULL, 0);
1890 1879
@@ -1900,10 +1889,10 @@ static struct perf_evsel *find_evsel(struct perf_evlist *evlist, char *event_nam
1900 1889
1901 full_name = !!strchr(event_name, ':'); 1890 full_name = !!strchr(event_name, ':');
1902 evlist__for_each(evlist, pos) { 1891 evlist__for_each(evlist, pos) {
1903 /* case 3 */ 1892 /* case 2 */
1904 if (full_name && !strcmp(pos->name, event_name)) 1893 if (full_name && !strcmp(pos->name, event_name))
1905 return pos; 1894 return pos;
1906 /* case 4 */ 1895 /* case 3 */
1907 if (!full_name && strstr(pos->name, event_name)) { 1896 if (!full_name && strstr(pos->name, event_name)) {
1908 if (evsel) { 1897 if (evsel) {
1909 pr_debug("'%s' event is ambiguous: it can be %s or %s\n", 1898 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)
1965 return 0; 1954 return 0;
1966} 1955}
1967 1956
1957static int add_all_matching_fields(struct perf_evlist *evlist,
1958 char *field_name, bool raw_trace)
1959{
1960 int ret = -ESRCH;
1961 struct perf_evsel *evsel;
1962 struct format_field *field;
1963
1964 evlist__for_each(evlist, evsel) {
1965 if (evsel->attr.type != PERF_TYPE_TRACEPOINT)
1966 continue;
1967
1968 field = pevent_find_any_field(evsel->tp_format, field_name);
1969 if (field == NULL)
1970 continue;
1971
1972 ret = __dynamic_dimension__add(evsel, field, raw_trace);
1973 if (ret < 0)
1974 break;
1975 }
1976 return ret;
1977}
1978
1968static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok) 1979static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok)
1969{ 1980{
1970 char *str, *event_name, *field_name, *opt_name; 1981 char *str, *event_name, *field_name, *opt_name;
@@ -1999,6 +2010,11 @@ static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok)
1999 goto out; 2010 goto out;
2000 } 2011 }
2001 2012
2013 if (event_name == NULL) {
2014 ret = add_all_matching_fields(evlist, field_name, raw_trace);
2015 goto out;
2016 }
2017
2002 evsel = find_evsel(evlist, event_name); 2018 evsel = find_evsel(evlist, event_name);
2003 if (evsel == NULL) { 2019 if (evsel == NULL) {
2004 pr_debug("Cannot find event: %s\n", event_name); 2020 pr_debug("Cannot find event: %s\n", event_name);