Commit 44225521 authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Arnaldo Carvalho de Melo

perf probe: Use perf_probe_event.target instead of passing as an argument

Use perf_probe_event.target field for the target binary instead of
passing it as an argument.
Signed-off-by: default avatarMasami Hiramatsu <masami.hiramatsu.pt@hitachi.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/20150508010328.24812.67887.stgit@localhost.localdomainSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 598adc5c
...@@ -478,7 +478,6 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused) ...@@ -478,7 +478,6 @@ __cmd_probe(int argc, const char **argv, const char *prefix __maybe_unused)
ret = show_available_vars(params.events, params.nevents, ret = show_available_vars(params.events, params.nevents,
params.max_probe_points, params.max_probe_points,
params.target,
params.filter, params.filter,
params.show_ext_vars); params.show_ext_vars);
if (ret < 0) if (ret < 0)
......
...@@ -344,15 +344,14 @@ static int find_alternative_probe_point(struct debuginfo *dinfo, ...@@ -344,15 +344,14 @@ static int find_alternative_probe_point(struct debuginfo *dinfo,
static int get_alternative_probe_event(struct debuginfo *dinfo, static int get_alternative_probe_event(struct debuginfo *dinfo,
struct perf_probe_event *pev, struct perf_probe_event *pev,
struct perf_probe_point *tmp, struct perf_probe_point *tmp)
const char *target)
{ {
int ret; int ret;
memcpy(tmp, &pev->point, sizeof(*tmp)); memcpy(tmp, &pev->point, sizeof(*tmp));
memset(&pev->point, 0, sizeof(pev->point)); memset(&pev->point, 0, sizeof(pev->point));
ret = find_alternative_probe_point(dinfo, tmp, &pev->point, ret = find_alternative_probe_point(dinfo, tmp, &pev->point,
target, pev->uprobes); pev->target, pev->uprobes);
if (ret < 0) if (ret < 0)
memcpy(&pev->point, tmp, sizeof(*tmp)); memcpy(&pev->point, tmp, sizeof(*tmp));
...@@ -601,15 +600,14 @@ static int post_process_probe_trace_events(struct probe_trace_event *tevs, ...@@ -601,15 +600,14 @@ static int post_process_probe_trace_events(struct probe_trace_event *tevs,
/* Try to find perf_probe_event with debuginfo */ /* Try to find perf_probe_event with debuginfo */
static int try_to_find_probe_trace_events(struct perf_probe_event *pev, static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
struct probe_trace_event **tevs, struct probe_trace_event **tevs,
int max_tevs, const char *target) int max_tevs)
{ {
bool need_dwarf = perf_probe_event_need_dwarf(pev); bool need_dwarf = perf_probe_event_need_dwarf(pev);
struct perf_probe_point tmp; struct perf_probe_point tmp;
struct debuginfo *dinfo; struct debuginfo *dinfo;
int ntevs, ret = 0; int ntevs, ret = 0;
dinfo = open_debuginfo(target, !need_dwarf); dinfo = open_debuginfo(pev->target, !need_dwarf);
if (!dinfo) { if (!dinfo) {
if (need_dwarf) if (need_dwarf)
return -ENOENT; return -ENOENT;
...@@ -622,7 +620,7 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev, ...@@ -622,7 +620,7 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
ntevs = debuginfo__find_trace_events(dinfo, pev, tevs, max_tevs); ntevs = debuginfo__find_trace_events(dinfo, pev, tevs, max_tevs);
if (ntevs == 0) { /* Not found, retry with an alternative */ if (ntevs == 0) { /* Not found, retry with an alternative */
ret = get_alternative_probe_event(dinfo, pev, &tmp, target); ret = get_alternative_probe_event(dinfo, pev, &tmp);
if (!ret) { if (!ret) {
ntevs = debuginfo__find_trace_events(dinfo, pev, ntevs = debuginfo__find_trace_events(dinfo, pev,
tevs, max_tevs); tevs, max_tevs);
...@@ -640,7 +638,7 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev, ...@@ -640,7 +638,7 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
if (ntevs > 0) { /* Succeeded to find trace events */ if (ntevs > 0) { /* Succeeded to find trace events */
pr_debug("Found %d probe_trace_events.\n", ntevs); pr_debug("Found %d probe_trace_events.\n", ntevs);
ret = post_process_probe_trace_events(*tevs, ntevs, ret = post_process_probe_trace_events(*tevs, ntevs,
target, pev->uprobes); pev->target, pev->uprobes);
if (ret < 0 || ret == ntevs) { if (ret < 0 || ret == ntevs) {
clear_probe_trace_events(*tevs, ntevs); clear_probe_trace_events(*tevs, ntevs);
zfree(tevs); zfree(tevs);
...@@ -824,7 +822,7 @@ int show_line_range(struct line_range *lr, const char *module, bool user) ...@@ -824,7 +822,7 @@ int show_line_range(struct line_range *lr, const char *module, bool user)
static int show_available_vars_at(struct debuginfo *dinfo, static int show_available_vars_at(struct debuginfo *dinfo,
struct perf_probe_event *pev, struct perf_probe_event *pev,
int max_vls, struct strfilter *_filter, int max_vls, struct strfilter *_filter,
bool externs, const char *target) bool externs)
{ {
char *buf; char *buf;
int ret, i, nvars; int ret, i, nvars;
...@@ -841,7 +839,7 @@ static int show_available_vars_at(struct debuginfo *dinfo, ...@@ -841,7 +839,7 @@ static int show_available_vars_at(struct debuginfo *dinfo,
ret = debuginfo__find_available_vars_at(dinfo, pev, &vls, ret = debuginfo__find_available_vars_at(dinfo, pev, &vls,
max_vls, externs); max_vls, externs);
if (!ret) { /* Not found, retry with an alternative */ if (!ret) { /* Not found, retry with an alternative */
ret = get_alternative_probe_event(dinfo, pev, &tmp, target); ret = get_alternative_probe_event(dinfo, pev, &tmp);
if (!ret) { if (!ret) {
ret = debuginfo__find_available_vars_at(dinfo, pev, ret = debuginfo__find_available_vars_at(dinfo, pev,
&vls, max_vls, externs); &vls, max_vls, externs);
...@@ -891,8 +889,7 @@ static int show_available_vars_at(struct debuginfo *dinfo, ...@@ -891,8 +889,7 @@ static int show_available_vars_at(struct debuginfo *dinfo,
/* Show available variables on given probe point */ /* Show available variables on given probe point */
int show_available_vars(struct perf_probe_event *pevs, int npevs, int show_available_vars(struct perf_probe_event *pevs, int npevs,
int max_vls, const char *module, int max_vls, struct strfilter *_filter, bool externs)
struct strfilter *_filter, bool externs)
{ {
int i, ret = 0; int i, ret = 0;
struct debuginfo *dinfo; struct debuginfo *dinfo;
...@@ -901,7 +898,7 @@ int show_available_vars(struct perf_probe_event *pevs, int npevs, ...@@ -901,7 +898,7 @@ int show_available_vars(struct perf_probe_event *pevs, int npevs,
if (ret < 0) if (ret < 0)
return ret; return ret;
dinfo = open_debuginfo(module, false); dinfo = open_debuginfo(pevs->target, false);
if (!dinfo) { if (!dinfo) {
ret = -ENOENT; ret = -ENOENT;
goto out; goto out;
...@@ -911,7 +908,7 @@ int show_available_vars(struct perf_probe_event *pevs, int npevs, ...@@ -911,7 +908,7 @@ int show_available_vars(struct perf_probe_event *pevs, int npevs,
for (i = 0; i < npevs && ret >= 0; i++) for (i = 0; i < npevs && ret >= 0; i++)
ret = show_available_vars_at(dinfo, &pevs[i], max_vls, _filter, ret = show_available_vars_at(dinfo, &pevs[i], max_vls, _filter,
externs, module); externs);
debuginfo__delete(dinfo); debuginfo__delete(dinfo);
out: out:
...@@ -931,8 +928,7 @@ find_perf_probe_point_from_dwarf(struct probe_trace_point *tp __maybe_unused, ...@@ -931,8 +928,7 @@ find_perf_probe_point_from_dwarf(struct probe_trace_point *tp __maybe_unused,
static int try_to_find_probe_trace_events(struct perf_probe_event *pev, static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
struct probe_trace_event **tevs __maybe_unused, struct probe_trace_event **tevs __maybe_unused,
int max_tevs __maybe_unused, int max_tevs __maybe_unused)
const char *target __maybe_unused)
{ {
if (perf_probe_event_need_dwarf(pev)) { if (perf_probe_event_need_dwarf(pev)) {
pr_warning("Debuginfo-analysis is not supported.\n"); pr_warning("Debuginfo-analysis is not supported.\n");
...@@ -952,7 +948,6 @@ int show_line_range(struct line_range *lr __maybe_unused, ...@@ -952,7 +948,6 @@ int show_line_range(struct line_range *lr __maybe_unused,
int show_available_vars(struct perf_probe_event *pevs __maybe_unused, int show_available_vars(struct perf_probe_event *pevs __maybe_unused,
int npevs __maybe_unused, int max_vls __maybe_unused, int npevs __maybe_unused, int max_vls __maybe_unused,
const char *module __maybe_unused,
struct strfilter *filter __maybe_unused, struct strfilter *filter __maybe_unused,
bool externs __maybe_unused) bool externs __maybe_unused)
{ {
...@@ -2520,7 +2515,7 @@ void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused, ...@@ -2520,7 +2515,7 @@ void __weak arch__fix_tev_from_maps(struct perf_probe_event *pev __maybe_unused,
*/ */
static int find_probe_trace_events_from_map(struct perf_probe_event *pev, static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
struct probe_trace_event **tevs, struct probe_trace_event **tevs,
int max_tevs, const char *target) int max_tevs)
{ {
struct map *map = NULL; struct map *map = NULL;
struct ref_reloc_sym *reloc_sym = NULL; struct ref_reloc_sym *reloc_sym = NULL;
...@@ -2531,7 +2526,7 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, ...@@ -2531,7 +2526,7 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
int num_matched_functions; int num_matched_functions;
int ret, i; int ret, i;
map = get_target_map(target, pev->uprobes); map = get_target_map(pev->target, pev->uprobes);
if (!map) { if (!map) {
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
...@@ -2544,12 +2539,12 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, ...@@ -2544,12 +2539,12 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
num_matched_functions = find_probe_functions(map, pp->function); num_matched_functions = find_probe_functions(map, pp->function);
if (num_matched_functions == 0) { if (num_matched_functions == 0) {
pr_err("Failed to find symbol %s in %s\n", pp->function, pr_err("Failed to find symbol %s in %s\n", pp->function,
target ? : "kernel"); pev->target ? : "kernel");
ret = -ENOENT; ret = -ENOENT;
goto out; goto out;
} else if (num_matched_functions > max_tevs) { } else if (num_matched_functions > max_tevs) {
pr_err("Too many functions matched in %s\n", pr_err("Too many functions matched in %s\n",
target ? : "kernel"); pev->target ? : "kernel");
ret = -E2BIG; ret = -E2BIG;
goto out; goto out;
} }
...@@ -2597,8 +2592,9 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev, ...@@ -2597,8 +2592,9 @@ static int find_probe_trace_events_from_map(struct perf_probe_event *pev,
tp->offset = pp->offset; tp->offset = pp->offset;
} }
tp->retprobe = pp->retprobe; tp->retprobe = pp->retprobe;
if (target) if (pev->target)
tev->point.module = strdup_or_goto(target, nomem_out); tev->point.module = strdup_or_goto(pev->target,
nomem_out);
tev->uprobes = pev->uprobes; tev->uprobes = pev->uprobes;
tev->nargs = pev->nargs; tev->nargs = pev->nargs;
if (tev->nargs) { if (tev->nargs) {
...@@ -2639,13 +2635,13 @@ bool __weak arch__prefers_symtab(void) { return false; } ...@@ -2639,13 +2635,13 @@ bool __weak arch__prefers_symtab(void) { return false; }
static int convert_to_probe_trace_events(struct perf_probe_event *pev, static int convert_to_probe_trace_events(struct perf_probe_event *pev,
struct probe_trace_event **tevs, struct probe_trace_event **tevs,
int max_tevs, const char *target) int max_tevs)
{ {
int ret; int ret;
if (pev->uprobes && !pev->group) { if (pev->uprobes && !pev->group) {
/* Replace group name if not given */ /* Replace group name if not given */
ret = convert_exec_to_group(target, &pev->group); ret = convert_exec_to_group(pev->target, &pev->group);
if (ret != 0) { if (ret != 0) {
pr_warning("Failed to make a group name.\n"); pr_warning("Failed to make a group name.\n");
return ret; return ret;
...@@ -2653,17 +2649,17 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev, ...@@ -2653,17 +2649,17 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
} }
if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) { if (arch__prefers_symtab() && !perf_probe_event_need_dwarf(pev)) {
ret = find_probe_trace_events_from_map(pev, tevs, max_tevs, target); ret = find_probe_trace_events_from_map(pev, tevs, max_tevs);
if (ret > 0) if (ret > 0)
return ret; /* Found in symbol table */ return ret; /* Found in symbol table */
} }
/* Convert perf_probe_event with debuginfo */ /* Convert perf_probe_event with debuginfo */
ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, target); ret = try_to_find_probe_trace_events(pev, tevs, max_tevs);
if (ret != 0) if (ret != 0)
return ret; /* Found in debuginfo or got an error */ return ret; /* Found in debuginfo or got an error */
return find_probe_trace_events_from_map(pev, tevs, max_tevs, target); return find_probe_trace_events_from_map(pev, tevs, max_tevs);
} }
struct __event_package { struct __event_package {
...@@ -2696,8 +2692,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs, ...@@ -2696,8 +2692,7 @@ int add_perf_probe_events(struct perf_probe_event *pevs, int npevs,
/* Convert with or without debuginfo */ /* Convert with or without debuginfo */
ret = convert_to_probe_trace_events(pkgs[i].pev, ret = convert_to_probe_trace_events(pkgs[i].pev,
&pkgs[i].tevs, &pkgs[i].tevs,
max_tevs, max_tevs);
pkgs[i].pev->target);
if (ret < 0) if (ret < 0)
goto end; goto end;
pkgs[i].ntevs = ret; pkgs[i].ntevs = ret;
......
...@@ -131,8 +131,8 @@ extern int show_perf_probe_events(struct strfilter *filter); ...@@ -131,8 +131,8 @@ extern int show_perf_probe_events(struct strfilter *filter);
extern int show_line_range(struct line_range *lr, const char *module, extern int show_line_range(struct line_range *lr, const char *module,
bool user); bool user);
extern int show_available_vars(struct perf_probe_event *pevs, int npevs, extern int show_available_vars(struct perf_probe_event *pevs, int npevs,
int max_probe_points, const char *module, int max_probe_points, struct strfilter *filter,
struct strfilter *filter, bool externs); bool externs);
extern int show_available_funcs(const char *module, struct strfilter *filter, extern int show_available_funcs(const char *module, struct strfilter *filter,
bool user); bool user);
bool arch__prefers_symtab(void); bool arch__prefers_symtab(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment