Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 257138
b: refs/heads/master
c: 190b57f
h: refs/heads/master
v: v3
  • Loading branch information
Masami Hiramatsu authored and Steven Rostedt committed Jul 15, 2011
1 parent 97e76f4 commit ac3faaa
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 10 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: ff741783506c340035659a71be68ddb4068760d1
refs/heads/master: 190b57fcb9c5fed5414935a174094f534fc510bc
47 changes: 38 additions & 9 deletions trunk/tools/perf/util/probe-event.c
Original file line number Diff line number Diff line change
Expand Up @@ -226,14 +226,26 @@ static int kprobe_convert_to_perf_probe(struct probe_trace_point *tp,
return 0;
}

static int add_module_to_probe_trace_events(struct probe_trace_event *tevs,
int ntevs, const char *module)
{
int i;
for (i = 0; i < ntevs; i++) {
tevs[i].point.module = strdup(module);
if (!tevs[i].point.module)
return -ENOMEM;
}
return 0;
}

/* Try to find perf_probe_event with debuginfo */
static int try_to_find_probe_trace_events(struct perf_probe_event *pev,
struct probe_trace_event **tevs,
int max_tevs, const char *module)
struct probe_trace_event **tevs,
int max_tevs, const char *module)
{
bool need_dwarf = perf_probe_event_need_dwarf(pev);
struct debuginfo *dinfo = open_debuginfo(module);
int ntevs;
int ntevs, ret = 0;

if (!dinfo) {
if (need_dwarf) {
Expand All @@ -251,7 +263,10 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev,

if (ntevs > 0) { /* Succeeded to find trace events */
pr_debug("find %d probe_trace_events.\n", ntevs);
return ntevs;
if (module)
ret = add_module_to_probe_trace_events(*tevs, ntevs,
module);
return ret < 0 ? ret : ntevs;
}

if (ntevs == 0) { /* No error but failed to find probe point. */
Expand Down Expand Up @@ -1010,7 +1025,7 @@ bool perf_probe_event_need_dwarf(struct perf_probe_event *pev)

/* Parse probe_events event into struct probe_point */
static int parse_probe_trace_command(const char *cmd,
struct probe_trace_event *tev)
struct probe_trace_event *tev)
{
struct probe_trace_point *tp = &tev->point;
char pr;
Expand Down Expand Up @@ -1043,8 +1058,14 @@ static int parse_probe_trace_command(const char *cmd,

tp->retprobe = (pr == 'r');

/* Scan function name and offset */
ret = sscanf(argv[1], "%a[^+]+%lu", (float *)(void *)&tp->symbol,
/* Scan module name(if there), function name and offset */
p = strchr(argv[1], ':');
if (p) {
tp->module = strndup(argv[1], p - argv[1]);
p++;
} else
p = argv[1];
ret = sscanf(p, "%a[^+]+%lu", (float *)(void *)&tp->symbol,
&tp->offset);
if (ret == 1)
tp->offset = 0;
Expand Down Expand Up @@ -1289,9 +1310,10 @@ char *synthesize_probe_trace_command(struct probe_trace_event *tev)
if (buf == NULL)
return NULL;

len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s %s+%lu",
len = e_snprintf(buf, MAX_CMDLEN, "%c:%s/%s %s%s%s+%lu",
tp->retprobe ? 'r' : 'p',
tev->group, tev->event,
tp->module ?: "", tp->module ? ":" : "",
tp->symbol, tp->offset);
if (len <= 0)
goto error;
Expand Down Expand Up @@ -1398,6 +1420,8 @@ static void clear_probe_trace_event(struct probe_trace_event *tev)
free(tev->group);
if (tev->point.symbol)
free(tev->point.symbol);
if (tev->point.module)
free(tev->point.module);
for (i = 0; i < tev->nargs; i++) {
if (tev->args[i].name)
free(tev->args[i].name);
Expand Down Expand Up @@ -1749,7 +1773,7 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
/* Convert perf_probe_event with debuginfo */
ret = try_to_find_probe_trace_events(pev, tevs, max_tevs, module);
if (ret != 0)
return ret;
return ret; /* Found in debuginfo or got an error */

/* Allocate trace event buffer */
tev = *tevs = zalloc(sizeof(struct probe_trace_event));
Expand All @@ -1762,6 +1786,11 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev,
ret = -ENOMEM;
goto error;
}
tev->point.module = strdup(module);
if (tev->point.module == NULL) {
ret = -ENOMEM;
goto error;
}
tev->point.offset = pev->point.offset;
tev->point.retprobe = pev->point.retprobe;
tev->nargs = pev->nargs;
Expand Down
1 change: 1 addition & 0 deletions trunk/tools/perf/util/probe-event.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ extern bool probe_event_dry_run;
/* kprobe-tracer tracing point */
struct probe_trace_point {
char *symbol; /* Base symbol */
char *module; /* Module name */
unsigned long offset; /* Offset from symbol */
bool retprobe; /* Return probe flag */
};
Expand Down

0 comments on commit ac3faaa

Please sign in to comment.