perf list: Do event name substring search as last resort when no events found
authorArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 1 Oct 2015 15:12:22 +0000 (12:12 -0300)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Thu, 1 Oct 2015 15:12:22 +0000 (12:12 -0300)
Before:

  # perf list _alloc_ | head -10
  #

After:

  # perf list _alloc_ | head -10
    ext4:ext4_alloc_da_blocks                          [Tracepoint event]
    ext4:ext4_get_implied_cluster_alloc_exit           [Tracepoint event]
    kmem:kmem_cache_alloc_node                         [Tracepoint event]
    kmem:mm_page_alloc_extfrag                         [Tracepoint event]
    kmem:mm_page_alloc_zone_locked                     [Tracepoint event]
    xen:xen_mmu_alloc_ptpage                           [Tracepoint event]
  #

And it works for all types of events:

  # perf list br

  List of pre-defined events (to be used in -e):

    branch-instructions OR branches                    [Hardware event]
    branch-misses                                      [Hardware event]

    branch-load-misses                                 [Hardware cache event]
    branch-loads                                       [Hardware cache event]

    branch-instructions OR cpu/branch-instructions/    [Kernel PMU event]
    branch-misses OR cpu/branch-misses/                [Kernel PMU event]

    filelock:break_lease_block                         [Tracepoint event]
    filelock:break_lease_noblock                       [Tracepoint event]
    filelock:break_lease_unblock                       [Tracepoint event]
    syscalls:sys_enter_brk                             [Tracepoint event]
    syscalls:sys_exit_brk                              [Tracepoint event]

  #

Suggested-by: Ingo Molnar <mingo@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Borislav Petkov <bp@suse.de>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Wang Nan <wangnan0@huawei.com>
Link: http://lkml.kernel.org/n/tip-qieivl18jdemoaghgndj36e6@git.kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
tools/perf/Documentation/perf-list.txt
tools/perf/builtin-list.c

index bada8933fdd4798a2890a13b2fb64d5bf75d9743..ad60c6ea199730432d6bf2f790a3a292a5c1d3eb 100644 (file)
@@ -125,6 +125,8 @@ To limit the list use:
 . If none of the above is matched, it will apply the supplied glob to all
   events, printing the ones that match.
 
+. As a last resort, it will do a substring search in all event names.
+
 One or more types can be used at the same time, listing the events for the
 types specified.
 
index 6024140403446fe6cc7ab1db9b2a69af3785767c..bf679e2c978bdef9b7943271987e4b7e4e465981 100644 (file)
@@ -45,6 +45,8 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
        }
 
        for (i = 0; i < argc; ++i) {
+               char *sep, *s;
+
                if (strcmp(argv[i], "tracepoint") == 0)
                        print_tracepoint_events(NULL, NULL, raw_dump);
                else if (strcmp(argv[i], "hw") == 0 ||
@@ -60,8 +62,7 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
                        print_hwcache_events(NULL, raw_dump);
                else if (strcmp(argv[i], "pmu") == 0)
                        print_pmu_events(NULL, raw_dump);
-               else {
-                       char *sep = strchr(argv[i], ':'), *s;
+               else if ((sep = strchr(argv[i], ':')) != NULL) {
                        int sep_idx;
 
                        if (sep == NULL) {
@@ -76,6 +77,19 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused)
                        s[sep_idx] = '\0';
                        print_tracepoint_events(s, s + sep_idx + 1, raw_dump);
                        free(s);
+               } else {
+                       if (asprintf(&s, "*%s*", argv[i]) < 0) {
+                               printf("Critical: Not enough memory! Trying to continue...\n");
+                               continue;
+                       }
+                       print_symbol_events(s, PERF_TYPE_HARDWARE,
+                                           event_symbols_hw, PERF_COUNT_HW_MAX, raw_dump);
+                       print_symbol_events(s, PERF_TYPE_SOFTWARE,
+                                           event_symbols_sw, PERF_COUNT_SW_MAX, raw_dump);
+                       print_hwcache_events(s, raw_dump);
+                       print_pmu_events(s, raw_dump);
+                       print_tracepoint_events(NULL, s, raw_dump);
+                       free(s);
                }
        }
        return 0;