aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf')
-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);