diff options
-rw-r--r-- | tools/perf/builtin-annotate.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-diff.c | 9 | ||||
-rw-r--r-- | tools/perf/builtin-kmem.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-record.c | 6 | ||||
-rw-r--r-- | tools/perf/builtin-report.c | 73 | ||||
-rw-r--r-- | tools/perf/builtin-timechart.c | 4 | ||||
-rw-r--r-- | tools/perf/builtin-trace.c | 4 | ||||
-rw-r--r-- | tools/perf/util/symbol.c | 33 | ||||
-rw-r--r-- | tools/perf/util/symbol.h | 9 |
9 files changed, 89 insertions, 57 deletions
diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c index e656e25f1c14..645d58058431 100644 --- a/tools/perf/builtin-annotate.c +++ b/tools/perf/builtin-annotate.c | |||
@@ -518,14 +518,14 @@ static const struct option options[] = { | |||
518 | 518 | ||
519 | int cmd_annotate(int argc, const char **argv, const char *prefix __used) | 519 | int cmd_annotate(int argc, const char **argv, const char *prefix __used) |
520 | { | 520 | { |
521 | argc = parse_options(argc, argv, options, annotate_usage, 0); | ||
522 | |||
521 | symbol_conf.priv_size = sizeof(struct sym_priv); | 523 | symbol_conf.priv_size = sizeof(struct sym_priv); |
522 | symbol_conf.try_vmlinux_path = true; | 524 | symbol_conf.try_vmlinux_path = true; |
523 | 525 | ||
524 | if (symbol__init() < 0) | 526 | if (symbol__init() < 0) |
525 | return -1; | 527 | return -1; |
526 | 528 | ||
527 | argc = parse_options(argc, argv, options, annotate_usage, 0); | ||
528 | |||
529 | setup_sorting(annotate_usage, options); | 529 | setup_sorting(annotate_usage, options); |
530 | 530 | ||
531 | if (argc) { | 531 | if (argc) { |
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 67328d106994..4fde60655341 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c | |||
@@ -265,11 +265,6 @@ static const struct option options[] = { | |||
265 | 265 | ||
266 | int cmd_diff(int argc, const char **argv, const char *prefix __used) | 266 | int cmd_diff(int argc, const char **argv, const char *prefix __used) |
267 | { | 267 | { |
268 | if (symbol__init() < 0) | ||
269 | return -1; | ||
270 | |||
271 | setup_sorting(diff_usage, options); | ||
272 | |||
273 | argc = parse_options(argc, argv, options, diff_usage, 0); | 268 | argc = parse_options(argc, argv, options, diff_usage, 0); |
274 | if (argc) { | 269 | if (argc) { |
275 | if (argc > 2) | 270 | if (argc > 2) |
@@ -281,6 +276,10 @@ int cmd_diff(int argc, const char **argv, const char *prefix __used) | |||
281 | input_new = argv[0]; | 276 | input_new = argv[0]; |
282 | } | 277 | } |
283 | 278 | ||
279 | if (symbol__init() < 0) | ||
280 | return -1; | ||
281 | |||
282 | setup_sorting(diff_usage, options); | ||
284 | setup_pager(); | 283 | setup_pager(); |
285 | return __cmd_diff(); | 284 | return __cmd_diff(); |
286 | } | 285 | } |
diff --git a/tools/perf/builtin-kmem.c b/tools/perf/builtin-kmem.c index e078797ab1f1..fc21ad79dd83 100644 --- a/tools/perf/builtin-kmem.c +++ b/tools/perf/builtin-kmem.c | |||
@@ -766,13 +766,13 @@ static int __cmd_record(int argc, const char **argv) | |||
766 | 766 | ||
767 | int cmd_kmem(int argc, const char **argv, const char *prefix __used) | 767 | int cmd_kmem(int argc, const char **argv, const char *prefix __used) |
768 | { | 768 | { |
769 | symbol__init(); | ||
770 | |||
771 | argc = parse_options(argc, argv, kmem_options, kmem_usage, 0); | 769 | argc = parse_options(argc, argv, kmem_options, kmem_usage, 0); |
772 | 770 | ||
773 | if (!argc) | 771 | if (!argc) |
774 | usage_with_options(kmem_usage, kmem_options); | 772 | usage_with_options(kmem_usage, kmem_options); |
775 | 773 | ||
774 | symbol__init(); | ||
775 | |||
776 | if (!strncmp(argv[0], "rec", 3)) { | 776 | if (!strncmp(argv[0], "rec", 3)) { |
777 | return __cmd_record(argc, argv); | 777 | return __cmd_record(argc, argv); |
778 | } else if (!strcmp(argv[0], "stat")) { | 778 | } else if (!strcmp(argv[0], "stat")) { |
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 1da48a8fe9cc..65301c5ca1de 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -632,13 +632,13 @@ int cmd_record(int argc, const char **argv, const char *prefix __used) | |||
632 | { | 632 | { |
633 | int counter; | 633 | int counter; |
634 | 634 | ||
635 | symbol__init(); | ||
636 | |||
637 | argc = parse_options(argc, argv, options, record_usage, | 635 | argc = parse_options(argc, argv, options, record_usage, |
638 | PARSE_OPT_STOP_AT_NON_OPTION); | 636 | PARSE_OPT_STOP_AT_NON_OPTION); |
639 | if (!argc && target_pid == -1 && !system_wide) | 637 | if (!argc && target_pid == -1 && !system_wide) |
640 | usage_with_options(record_usage, options); | 638 | usage_with_options(record_usage, options); |
641 | 639 | ||
640 | symbol__init(); | ||
641 | |||
642 | if (!nr_counters) { | 642 | if (!nr_counters) { |
643 | nr_counters = 1; | 643 | nr_counters = 1; |
644 | attrs[0].type = PERF_TYPE_HARDWARE; | 644 | attrs[0].type = PERF_TYPE_HARDWARE; |
diff --git a/tools/perf/builtin-report.c b/tools/perf/builtin-report.c index c349bdbb9474..03afac3b56ef 100644 --- a/tools/perf/builtin-report.c +++ b/tools/perf/builtin-report.c | |||
@@ -33,10 +33,6 @@ | |||
33 | 33 | ||
34 | static char const *input_name = "perf.data"; | 34 | static char const *input_name = "perf.data"; |
35 | 35 | ||
36 | static char *dso_list_str, *comm_list_str, *sym_list_str, | ||
37 | *col_width_list_str; | ||
38 | static struct strlist *dso_list, *comm_list, *sym_list; | ||
39 | |||
40 | static int force; | 36 | static int force; |
41 | static bool use_callchain; | 37 | static bool use_callchain; |
42 | 38 | ||
@@ -365,8 +361,9 @@ static size_t hist_entry__fprintf(FILE *fp, struct hist_entry *self, | |||
365 | 361 | ||
366 | static void dso__calc_col_width(struct dso *self) | 362 | static void dso__calc_col_width(struct dso *self) |
367 | { | 363 | { |
368 | if (!col_width_list_str && !field_sep && | 364 | if (!symbol_conf.col_width_list_str && !field_sep && |
369 | (!dso_list || strlist__has_entry(dso_list, self->name))) { | 365 | (!symbol_conf.dso_list || |
366 | strlist__has_entry(symbol_conf.dso_list, self->name))) { | ||
370 | unsigned int slen = strlen(self->name); | 367 | unsigned int slen = strlen(self->name); |
371 | if (slen > dsos__col_width) | 368 | if (slen > dsos__col_width) |
372 | dsos__col_width = slen; | 369 | dsos__col_width = slen; |
@@ -379,8 +376,9 @@ static void thread__comm_adjust(struct thread *self) | |||
379 | { | 376 | { |
380 | char *comm = self->comm; | 377 | char *comm = self->comm; |
381 | 378 | ||
382 | if (!col_width_list_str && !field_sep && | 379 | if (!symbol_conf.col_width_list_str && !field_sep && |
383 | (!comm_list || strlist__has_entry(comm_list, comm))) { | 380 | (!symbol_conf.comm_list || |
381 | strlist__has_entry(symbol_conf.comm_list, comm))) { | ||
384 | unsigned int slen = strlen(comm); | 382 | unsigned int slen = strlen(comm); |
385 | 383 | ||
386 | if (slen > comms__col_width) { | 384 | if (slen > comms__col_width) { |
@@ -442,7 +440,7 @@ static size_t perf_session__fprintf_hist_entries(struct perf_session *self, | |||
442 | struct rb_node *nd; | 440 | struct rb_node *nd; |
443 | size_t ret = 0; | 441 | size_t ret = 0; |
444 | unsigned int width; | 442 | unsigned int width; |
445 | char *col_width = col_width_list_str; | 443 | char *col_width = symbol_conf.col_width_list_str; |
446 | int raw_printing_style; | 444 | int raw_printing_style; |
447 | 445 | ||
448 | raw_printing_style = !strcmp(pretty_printing_style, "raw"); | 446 | raw_printing_style = !strcmp(pretty_printing_style, "raw"); |
@@ -468,7 +466,7 @@ static size_t perf_session__fprintf_hist_entries(struct perf_session *self, | |||
468 | } | 466 | } |
469 | width = strlen(se->header); | 467 | width = strlen(se->header); |
470 | if (se->width) { | 468 | if (se->width) { |
471 | if (col_width_list_str) { | 469 | if (symbol_conf.col_width_list_str) { |
472 | if (col_width) { | 470 | if (col_width) { |
473 | *se->width = atoi(col_width); | 471 | *se->width = atoi(col_width); |
474 | col_width = strchr(col_width, ','); | 472 | col_width = strchr(col_width, ','); |
@@ -587,7 +585,8 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
587 | 585 | ||
588 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); | 586 | dump_printf(" ... thread: %s:%d\n", thread->comm, thread->pid); |
589 | 587 | ||
590 | if (comm_list && !strlist__has_entry(comm_list, thread->comm)) | 588 | if (symbol_conf.comm_list && |
589 | !strlist__has_entry(symbol_conf.comm_list, thread->comm)) | ||
591 | return 0; | 590 | return 0; |
592 | 591 | ||
593 | cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; | 592 | cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK; |
@@ -601,14 +600,15 @@ static int process_sample_event(event_t *event, struct perf_session *session) | |||
601 | if (al.map && !sort_dso.elide && !al.map->dso->slen_calculated) | 600 | if (al.map && !sort_dso.elide && !al.map->dso->slen_calculated) |
602 | dso__calc_col_width(al.map->dso); | 601 | dso__calc_col_width(al.map->dso); |
603 | 602 | ||
604 | if (dso_list && | 603 | if (symbol_conf.dso_list && |
605 | (!al.map || !al.map->dso || | 604 | (!al.map || !al.map->dso || |
606 | !(strlist__has_entry(dso_list, al.map->dso->short_name) || | 605 | !(strlist__has_entry(symbol_conf.dso_list, al.map->dso->short_name) || |
607 | (al.map->dso->short_name != al.map->dso->long_name && | 606 | (al.map->dso->short_name != al.map->dso->long_name && |
608 | strlist__has_entry(dso_list, al.map->dso->long_name))))) | 607 | strlist__has_entry(symbol_conf.dso_list, al.map->dso->long_name))))) |
609 | return 0; | 608 | return 0; |
610 | 609 | ||
611 | if (sym_list && al.sym && !strlist__has_entry(sym_list, al.sym->name)) | 610 | if (symbol_conf.sym_list && al.sym && |
611 | !strlist__has_entry(symbol_conf.sym_list, al.sym->name)) | ||
612 | return 0; | 612 | return 0; |
613 | 613 | ||
614 | if (perf_session__add_hist_entry(session, &al, data.callchain, data.period)) { | 614 | if (perf_session__add_hist_entry(session, &al, data.callchain, data.period)) { |
@@ -825,13 +825,13 @@ static const struct option options[] = { | |||
825 | OPT_CALLBACK_DEFAULT('g', "call-graph", NULL, "output_type,min_percent", | 825 | OPT_CALLBACK_DEFAULT('g', "call-graph", NULL, "output_type,min_percent", |
826 | "Display callchains using output_type and min percent threshold. " | 826 | "Display callchains using output_type and min percent threshold. " |
827 | "Default: fractal,0.5", &parse_callchain_opt, callchain_default_opt), | 827 | "Default: fractal,0.5", &parse_callchain_opt, callchain_default_opt), |
828 | OPT_STRING('d', "dsos", &dso_list_str, "dso[,dso...]", | 828 | OPT_STRING('d', "dsos", &symbol_conf.dso_list_str, "dso[,dso...]", |
829 | "only consider symbols in these dsos"), | 829 | "only consider symbols in these dsos"), |
830 | OPT_STRING('C', "comms", &comm_list_str, "comm[,comm...]", | 830 | OPT_STRING('C', "comms", &symbol_conf.comm_list_str, "comm[,comm...]", |
831 | "only consider symbols in these comms"), | 831 | "only consider symbols in these comms"), |
832 | OPT_STRING('S', "symbols", &sym_list_str, "symbol[,symbol...]", | 832 | OPT_STRING('S', "symbols", &symbol_conf.sym_list_str, "symbol[,symbol...]", |
833 | "only consider these symbols"), | 833 | "only consider these symbols"), |
834 | OPT_STRING('w', "column-widths", &col_width_list_str, | 834 | OPT_STRING('w', "column-widths", &symbol_conf.col_width_list_str, |
835 | "width[,width...]", | 835 | "width[,width...]", |
836 | "don't try to adjust column width, use these fixed values"), | 836 | "don't try to adjust column width, use these fixed values"), |
837 | OPT_STRING('t', "field-separator", &field_sep, "separator", | 837 | OPT_STRING('t', "field-separator", &field_sep, "separator", |
@@ -840,32 +840,25 @@ static const struct option options[] = { | |||
840 | OPT_END() | 840 | OPT_END() |
841 | }; | 841 | }; |
842 | 842 | ||
843 | static void setup_list(struct strlist **list, const char *list_str, | 843 | static void sort_entry__setup_elide(struct sort_entry *self, |
844 | struct sort_entry *se, const char *list_name, | 844 | struct strlist *list, |
845 | FILE *fp) | 845 | const char *list_name, FILE *fp) |
846 | { | 846 | { |
847 | if (list_str) { | 847 | if (list && strlist__nr_entries(list) == 1) { |
848 | *list = strlist__new(true, list_str); | 848 | fprintf(fp, "# %s: %s\n", list_name, strlist__entry(list, 0)->s); |
849 | if (!*list) { | 849 | self->elide = true; |
850 | fprintf(stderr, "problems parsing %s list\n", | ||
851 | list_name); | ||
852 | exit(129); | ||
853 | } | ||
854 | if (strlist__nr_entries(*list) == 1) { | ||
855 | fprintf(fp, "# %s: %s\n", list_name, | ||
856 | strlist__entry(*list, 0)->s); | ||
857 | se->elide = true; | ||
858 | } | ||
859 | } | 850 | } |
860 | } | 851 | } |
861 | 852 | ||
862 | int cmd_report(int argc, const char **argv, const char *prefix __used) | 853 | int cmd_report(int argc, const char **argv, const char *prefix __used) |
863 | { | 854 | { |
855 | argc = parse_options(argc, argv, options, report_usage, 0); | ||
856 | |||
857 | setup_pager(); | ||
858 | |||
864 | if (symbol__init() < 0) | 859 | if (symbol__init() < 0) |
865 | return -1; | 860 | return -1; |
866 | 861 | ||
867 | argc = parse_options(argc, argv, options, report_usage, 0); | ||
868 | |||
869 | setup_sorting(report_usage, options); | 862 | setup_sorting(report_usage, options); |
870 | 863 | ||
871 | if (parent_pattern != default_parent_pattern) { | 864 | if (parent_pattern != default_parent_pattern) { |
@@ -880,11 +873,9 @@ int cmd_report(int argc, const char **argv, const char *prefix __used) | |||
880 | if (argc) | 873 | if (argc) |
881 | usage_with_options(report_usage, options); | 874 | usage_with_options(report_usage, options); |
882 | 875 | ||
883 | setup_pager(); | 876 | sort_entry__setup_elide(&sort_dso, symbol_conf.dso_list, "dso", stdout); |
884 | 877 | sort_entry__setup_elide(&sort_comm, symbol_conf.comm_list, "comm", stdout); | |
885 | setup_list(&dso_list, dso_list_str, &sort_dso, "dso", stdout); | 878 | sort_entry__setup_elide(&sort_sym, symbol_conf.sym_list, "symbol", stdout); |
886 | setup_list(&comm_list, comm_list_str, &sort_comm, "comm", stdout); | ||
887 | setup_list(&sym_list, sym_list_str, &sort_sym, "symbol", stdout); | ||
888 | 879 | ||
889 | if (field_sep && *field_sep == '.') { | 880 | if (field_sep && *field_sep == '.') { |
890 | fputs("'.' is the only non valid --field-separator argument\n", | 881 | fputs("'.' is the only non valid --field-separator argument\n", |
diff --git a/tools/perf/builtin-timechart.c b/tools/perf/builtin-timechart.c index 9c98b7a2b19a..a589a43112d6 100644 --- a/tools/perf/builtin-timechart.c +++ b/tools/perf/builtin-timechart.c | |||
@@ -1137,11 +1137,11 @@ static const struct option options[] = { | |||
1137 | 1137 | ||
1138 | int cmd_timechart(int argc, const char **argv, const char *prefix __used) | 1138 | int cmd_timechart(int argc, const char **argv, const char *prefix __used) |
1139 | { | 1139 | { |
1140 | symbol__init(); | ||
1141 | |||
1142 | argc = parse_options(argc, argv, options, timechart_usage, | 1140 | argc = parse_options(argc, argv, options, timechart_usage, |
1143 | PARSE_OPT_STOP_AT_NON_OPTION); | 1141 | PARSE_OPT_STOP_AT_NON_OPTION); |
1144 | 1142 | ||
1143 | symbol__init(); | ||
1144 | |||
1145 | if (argc && !strncmp(argv[0], "rec", 3)) | 1145 | if (argc && !strncmp(argv[0], "rec", 3)) |
1146 | return __cmd_record(argc, argv); | 1146 | return __cmd_record(argc, argv); |
1147 | else if (argc) | 1147 | else if (argc) |
diff --git a/tools/perf/builtin-trace.c b/tools/perf/builtin-trace.c index 07ad25ca654f..e2285e28720f 100644 --- a/tools/perf/builtin-trace.c +++ b/tools/perf/builtin-trace.c | |||
@@ -579,13 +579,13 @@ int cmd_trace(int argc, const char **argv, const char *prefix __used) | |||
579 | exit(-1); | 579 | exit(-1); |
580 | } | 580 | } |
581 | 581 | ||
582 | symbol__init(); | ||
583 | |||
584 | setup_scripting(); | 582 | setup_scripting(); |
585 | 583 | ||
586 | argc = parse_options(argc, argv, options, annotate_usage, | 584 | argc = parse_options(argc, argv, options, annotate_usage, |
587 | PARSE_OPT_STOP_AT_NON_OPTION); | 585 | PARSE_OPT_STOP_AT_NON_OPTION); |
588 | 586 | ||
587 | if (symbol__init() < 0) | ||
588 | return -1; | ||
589 | setup_pager(); | 589 | setup_pager(); |
590 | 590 | ||
591 | session = perf_session__new(input_name, O_RDONLY, 0); | 591 | session = perf_session__new(input_name, O_RDONLY, 0); |
diff --git a/tools/perf/util/symbol.c b/tools/perf/util/symbol.c index 17ce01269a91..164286ace7df 100644 --- a/tools/perf/util/symbol.c +++ b/tools/perf/util/symbol.c | |||
@@ -1,6 +1,7 @@ | |||
1 | #include "util.h" | 1 | #include "util.h" |
2 | #include "../perf.h" | 2 | #include "../perf.h" |
3 | #include "session.h" | 3 | #include "session.h" |
4 | #include "sort.h" | ||
4 | #include "string.h" | 5 | #include "string.h" |
5 | #include "symbol.h" | 6 | #include "symbol.h" |
6 | #include "thread.h" | 7 | #include "thread.h" |
@@ -1739,6 +1740,20 @@ out_fail: | |||
1739 | return -1; | 1740 | return -1; |
1740 | } | 1741 | } |
1741 | 1742 | ||
1743 | static int setup_list(struct strlist **list, const char *list_str, | ||
1744 | const char *list_name) | ||
1745 | { | ||
1746 | if (list_str == NULL) | ||
1747 | return 0; | ||
1748 | |||
1749 | *list = strlist__new(true, list_str); | ||
1750 | if (!*list) { | ||
1751 | pr_err("problems parsing %s list\n", list_name); | ||
1752 | return -1; | ||
1753 | } | ||
1754 | return 0; | ||
1755 | } | ||
1756 | |||
1742 | int symbol__init(void) | 1757 | int symbol__init(void) |
1743 | { | 1758 | { |
1744 | elf_version(EV_CURRENT); | 1759 | elf_version(EV_CURRENT); |
@@ -1749,7 +1764,25 @@ int symbol__init(void) | |||
1749 | if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0) | 1764 | if (symbol_conf.try_vmlinux_path && vmlinux_path__init() < 0) |
1750 | return -1; | 1765 | return -1; |
1751 | 1766 | ||
1767 | if (setup_list(&symbol_conf.dso_list, | ||
1768 | symbol_conf.dso_list_str, "dso") < 0) | ||
1769 | return -1; | ||
1770 | |||
1771 | if (setup_list(&symbol_conf.comm_list, | ||
1772 | symbol_conf.comm_list_str, "comm") < 0) | ||
1773 | goto out_free_dso_list; | ||
1774 | |||
1775 | if (setup_list(&symbol_conf.sym_list, | ||
1776 | symbol_conf.sym_list_str, "symbol") < 0) | ||
1777 | goto out_free_comm_list; | ||
1778 | |||
1752 | return 0; | 1779 | return 0; |
1780 | |||
1781 | out_free_dso_list: | ||
1782 | strlist__delete(symbol_conf.dso_list); | ||
1783 | out_free_comm_list: | ||
1784 | strlist__delete(symbol_conf.comm_list); | ||
1785 | return -1; | ||
1753 | } | 1786 | } |
1754 | 1787 | ||
1755 | int perf_session__create_kernel_maps(struct perf_session *self) | 1788 | int perf_session__create_kernel_maps(struct perf_session *self) |
diff --git a/tools/perf/util/symbol.h b/tools/perf/util/symbol.h index 766294735f93..d61f35074997 100644 --- a/tools/perf/util/symbol.h +++ b/tools/perf/util/symbol.h | |||
@@ -49,12 +49,21 @@ struct symbol { | |||
49 | char name[0]; | 49 | char name[0]; |
50 | }; | 50 | }; |
51 | 51 | ||
52 | struct strlist; | ||
53 | |||
52 | struct symbol_conf { | 54 | struct symbol_conf { |
53 | unsigned short priv_size; | 55 | unsigned short priv_size; |
54 | bool try_vmlinux_path, | 56 | bool try_vmlinux_path, |
55 | use_modules, | 57 | use_modules, |
56 | sort_by_name; | 58 | sort_by_name; |
57 | const char *vmlinux_name; | 59 | const char *vmlinux_name; |
60 | char *dso_list_str, | ||
61 | *comm_list_str, | ||
62 | *sym_list_str, | ||
63 | *col_width_list_str; | ||
64 | struct strlist *dso_list, | ||
65 | *comm_list, | ||
66 | *sym_list; | ||
58 | }; | 67 | }; |
59 | 68 | ||
60 | extern struct symbol_conf symbol_conf; | 69 | extern struct symbol_conf symbol_conf; |