perf util: Use evsel->name to get tracepoint_paths
Most tracepoint events already have their system and event name in ->name field so that searching whole event tracing directory for each evsel to match given id is suboptimal. Factor out this routine into tracepoint_name_to_path(). In case of en invalid name, it'll try to find path using id again. Signed-off-by: Namhyung Kim <namhyung@kernel.org> Cc: David Ahern <dsahern@gmail.com> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Ingo Molnar <mingo@kernel.org> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Cc: Steven Rostedt <rostedt@goodmis.org> Link: http://lkml.kernel.org/r/1372230862-15861-3-git-send-email-namhyung@kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
167aedc44e
commit
e7c93f09b8
@ -217,6 +217,29 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct tracepoint_path *tracepoint_name_to_path(const char *name)
|
||||
{
|
||||
struct tracepoint_path *path = zalloc(sizeof(*path));
|
||||
char *str = strchr(name, ':');
|
||||
|
||||
if (path == NULL || str == NULL) {
|
||||
free(path);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
path->system = strndup(name, str - name);
|
||||
path->name = strdup(str+1);
|
||||
|
||||
if (path->system == NULL || path->name == NULL) {
|
||||
free(path->system);
|
||||
free(path->name);
|
||||
free(path);
|
||||
path = NULL;
|
||||
}
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
const char *event_type(int type)
|
||||
{
|
||||
switch (type) {
|
||||
|
@ -23,6 +23,7 @@ struct tracepoint_path {
|
||||
};
|
||||
|
||||
extern struct tracepoint_path *tracepoint_id_to_path(u64 config);
|
||||
extern struct tracepoint_path *tracepoint_name_to_path(const char *name);
|
||||
extern bool have_tracepoints(struct list_head *evlist);
|
||||
|
||||
const char *event_type(int type);
|
||||
|
@ -414,12 +414,27 @@ get_tracepoints_path(struct list_head *pattrs)
|
||||
if (pos->attr.type != PERF_TYPE_TRACEPOINT)
|
||||
continue;
|
||||
++nr_tracepoints;
|
||||
|
||||
if (pos->name) {
|
||||
ppath->next = tracepoint_name_to_path(pos->name);
|
||||
if (ppath->next)
|
||||
goto next;
|
||||
|
||||
if (strchr(pos->name, ':') == NULL)
|
||||
goto try_id;
|
||||
|
||||
goto error;
|
||||
}
|
||||
|
||||
try_id:
|
||||
ppath->next = tracepoint_id_to_path(pos->attr.config);
|
||||
if (!ppath->next) {
|
||||
error:
|
||||
pr_debug("No memory to alloc tracepoints list\n");
|
||||
put_tracepoints_path(&path);
|
||||
return NULL;
|
||||
}
|
||||
next:
|
||||
ppath = ppath->next;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user