diff options
-rw-r--r-- | tools/perf/builtin-probe.c | 7 | ||||
-rw-r--r-- | tools/perf/util/probe-event.c | 34 | ||||
-rw-r--r-- | tools/perf/util/probe-event.h | 1 |
3 files changed, 30 insertions, 12 deletions
diff --git a/tools/perf/builtin-probe.c b/tools/perf/builtin-probe.c index 6b0e4cf322d8..520b064b46d8 100644 --- a/tools/perf/builtin-probe.c +++ b/tools/perf/builtin-probe.c | |||
@@ -265,8 +265,11 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used) | |||
265 | ret = find_probepoint(fd, pp); | 265 | ret = find_probepoint(fd, pp); |
266 | if (ret > 0) | 266 | if (ret > 0) |
267 | continue; | 267 | continue; |
268 | if (ret == 0) /* No error but failed to find probe point. */ | 268 | if (ret == 0) { /* No error but failed to find probe point. */ |
269 | die("No probe point found."); | 269 | synthesize_perf_probe_point(pp); |
270 | die("Probe point '%s' not found. - probe not added.", | ||
271 | pp->probes[0]); | ||
272 | } | ||
270 | /* Error path */ | 273 | /* Error path */ |
271 | if (session.need_dwarf) { | 274 | if (session.need_dwarf) { |
272 | if (ret == -ENOENT) | 275 | if (ret == -ENOENT) |
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index b05d532a4e4c..2ca62154f79b 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
@@ -249,11 +249,12 @@ void parse_trace_kprobe_event(const char *str, struct probe_point *pp) | |||
249 | argv_free(argv); | 249 | argv_free(argv); |
250 | } | 250 | } |
251 | 251 | ||
252 | int synthesize_perf_probe_event(struct probe_point *pp) | 252 | /* Synthesize only probe point (not argument) */ |
253 | int synthesize_perf_probe_point(struct probe_point *pp) | ||
253 | { | 254 | { |
254 | char *buf; | 255 | char *buf; |
255 | char offs[64] = "", line[64] = ""; | 256 | char offs[64] = "", line[64] = ""; |
256 | int i, len, ret; | 257 | int ret; |
257 | 258 | ||
258 | pp->probes[0] = buf = zalloc(MAX_CMDLEN); | 259 | pp->probes[0] = buf = zalloc(MAX_CMDLEN); |
259 | if (!buf) | 260 | if (!buf) |
@@ -274,10 +275,24 @@ int synthesize_perf_probe_event(struct probe_point *pp) | |||
274 | offs, pp->retprobe ? "%return" : "", line); | 275 | offs, pp->retprobe ? "%return" : "", line); |
275 | else | 276 | else |
276 | ret = e_snprintf(buf, MAX_CMDLEN, "%s%s", pp->file, line); | 277 | ret = e_snprintf(buf, MAX_CMDLEN, "%s%s", pp->file, line); |
277 | if (ret <= 0) | 278 | if (ret <= 0) { |
278 | goto error; | 279 | error: |
279 | len = ret; | 280 | free(pp->probes[0]); |
281 | pp->probes[0] = NULL; | ||
282 | } | ||
283 | return ret; | ||
284 | } | ||
285 | |||
286 | int synthesize_perf_probe_event(struct probe_point *pp) | ||
287 | { | ||
288 | char *buf; | ||
289 | int i, len, ret; | ||
280 | 290 | ||
291 | len = synthesize_perf_probe_point(pp); | ||
292 | if (len < 0) | ||
293 | return 0; | ||
294 | |||
295 | buf = pp->probes[0]; | ||
281 | for (i = 0; i < pp->nr_args; i++) { | 296 | for (i = 0; i < pp->nr_args; i++) { |
282 | ret = e_snprintf(&buf[len], MAX_CMDLEN - len, " %s", | 297 | ret = e_snprintf(&buf[len], MAX_CMDLEN - len, " %s", |
283 | pp->args[i]); | 298 | pp->args[i]); |
@@ -290,6 +305,7 @@ int synthesize_perf_probe_event(struct probe_point *pp) | |||
290 | return pp->found; | 305 | return pp->found; |
291 | error: | 306 | error: |
292 | free(pp->probes[0]); | 307 | free(pp->probes[0]); |
308 | pp->probes[0] = NULL; | ||
293 | 309 | ||
294 | return ret; | 310 | return ret; |
295 | } | 311 | } |
@@ -319,6 +335,7 @@ int synthesize_trace_kprobe_event(struct probe_point *pp) | |||
319 | return pp->found; | 335 | return pp->found; |
320 | error: | 336 | error: |
321 | free(pp->probes[0]); | 337 | free(pp->probes[0]); |
338 | pp->probes[0] = NULL; | ||
322 | 339 | ||
323 | return ret; | 340 | return ret; |
324 | } | 341 | } |
@@ -418,7 +435,7 @@ static void show_perf_probe_event(const char *event, const char *place, | |||
418 | /* List up current perf-probe events */ | 435 | /* List up current perf-probe events */ |
419 | void show_perf_probe_events(void) | 436 | void show_perf_probe_events(void) |
420 | { | 437 | { |
421 | int fd, nr; | 438 | int fd; |
422 | struct probe_point pp; | 439 | struct probe_point pp; |
423 | struct strlist *rawlist; | 440 | struct strlist *rawlist; |
424 | struct str_node *ent; | 441 | struct str_node *ent; |
@@ -430,10 +447,7 @@ void show_perf_probe_events(void) | |||
430 | strlist__for_each(ent, rawlist) { | 447 | strlist__for_each(ent, rawlist) { |
431 | parse_trace_kprobe_event(ent->s, &pp); | 448 | parse_trace_kprobe_event(ent->s, &pp); |
432 | /* Synthesize only event probe point */ | 449 | /* Synthesize only event probe point */ |
433 | nr = pp.nr_args; | 450 | synthesize_perf_probe_point(&pp); |
434 | pp.nr_args = 0; | ||
435 | synthesize_perf_probe_event(&pp); | ||
436 | pp.nr_args = nr; | ||
437 | /* Show an event */ | 451 | /* Show an event */ |
438 | show_perf_probe_event(pp.event, pp.probes[0], &pp); | 452 | show_perf_probe_event(pp.event, pp.probes[0], &pp); |
439 | clear_probe_point(&pp); | 453 | clear_probe_point(&pp); |
diff --git a/tools/perf/util/probe-event.h b/tools/perf/util/probe-event.h index 8fd30525100c..7f1d499118c0 100644 --- a/tools/perf/util/probe-event.h +++ b/tools/perf/util/probe-event.h | |||
@@ -7,6 +7,7 @@ | |||
7 | 7 | ||
8 | extern void parse_perf_probe_event(const char *str, struct probe_point *pp, | 8 | extern void parse_perf_probe_event(const char *str, struct probe_point *pp, |
9 | bool *need_dwarf); | 9 | bool *need_dwarf); |
10 | extern int synthesize_perf_probe_point(struct probe_point *pp); | ||
10 | extern int synthesize_perf_probe_event(struct probe_point *pp); | 11 | extern int synthesize_perf_probe_event(struct probe_point *pp); |
11 | extern void parse_trace_kprobe_event(const char *str, struct probe_point *pp); | 12 | extern void parse_trace_kprobe_event(const char *str, struct probe_point *pp); |
12 | extern int synthesize_trace_kprobe_event(struct probe_point *pp); | 13 | extern int synthesize_trace_kprobe_event(struct probe_point *pp); |