perf list: Fix the output to not include tracepoints without an id
authorPeter Zijlstra <peterz@infradead.org>
Thu, 6 Aug 2009 14:48:54 +0000 (16:48 +0200)
committerIngo Molnar <mingo@elte.hu>
Sun, 9 Aug 2009 10:54:38 +0000 (12:54 +0200)
Stop perf list from displaying tracepoints without an id file,
those are special tracepoints that are not interfaced to
perfcounters so listing them is erroneous and passing them as
events will produce no output.

Signed-off-by: Peter Zijlstra <a.p.zijlstra@chello.nl>
Acked-by: Jason Baron <jbaron@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Chris Mason <chris.mason@oracle.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/util/parse-events.c

index f77407b5832e94011a060f79007c2362d26c933c..4858d83b3b6746ea50756e58ffcdb90b61f8a5d4 100644 (file)
@@ -121,13 +121,29 @@ static unsigned long hw_cache_stat[C(MAX)] = {
           (strcmp(sys_dirent.d_name, ".")) &&                                 \
           (strcmp(sys_dirent.d_name, "..")))
 
+static int tp_event_has_id(struct dirent *sys_dir, struct dirent *evt_dir)
+{
+       char evt_path[MAXPATHLEN];
+       int fd;
+
+       snprintf(evt_path, MAXPATHLEN, "%s/%s/%s/id", debugfs_path,
+                       sys_dir->d_name, evt_dir->d_name);
+       fd = open(evt_path, O_RDONLY);
+       if (fd < 0)
+               return -EINVAL;
+       close(fd);
+
+       return 0;
+}
+
 #define for_each_event(sys_dirent, evt_dir, evt_dirent, evt_next, file, st)    \
        while (!readdir_r(evt_dir, &evt_dirent, &evt_next) && evt_next)        \
        if (snprintf(file, MAXPATHLEN, "%s/%s/%s", debugfs_path,               \
                     sys_dirent.d_name, evt_dirent.d_name) &&                  \
           (!stat(file, &st)) && (S_ISDIR(st.st_mode)) &&                      \
           (strcmp(evt_dirent.d_name, ".")) &&                                 \
-          (strcmp(evt_dirent.d_name, "..")))
+          (strcmp(evt_dirent.d_name, "..")) &&                                \
+          (!tp_event_has_id(&sys_dirent, &evt_dirent)))
 
 #define MAX_EVENT_LENGTH 30