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:
committed by
Arnaldo Carvalho de Melo
parent
167aedc44e
commit
e7c93f09b8
@@ -217,6 +217,29 @@ struct tracepoint_path *tracepoint_id_to_path(u64 config)
|
|||||||
return NULL;
|
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)
|
const char *event_type(int type)
|
||||||
{
|
{
|
||||||
switch (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_id_to_path(u64 config);
|
||||||
|
extern struct tracepoint_path *tracepoint_name_to_path(const char *name);
|
||||||
extern bool have_tracepoints(struct list_head *evlist);
|
extern bool have_tracepoints(struct list_head *evlist);
|
||||||
|
|
||||||
const char *event_type(int type);
|
const char *event_type(int type);
|
||||||
|
@@ -414,12 +414,27 @@ get_tracepoints_path(struct list_head *pattrs)
|
|||||||
if (pos->attr.type != PERF_TYPE_TRACEPOINT)
|
if (pos->attr.type != PERF_TYPE_TRACEPOINT)
|
||||||
continue;
|
continue;
|
||||||
++nr_tracepoints;
|
++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);
|
ppath->next = tracepoint_id_to_path(pos->attr.config);
|
||||||
if (!ppath->next) {
|
if (!ppath->next) {
|
||||||
|
error:
|
||||||
pr_debug("No memory to alloc tracepoints list\n");
|
pr_debug("No memory to alloc tracepoints list\n");
|
||||||
put_tracepoints_path(&path);
|
put_tracepoints_path(&path);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
next:
|
||||||
ppath = ppath->next;
|
ppath = ppath->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user