diff options
Diffstat (limited to 'tools/perf')
-rw-r--r-- | tools/perf/util/sort.c | 48 |
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 | */ |
1871 | static struct perf_evsel *find_evsel(struct perf_evlist *evlist, char *event_name) | 1870 | static 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 | ||
1957 | static 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 | |||
1968 | static int add_dynamic_entry(struct perf_evlist *evlist, const char *tok) | 1979 | static 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); |