perf probe: Support glob wildcards for function name
Support glob wildcards for function name when adding new probes. This will allow us to build caches of function-entry level information with $params. e.g. ---- # perf probe --no-inlines --add 'kmalloc* $params' Added new events: probe:kmalloc_slab (on kmalloc* with $params) probe:kmalloc_large_node (on kmalloc* with $params) probe:kmalloc_order_trace (on kmalloc* with $params) You can now use it in all perf tools, such as: perf record -e probe:kmalloc_order_trace -aR sleep 1 # perf probe --list probe:kmalloc_large_node (on kmalloc_large_node@mm/slub.c with size flags node) probe:kmalloc_order_trace (on kmalloc_order_trace@mm/slub.c with size flags order) probe:kmalloc_slab (on kmalloc_slab@mm/slab_common.c with size flags) ---- Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com> Cc: David Ahern <dsahern@gmail.com> Cc: Hemant Kumar <hemant@linux.vnet.ibm.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20150508010335.24812.19972.stgit@localhost.localdomain Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
6cfd1f6805
commit
4c85935122
6 changed files with 59 additions and 11 deletions
|
@ -589,7 +589,11 @@ static int post_process_probe_trace_events(struct probe_trace_event *tevs,
|
|||
if (!tmp)
|
||||
return -ENOMEM;
|
||||
}
|
||||
free(tevs[i].point.symbol);
|
||||
/* If we have no realname, use symbol for it */
|
||||
if (!tevs[i].point.realname)
|
||||
tevs[i].point.realname = tevs[i].point.symbol;
|
||||
else
|
||||
free(tevs[i].point.symbol);
|
||||
tevs[i].point.symbol = tmp;
|
||||
tevs[i].point.offset = tevs[i].point.address -
|
||||
reloc_sym->unrelocated_addr;
|
||||
|
@ -1900,6 +1904,7 @@ static void clear_probe_trace_event(struct probe_trace_event *tev)
|
|||
free(tev->event);
|
||||
free(tev->group);
|
||||
free(tev->point.symbol);
|
||||
free(tev->point.realname);
|
||||
free(tev->point.module);
|
||||
for (i = 0; i < tev->nargs; i++) {
|
||||
free(tev->args[i].name);
|
||||
|
@ -2377,6 +2382,7 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
|
|||
struct strlist *namelist;
|
||||
LIST_HEAD(blacklist);
|
||||
struct kprobe_blacklist_node *node;
|
||||
bool safename;
|
||||
|
||||
if (pev->uprobes)
|
||||
fd = open_uprobe_events(true);
|
||||
|
@ -2402,6 +2408,7 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
|
|||
pr_debug("No kprobe blacklist support, ignored\n");
|
||||
}
|
||||
|
||||
safename = (pev->point.function && !strisglob(pev->point.function));
|
||||
ret = 0;
|
||||
pr_info("Added new event%s\n", (ntevs > 1) ? "s:" : ":");
|
||||
for (i = 0; i < ntevs; i++) {
|
||||
|
@ -2420,10 +2427,10 @@ static int __add_probe_trace_events(struct perf_probe_event *pev,
|
|||
if (pev->event)
|
||||
event = pev->event;
|
||||
else
|
||||
if (pev->point.function)
|
||||
if (safename)
|
||||
event = pev->point.function;
|
||||
else
|
||||
event = tev->point.symbol;
|
||||
event = tev->point.realname;
|
||||
if (pev->group)
|
||||
group = pev->group;
|
||||
else
|
||||
|
@ -2488,9 +2495,11 @@ static int find_probe_functions(struct map *map, char *name)
|
|||
{
|
||||
int found = 0;
|
||||
struct symbol *sym;
|
||||
struct rb_node *tmp;
|
||||
|
||||
map__for_each_symbol_by_name(map, name, sym) {
|
||||
found++;
|
||||
map__for_each_symbol(map, sym, tmp) {
|
||||
if (strglobmatch(sym->name, name))
|
||||
found++;
|
||||
}
|
||||
|
||||
return found;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue