diff options
-rw-r--r-- | tools/perf/builtin-record.c | 14 | ||||
-rw-r--r-- | tools/perf/util/header.c | 11 | ||||
-rw-r--r-- | tools/perf/util/header.h | 1 | ||||
-rw-r--r-- | tools/perf/util/include/linux/bitops.h | 5 |
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; | |||
61 | static bool no_samples = false; | 61 | static bool no_samples = false; |
62 | static bool sample_address = false; | 62 | static bool sample_address = false; |
63 | static bool no_buildid = false; | 63 | static bool no_buildid = false; |
64 | static bool no_buildid_cache = false; | ||
64 | 65 | ||
65 | static long samples = 0; | 66 | static long samples = 0; |
66 | static u64 bytes_written = 0; | 67 | static 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 | ||
155 | void perf_header__clear_feat(struct perf_header *self, int feat) | ||
156 | { | ||
157 | clear_bit(feat, self->adds_features); | ||
158 | } | ||
159 | |||
155 | bool perf_header__has_feat(const struct perf_header *self, int feat) | 160 | bool 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); | |||
84 | struct perf_event_attr * | 84 | struct perf_event_attr * |
85 | perf_header__find_attr(u64 id, struct perf_header *header); | 85 | perf_header__find_attr(u64 id, struct perf_header *header); |
86 | void perf_header__set_feat(struct perf_header *self, int feat); | 86 | void perf_header__set_feat(struct perf_header *self, int feat); |
87 | void perf_header__clear_feat(struct perf_header *self, int feat); | ||
87 | bool perf_header__has_feat(const struct perf_header *self, int feat); | 88 | bool perf_header__has_feat(const struct perf_header *self, int feat); |
88 | 89 | ||
89 | int perf_header__process_sections(struct perf_header *self, int fd, | 90 | int 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 | ||
16 | static inline void clear_bit(int nr, unsigned long *addr) | ||
17 | { | ||
18 | addr[nr / BITS_PER_LONG] &= ~(1UL << (nr % BITS_PER_LONG)); | ||
19 | } | ||
20 | |||
16 | static __always_inline int test_bit(unsigned int nr, const unsigned long *addr) | 21 | static __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)) & |