diff options
| author | Arnaldo Carvalho de Melo <acme@redhat.com> | 2009-11-21 11:31:26 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2009-11-21 11:45:59 -0500 |
| commit | e25613683bd5c46d3e8c8ae6416dccc9f357dcdc (patch) | |
| tree | a78a494c84d705d8505bd45e80fe7375943bb76e /tools/perf/util | |
| parent | c12e15e71d4b32da045e798ffd21cbb6197d1c65 (diff) | |
perf trace: Read_tracing_data should die() another day
It better propagate errors, also if we do a simple:
[root@doppio linux-2.6-tip]# perf record -R -a -f sleep 3s ;
perf trace [ perf record: Woken up 1 times to write data ]
[ perf record: Captured and wrote 0.182 MB perf.data (~7972 samples) ]
Fatal: not an trace data file
[root@doppio linux-2.6-tip]#
That is what is expected, right? I.e. as we didn't specify any
tracepoint event via -e, it should gracefully bail out and not
SEGFAULT.
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Steven Rostedt <rostedt@goodmis.org>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1258821086-11521-3-git-send-email-acme@infradead.org>
[ Fixed the error messages some more ]
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/util')
| -rw-r--r-- | tools/perf/util/trace-event-info.c | 22 | ||||
| -rw-r--r-- | tools/perf/util/trace-event-read.c | 4 | ||||
| -rw-r--r-- | tools/perf/util/trace-event.h | 2 |
3 files changed, 18 insertions, 10 deletions
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c index 831052d4b4fb..cace35595530 100644 --- a/tools/perf/util/trace-event-info.c +++ b/tools/perf/util/trace-event-info.c | |||
| @@ -33,11 +33,11 @@ | |||
| 33 | #include <ctype.h> | 33 | #include <ctype.h> |
| 34 | #include <errno.h> | 34 | #include <errno.h> |
| 35 | #include <stdbool.h> | 35 | #include <stdbool.h> |
| 36 | #include <linux/kernel.h> | ||
| 36 | 37 | ||
| 37 | #include "../perf.h" | 38 | #include "../perf.h" |
| 38 | #include "trace-event.h" | 39 | #include "trace-event.h" |
| 39 | 40 | ||
| 40 | |||
| 41 | #define VERSION "0.5" | 41 | #define VERSION "0.5" |
| 42 | 42 | ||
| 43 | #define _STR(x) #x | 43 | #define _STR(x) #x |
| @@ -483,23 +483,31 @@ static struct tracepoint_path * | |||
| 483 | get_tracepoints_path(struct perf_event_attr *pattrs, int nb_events) | 483 | get_tracepoints_path(struct perf_event_attr *pattrs, int nb_events) |
| 484 | { | 484 | { |
| 485 | struct tracepoint_path path, *ppath = &path; | 485 | struct tracepoint_path path, *ppath = &path; |
| 486 | int i; | 486 | int i, nr_tracepoints = 0; |
| 487 | 487 | ||
| 488 | for (i = 0; i < nb_events; i++) { | 488 | for (i = 0; i < nb_events; i++) { |
| 489 | if (pattrs[i].type != PERF_TYPE_TRACEPOINT) | 489 | if (pattrs[i].type != PERF_TYPE_TRACEPOINT) |
| 490 | continue; | 490 | continue; |
| 491 | ++nr_tracepoints; | ||
| 491 | ppath->next = tracepoint_id_to_path(pattrs[i].config); | 492 | ppath->next = tracepoint_id_to_path(pattrs[i].config); |
| 492 | if (!ppath->next) | 493 | if (!ppath->next) |
| 493 | die("%s\n", "No memory to alloc tracepoints list"); | 494 | die("%s\n", "No memory to alloc tracepoints list"); |
| 494 | ppath = ppath->next; | 495 | ppath = ppath->next; |
| 495 | } | 496 | } |
| 496 | 497 | ||
| 497 | return path.next; | 498 | return nr_tracepoints > 0 ? path.next : NULL; |
| 498 | } | 499 | } |
| 499 | void read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events) | 500 | |
| 501 | int read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events) | ||
| 500 | { | 502 | { |
| 501 | char buf[BUFSIZ]; | 503 | char buf[BUFSIZ]; |
| 502 | struct tracepoint_path *tps; | 504 | struct tracepoint_path *tps = get_tracepoints_path(pattrs, nb_events); |
| 505 | |||
| 506 | /* | ||
| 507 | * What? No tracepoints? No sense writing anything here, bail out. | ||
| 508 | */ | ||
| 509 | if (tps == NULL) | ||
| 510 | return -1; | ||
| 503 | 511 | ||
| 504 | output_fd = fd; | 512 | output_fd = fd; |
| 505 | 513 | ||
| @@ -528,11 +536,11 @@ void read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events) | |||
| 528 | page_size = getpagesize(); | 536 | page_size = getpagesize(); |
| 529 | write_or_die(&page_size, 4); | 537 | write_or_die(&page_size, 4); |
| 530 | 538 | ||
| 531 | tps = get_tracepoints_path(pattrs, nb_events); | ||
| 532 | |||
| 533 | read_header_files(); | 539 | read_header_files(); |
| 534 | read_ftrace_files(tps); | 540 | read_ftrace_files(tps); |
| 535 | read_event_files(tps); | 541 | read_event_files(tps); |
| 536 | read_proc_kallsyms(); | 542 | read_proc_kallsyms(); |
| 537 | read_ftrace_printk(); | 543 | read_ftrace_printk(); |
| 544 | |||
| 545 | return 0; | ||
| 538 | } | 546 | } |
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c index 44292e06cca4..342dfdd43f87 100644 --- a/tools/perf/util/trace-event-read.c +++ b/tools/perf/util/trace-event-read.c | |||
| @@ -471,11 +471,11 @@ void trace_report(int fd) | |||
| 471 | 471 | ||
| 472 | read_or_die(buf, 3); | 472 | read_or_die(buf, 3); |
| 473 | if (memcmp(buf, test, 3) != 0) | 473 | if (memcmp(buf, test, 3) != 0) |
| 474 | die("not an trace data file"); | 474 | die("no trace data in the file"); |
| 475 | 475 | ||
| 476 | read_or_die(buf, 7); | 476 | read_or_die(buf, 7); |
| 477 | if (memcmp(buf, "tracing", 7) != 0) | 477 | if (memcmp(buf, "tracing", 7) != 0) |
| 478 | die("not a trace file (missing tracing)"); | 478 | die("not a trace file (missing 'tracing' tag)"); |
| 479 | 479 | ||
| 480 | version = read_string(); | 480 | version = read_string(); |
| 481 | if (show_version) | 481 | if (show_version) |
diff --git a/tools/perf/util/trace-event.h b/tools/perf/util/trace-event.h index f6637c2fa1fe..dd51c6872a15 100644 --- a/tools/perf/util/trace-event.h +++ b/tools/perf/util/trace-event.h | |||
| @@ -248,7 +248,7 @@ unsigned long long | |||
| 248 | raw_field_value(struct event *event, const char *name, void *data); | 248 | raw_field_value(struct event *event, const char *name, void *data); |
| 249 | void *raw_field_ptr(struct event *event, const char *name, void *data); | 249 | void *raw_field_ptr(struct event *event, const char *name, void *data); |
| 250 | 250 | ||
| 251 | void read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events); | 251 | int read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events); |
| 252 | 252 | ||
| 253 | /* taken from kernel/trace/trace.h */ | 253 | /* taken from kernel/trace/trace.h */ |
| 254 | enum trace_flag_type { | 254 | enum trace_flag_type { |
