aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/builtin-buildid-list.c35
-rw-r--r--tools/perf/util/symbol.c11
-rw-r--r--tools/perf/util/symbol.h3
3 files changed, 43 insertions, 6 deletions
diff --git a/tools/perf/builtin-buildid-list.c b/tools/perf/builtin-buildid-list.c
index 4229c2c213cc..431f204bde64 100644
--- a/tools/perf/builtin-buildid-list.c
+++ b/tools/perf/builtin-buildid-list.c
@@ -16,6 +16,7 @@
16 16
17static char const *input_name = "perf.data"; 17static char const *input_name = "perf.data";
18static int force; 18static int force;
19static bool with_hits;
19 20
20static const char * const buildid_list_usage[] = { 21static const char * const buildid_list_usage[] = {
21 "perf buildid-list [<options>]", 22 "perf buildid-list [<options>]",
@@ -23,6 +24,7 @@ static const char * const buildid_list_usage[] = {
23}; 24};
24 25
25static const struct option options[] = { 26static const struct option options[] = {
27 OPT_BOOLEAN('H', "with-hits", &with_hits, "Show only DSOs with hits"),
26 OPT_STRING('i', "input", &input_name, "file", 28 OPT_STRING('i', "input", &input_name, "file",
27 "input file name"), 29 "input file name"),
28 OPT_BOOLEAN('f', "force", &force, "don't complain, do it"), 30 OPT_BOOLEAN('f', "force", &force, "don't complain, do it"),
@@ -31,6 +33,34 @@ static const struct option options[] = {
31 OPT_END() 33 OPT_END()
32}; 34};
33 35
36static int build_id_list__process_event(event_t *event,
37 struct perf_session *session)
38{
39 struct addr_location al;
40 u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
41 struct thread *thread = perf_session__findnew(session, event->ip.pid);
42
43 if (thread == NULL) {
44 pr_err("problem processing %d event, skipping it.\n",
45 event->header.type);
46 return -1;
47 }
48
49 thread__find_addr_map(thread, session, cpumode, MAP__FUNCTION,
50 event->ip.ip, &al);
51
52 if (al.map != NULL)
53 al.map->dso->hit = 1;
54
55 return 0;
56}
57
58static struct perf_event_ops build_id_list__event_ops = {
59 .sample = build_id_list__process_event,
60 .mmap = event__process_mmap,
61 .fork = event__process_task,
62};
63
34static int __cmd_buildid_list(void) 64static int __cmd_buildid_list(void)
35{ 65{
36 int err = -1; 66 int err = -1;
@@ -40,7 +70,10 @@ static int __cmd_buildid_list(void)
40 if (session == NULL) 70 if (session == NULL)
41 return -1; 71 return -1;
42 72
43 dsos__fprintf_buildid(stdout); 73 if (with_hits)
74 perf_session__process_events(session, &build_id_list__event_ops);
75
76 dsos__fprintf_buildid(stdout, with_hits);
44 77
45 perf_session__delete(session); 78 perf_session__delete(session);
46 return err; 79 return err;
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c
index 4267138c7bbe..a4e745934584 100644
--- a/tools/perf/util/symbol.c
+++ b/tools/perf/util/symbol.c
@@ -1716,22 +1716,25 @@ void dsos__fprintf(FILE *fp)
1716 __dsos__fprintf(&dsos__user, fp); 1716 __dsos__fprintf(&dsos__user, fp);
1717} 1717}
1718 1718
1719static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp) 1719static size_t __dsos__fprintf_buildid(struct list_head *head, FILE *fp,
1720 bool with_hits)
1720{ 1721{
1721 struct dso *pos; 1722 struct dso *pos;
1722 size_t ret = 0; 1723 size_t ret = 0;
1723 1724
1724 list_for_each_entry(pos, head, node) { 1725 list_for_each_entry(pos, head, node) {
1726 if (with_hits && !pos->hit)
1727 continue;
1725 ret += dso__fprintf_buildid(pos, fp); 1728 ret += dso__fprintf_buildid(pos, fp);
1726 ret += fprintf(fp, " %s\n", pos->long_name); 1729 ret += fprintf(fp, " %s\n", pos->long_name);
1727 } 1730 }
1728 return ret; 1731 return ret;
1729} 1732}
1730 1733
1731size_t dsos__fprintf_buildid(FILE *fp) 1734size_t dsos__fprintf_buildid(FILE *fp, bool with_hits)
1732{ 1735{
1733 return (__dsos__fprintf_buildid(&dsos__kernel, fp) + 1736 return (__dsos__fprintf_buildid(&dsos__kernel, fp, with_hits) +
1734 __dsos__fprintf_buildid(&dsos__user, fp)); 1737 __dsos__fprintf_buildid(&dsos__user, fp, with_hits));
1735} 1738}
1736 1739
1737static struct dso *dsos__create_kernel(const char *vmlinux) 1740static struct dso *dsos__create_kernel(const char *vmlinux)
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h
index 36b7c717f5ee..525085fd0735 100644
--- a/tools/perf/util/symbol.h
+++ b/tools/perf/util/symbol.h
@@ -97,6 +97,7 @@ struct dso {
97 u8 slen_calculated:1; 97 u8 slen_calculated:1;
98 u8 has_build_id:1; 98 u8 has_build_id:1;
99 u8 kernel:1; 99 u8 kernel:1;
100 u8 hit:1;
100 unsigned char origin; 101 unsigned char origin;
101 u8 sorted_by_name; 102 u8 sorted_by_name;
102 u8 loaded; 103 u8 loaded;
@@ -129,7 +130,7 @@ struct perf_session;
129int dso__load(struct dso *self, struct map *map, struct perf_session *session, 130int dso__load(struct dso *self, struct map *map, struct perf_session *session,
130 symbol_filter_t filter); 131 symbol_filter_t filter);
131void dsos__fprintf(FILE *fp); 132void dsos__fprintf(FILE *fp);
132size_t dsos__fprintf_buildid(FILE *fp); 133size_t dsos__fprintf_buildid(FILE *fp, bool with_hits);
133 134
134size_t dso__fprintf_buildid(struct dso *self, FILE *fp); 135size_t dso__fprintf_buildid(struct dso *self, FILE *fp);
135size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp); 136size_t dso__fprintf(struct dso *self, enum map_type type, FILE *fp);