aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorTom Zanussi <tzanussi@gmail.com>2010-05-03 01:14:48 -0400
committerArnaldo Carvalho de Melo <acme@redhat.com>2010-05-03 09:31:48 -0400
commit63e0c7715aab6085faa487d498889f4361dc6542 (patch)
tree3d6923589ed744abeca4e3bb1a6fa512e6e3952b /tools/perf
parent090f7204dfdb5d7f18208ea81dfdba845897cedd (diff)
perf: record TRACE_INFO only if using tracepoints and SAMPLE_RAW
The current perf code implicitly assumes SAMPLE_RAW means tracepoints are being used, but doesn't check for that. It happily records the TRACE_INFO even if SAMPLE_RAW is used without tracepoints, but when the perf data is read it won't go any further when it finds TRACE_INFO but no tracepoints, and displays misleading errors. This adds a check for both in perf-record, and won't record TRACE_INFO unless both are true. This at least allows perf report -D to dump raw events, and avoids triggering a misleading error condition in perf trace. It doesn't actually enable the non-tracepoint raw events to be displayed in perf trace, since perf trace currently only deals with tracepoint events. Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> LKML-Reference: <1272865861.7932.16.camel@tropicana> Signed-off-by: Tom Zanussi <tzanussi@gmail.com> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/builtin-record.c35
-rw-r--r--tools/perf/util/header.c1
-rw-r--r--tools/perf/util/parse-events.h1
-rw-r--r--tools/perf/util/trace-event-info.c5
4 files changed, 27 insertions, 15 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index ac989e9ba8fe..0ff67d1c4752 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -560,11 +560,12 @@ static int __cmd_record(int argc, const char **argv)
560 return err; 560 return err;
561 } 561 }
562 562
563 if (raw_samples) { 563 if (raw_samples && have_tracepoints(attrs, nr_counters)) {
564 perf_header__set_feat(&session->header, HEADER_TRACE_INFO); 564 perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
565 } else { 565 } else {
566 for (i = 0; i < nr_counters; i++) { 566 for (i = 0; i < nr_counters; i++) {
567 if (attrs[i].sample_type & PERF_SAMPLE_RAW) { 567 if (attrs[i].sample_type & PERF_SAMPLE_RAW &&
568 attrs[i].type == PERF_TYPE_TRACEPOINT) {
568 perf_header__set_feat(&session->header, HEADER_TRACE_INFO); 569 perf_header__set_feat(&session->header, HEADER_TRACE_INFO);
569 break; 570 break;
570 } 571 }
@@ -662,19 +663,25 @@ static int __cmd_record(int argc, const char **argv)
662 return err; 663 return err;
663 } 664 }
664 665
665 err = event__synthesize_tracing_data(output, attrs, 666 if (have_tracepoints(attrs, nr_counters)) {
666 nr_counters, 667 /*
667 process_synthesized_event, 668 * FIXME err <= 0 here actually means that
668 session); 669 * there were no tracepoints so its not really
669 /* 670 * an error, just that we don't need to
670 * FIXME err <= 0 here actually means that there were no tracepoints 671 * synthesize anything. We really have to
671 * so its not really an error, just that we don't need to synthesize 672 * return this more properly and also
672 * anything. 673 * propagate errors that now are calling die()
673 * We really have to return this more properly and also propagate 674 */
674 * errors that now are calling die() 675 err = event__synthesize_tracing_data(output, attrs,
675 */ 676 nr_counters,
676 if (err > 0) 677 process_synthesized_event,
678 session);
679 if (err <= 0) {
680 pr_err("Couldn't record tracing data.\n");
681 return err;
682 }
677 advance_output(err); 683 advance_output(err);
684 }
678 } 685 }
679 686
680 machine = perf_session__find_host_machine(session); 687 machine = perf_session__find_host_machine(session);
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index 79da0e50ef8f..2b9f898efea6 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -436,7 +436,6 @@ static int perf_header__adds_write(struct perf_header *self, int fd)
436 trace_sec->size = lseek(fd, 0, SEEK_CUR) - trace_sec->offset; 436 trace_sec->size = lseek(fd, 0, SEEK_CUR) - trace_sec->offset;
437 } 437 }
438 438
439
440 if (perf_header__has_feat(self, HEADER_BUILD_ID)) { 439 if (perf_header__has_feat(self, HEADER_BUILD_ID)) {
441 struct perf_file_section *buildid_sec; 440 struct perf_file_section *buildid_sec;
442 441
diff --git a/tools/perf/util/parse-events.h b/tools/perf/util/parse-events.h
index b8c1f64bc935..fc4ab3fe877a 100644
--- a/tools/perf/util/parse-events.h
+++ b/tools/perf/util/parse-events.h
@@ -13,6 +13,7 @@ struct tracepoint_path {
13}; 13};
14 14
15extern struct tracepoint_path *tracepoint_id_to_path(u64 config); 15extern struct tracepoint_path *tracepoint_id_to_path(u64 config);
16extern bool have_tracepoints(struct perf_event_attr *pattrs, int nb_events);
16 17
17extern int nr_counters; 18extern int nr_counters;
18 19
diff --git a/tools/perf/util/trace-event-info.c b/tools/perf/util/trace-event-info.c
index 30cd9b575953..0a1fb9d4f3b6 100644
--- a/tools/perf/util/trace-event-info.c
+++ b/tools/perf/util/trace-event-info.c
@@ -487,6 +487,11 @@ get_tracepoints_path(struct perf_event_attr *pattrs, int nb_events)
487 return nr_tracepoints > 0 ? path.next : NULL; 487 return nr_tracepoints > 0 ? path.next : NULL;
488} 488}
489 489
490bool have_tracepoints(struct perf_event_attr *pattrs, int nb_events)
491{
492 return get_tracepoints_path(pattrs, nb_events) ? true : false;
493}
494
490int read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events) 495int read_tracing_data(int fd, struct perf_event_attr *pattrs, int nb_events)
491{ 496{
492 char buf[BUFSIZ]; 497 char buf[BUFSIZ];