aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
authorArnaldo Carvalho de Melo <acme@redhat.com>2010-11-26 16:39:15 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2010-11-26 16:39:15 -0500
commitbaa2f6cedbfae962f04281a31f08ec29667d31a0 (patch)
tree6a644f86e234a03bf99518b76daec138016e3bca /tools/perf
parentaf86da5318136eb49c0453c2e2be3280ee5d18d9 (diff)
perf record: Add option to disable collecting build-ids
Collecting build-ids for long running sessions may take a long time because it needs to traverse the whole just collected perf.data stream of events, marking the DSOs that had hits and then looking for the .note.gnu.build-id ELF section. For things like the 'trace' tool that records and right away consumes the data on systems where its unlikely that the DSOs being monitored will change while 'trace' runs, it is desirable to remove build id collection, so add a -B/--no-buildid option to perf record to allow such use case. Longer term we'll avoid all this if we, at DSO load time, in the kernel, take advantage of this slow code path to collect the build-id and stash it somewhere, so that we can insert it in the PERF_RECORD_MMAP event. Reported-by: Thomas Gleixner <tglx@linutronix.de> Cc: Frederic Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Paul Mackerras <paulus@samba.org> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Stephane Eranian <eranian@google.com> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: Tom Zanussi <tzanussi@gmail.com> LKML-Reference: <new-submission> Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/builtin-record.c14
-rw-r--r--tools/perf/util/header.c11
-rw-r--r--tools/perf/util/header.h1
-rw-r--r--tools/perf/util/include/linux/bitops.h5
4 files changed, 26 insertions, 5 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c
index 3d2cb4899807..024e1441d76b 100644
--- a/tools/perf/builtin-record.c
+++ b/tools/perf/builtin-record.c
@@ -61,6 +61,7 @@ static bool inherit_stat = false;
61static bool no_samples = false; 61static bool no_samples = false;
62static bool sample_address = false; 62static bool sample_address = false;
63static bool no_buildid = false; 63static bool no_buildid = false;
64static bool no_buildid_cache = false;
64 65
65static long samples = 0; 66static long samples = 0;
66static u64 bytes_written = 0; 67static u64 bytes_written = 0;
@@ -437,7 +438,8 @@ static void atexit_header(void)
437 if (!pipe_output) { 438 if (!pipe_output) {
438 session->header.data_size += bytes_written; 439 session->header.data_size += bytes_written;
439 440
440 process_buildids(); 441 if (!no_buildid)
442 process_buildids();
441 perf_header__write(&session->header, output, true); 443 perf_header__write(&session->header, output, true);
442 perf_session__delete(session); 444 perf_session__delete(session);
443 symbol__exit(); 445 symbol__exit();
@@ -557,6 +559,9 @@ static int __cmd_record(int argc, const char **argv)
557 return -1; 559 return -1;
558 } 560 }
559 561
562 if (!no_buildid)
563 perf_header__set_feat(&session->header, HEADER_BUILD_ID);
564
560 if (!file_new) { 565 if (!file_new) {
561 err = perf_header__read(session, output); 566 err = perf_header__read(session, output);
562 if (err < 0) 567 if (err < 0)
@@ -831,8 +836,10 @@ const struct option record_options[] = {
831 "Sample addresses"), 836 "Sample addresses"),
832 OPT_BOOLEAN('n', "no-samples", &no_samples, 837 OPT_BOOLEAN('n', "no-samples", &no_samples,
833 "don't sample"), 838 "don't sample"),
834 OPT_BOOLEAN('N', "no-buildid-cache", &no_buildid, 839 OPT_BOOLEAN('N', "no-buildid-cache", &no_buildid_cache,
835 "do not update the buildid cache"), 840 "do not update the buildid cache"),
841 OPT_BOOLEAN('B', "no-buildid", &no_buildid,
842 "do not collect buildids in perf.data"),
836 OPT_END() 843 OPT_END()
837}; 844};
838 845
@@ -857,7 +864,8 @@ int cmd_record(int argc, const char **argv, const char *prefix __used)
857 } 864 }
858 865
859 symbol__init(); 866 symbol__init();
860 if (no_buildid) 867
868 if (no_buildid_cache || no_buildid)
861 disable_buildid_cache(); 869 disable_buildid_cache();
862 870
863 if (!nr_counters) { 871 if (!nr_counters) {
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index d7e67b167ea3..f65d7dc127b6 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -152,6 +152,11 @@ void perf_header__set_feat(struct perf_header *self, int feat)
152 set_bit(feat, self->adds_features); 152 set_bit(feat, self->adds_features);
153} 153}
154 154
155void perf_header__clear_feat(struct perf_header *self, int feat)
156{
157 clear_bit(feat, self->adds_features);
158}
159
155bool perf_header__has_feat(const struct perf_header *self, int feat) 160bool perf_header__has_feat(const struct perf_header *self, int feat)
156{ 161{
157 return test_bit(feat, self->adds_features); 162 return test_bit(feat, self->adds_features);
@@ -431,8 +436,10 @@ static int perf_header__adds_write(struct perf_header *self, int fd)
431 int idx = 0, err; 436 int idx = 0, err;
432 437
433 session = container_of(self, struct perf_session, header); 438 session = container_of(self, struct perf_session, header);
434 if (perf_session__read_build_ids(session, true)) 439
435 perf_header__set_feat(self, HEADER_BUILD_ID); 440 if (perf_header__has_feat(self, HEADER_BUILD_ID &&
441 !perf_session__read_build_ids(session, true)))
442 perf_header__clear_feat(self, HEADER_BUILD_ID);
436 443
437 nr_sections = bitmap_weight(self->adds_features, HEADER_FEAT_BITS); 444 nr_sections = bitmap_weight(self->adds_features, HEADER_FEAT_BITS);
438 if (!nr_sections) 445 if (!nr_sections)
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h
index 402ac2454cf8..ed550bffd655 100644
--- a/tools/perf/util/header.h
+++ b/tools/perf/util/header.h
@@ -84,6 +84,7 @@ u64 perf_header__sample_type(struct perf_header *header);
84struct perf_event_attr * 84struct perf_event_attr *
85perf_header__find_attr(u64 id, struct perf_header *header); 85perf_header__find_attr(u64 id, struct perf_header *header);
86void perf_header__set_feat(struct perf_header *self, int feat); 86void perf_header__set_feat(struct perf_header *self, int feat);
87void perf_header__clear_feat(struct perf_header *self, int feat);
87bool perf_header__has_feat(const struct perf_header *self, int feat); 88bool perf_header__has_feat(const struct perf_header *self, int feat);
88 89
89int perf_header__process_sections(struct perf_header *self, int fd, 90int perf_header__process_sections(struct perf_header *self, int fd,
diff --git a/tools/perf/util/include/linux/bitops.h b/tools/perf/util/include/linux/bitops.h
index bb4ac2e05385..8be0b968ca0b 100644
--- a/tools/perf/util/include/linux/bitops.h
+++ b/tools/perf/util/include/linux/bitops.h
@@ -13,6 +13,11 @@ static inline void set_bit(int nr, unsigned long *addr)
13 addr[nr / BITS_PER_LONG] |= 1UL << (nr % BITS_PER_LONG); 13 addr[nr / BITS_PER_LONG] |= 1UL << (nr % BITS_PER_LONG);
14} 14}
15 15
16static inline void clear_bit(int nr, unsigned long *addr)
17{
18 addr[nr / BITS_PER_LONG] &= ~(1UL << (nr % BITS_PER_LONG));
19}
20
16static __always_inline int test_bit(unsigned int nr, const unsigned long *addr) 21static __always_inline int test_bit(unsigned int nr, const unsigned long *addr)
17{ 22{
18 return ((1UL << (nr % BITS_PER_LONG)) & 23 return ((1UL << (nr % BITS_PER_LONG)) &