diff options
| author | Ingo Molnar <mingo@kernel.org> | 2015-01-08 02:59:22 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2015-01-08 02:59:22 -0500 |
| commit | ed9eb845d7916b2bc863e5b93c82e18be8faf032 (patch) | |
| tree | ebe481d3b6ff539f6e9837426bf472b0296521e2 /tools | |
| parent | 5b5e76218fbdbb71a01d5480f289ead624232876 (diff) | |
| parent | e7024fc3783317608b8e07048116a72a7d1cd26d (diff) | |
Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
Pull perf/urgent fixes from Arnaldo Carvalho de Melo:
"
- 'perf probe' should fall back to find probe point in symbols when failing
to do so in a debuginfo file (Masami Hiramatsu)
- Fix 'perf probe' crash in dwarf_getcfi_elf (Namhyung Kim)
- Fix shell completion with 'perf list' --raw-dump option (Taesoo Kim)
- Fix 'perf diff' to sort by baseline field by default (Namhyung Kim)
"
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools')
| -rw-r--r-- | tools/perf/builtin-diff.c | 44 | ||||
| -rw-r--r-- | tools/perf/builtin-list.c | 13 | ||||
| -rw-r--r-- | tools/perf/util/probe-event.c | 6 | ||||
| -rw-r--r-- | tools/perf/util/probe-finder.c | 18 |
4 files changed, 75 insertions, 6 deletions
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c index 303c1e151dcf..1fd96c13f199 100644 --- a/tools/perf/builtin-diff.c +++ b/tools/perf/builtin-diff.c | |||
| @@ -545,6 +545,42 @@ hist_entry__cmp_compute(struct hist_entry *left, struct hist_entry *right, | |||
| 545 | return __hist_entry__cmp_compute(p_left, p_right, c); | 545 | return __hist_entry__cmp_compute(p_left, p_right, c); |
| 546 | } | 546 | } |
| 547 | 547 | ||
| 548 | static int64_t | ||
| 549 | hist_entry__cmp_nop(struct hist_entry *left __maybe_unused, | ||
| 550 | struct hist_entry *right __maybe_unused) | ||
| 551 | { | ||
| 552 | return 0; | ||
| 553 | } | ||
| 554 | |||
| 555 | static int64_t | ||
| 556 | hist_entry__cmp_baseline(struct hist_entry *left, struct hist_entry *right) | ||
| 557 | { | ||
| 558 | if (sort_compute) | ||
| 559 | return 0; | ||
| 560 | |||
| 561 | if (left->stat.period == right->stat.period) | ||
| 562 | return 0; | ||
| 563 | return left->stat.period > right->stat.period ? 1 : -1; | ||
| 564 | } | ||
| 565 | |||
| 566 | static int64_t | ||
| 567 | hist_entry__cmp_delta(struct hist_entry *left, struct hist_entry *right) | ||
| 568 | { | ||
| 569 | return hist_entry__cmp_compute(right, left, COMPUTE_DELTA); | ||
| 570 | } | ||
| 571 | |||
| 572 | static int64_t | ||
| 573 | hist_entry__cmp_ratio(struct hist_entry *left, struct hist_entry *right) | ||
| 574 | { | ||
| 575 | return hist_entry__cmp_compute(right, left, COMPUTE_RATIO); | ||
| 576 | } | ||
| 577 | |||
| 578 | static int64_t | ||
| 579 | hist_entry__cmp_wdiff(struct hist_entry *left, struct hist_entry *right) | ||
| 580 | { | ||
| 581 | return hist_entry__cmp_compute(right, left, COMPUTE_WEIGHTED_DIFF); | ||
| 582 | } | ||
| 583 | |||
| 548 | static void insert_hist_entry_by_compute(struct rb_root *root, | 584 | static void insert_hist_entry_by_compute(struct rb_root *root, |
| 549 | struct hist_entry *he, | 585 | struct hist_entry *he, |
| 550 | int c) | 586 | int c) |
| @@ -1038,27 +1074,35 @@ static void data__hpp_register(struct data__file *d, int idx) | |||
| 1038 | fmt->header = hpp__header; | 1074 | fmt->header = hpp__header; |
| 1039 | fmt->width = hpp__width; | 1075 | fmt->width = hpp__width; |
| 1040 | fmt->entry = hpp__entry_global; | 1076 | fmt->entry = hpp__entry_global; |
| 1077 | fmt->cmp = hist_entry__cmp_nop; | ||
| 1078 | fmt->collapse = hist_entry__cmp_nop; | ||
| 1041 | 1079 | ||
| 1042 | /* TODO more colors */ | 1080 | /* TODO more colors */ |
| 1043 | switch (idx) { | 1081 | switch (idx) { |
| 1044 | case PERF_HPP_DIFF__BASELINE: | 1082 | case PERF_HPP_DIFF__BASELINE: |
| 1045 | fmt->color = hpp__color_baseline; | 1083 | fmt->color = hpp__color_baseline; |
| 1084 | fmt->sort = hist_entry__cmp_baseline; | ||
| 1046 | break; | 1085 | break; |
| 1047 | case PERF_HPP_DIFF__DELTA: | 1086 | case PERF_HPP_DIFF__DELTA: |
| 1048 | fmt->color = hpp__color_delta; | 1087 | fmt->color = hpp__color_delta; |
| 1088 | fmt->sort = hist_entry__cmp_delta; | ||
| 1049 | break; | 1089 | break; |
| 1050 | case PERF_HPP_DIFF__RATIO: | 1090 | case PERF_HPP_DIFF__RATIO: |
| 1051 | fmt->color = hpp__color_ratio; | 1091 | fmt->color = hpp__color_ratio; |
| 1092 | fmt->sort = hist_entry__cmp_ratio; | ||
| 1052 | break; | 1093 | break; |
| 1053 | case PERF_HPP_DIFF__WEIGHTED_DIFF: | 1094 | case PERF_HPP_DIFF__WEIGHTED_DIFF: |
| 1054 | fmt->color = hpp__color_wdiff; | 1095 | fmt->color = hpp__color_wdiff; |
| 1096 | fmt->sort = hist_entry__cmp_wdiff; | ||
| 1055 | break; | 1097 | break; |
| 1056 | default: | 1098 | default: |
| 1099 | fmt->sort = hist_entry__cmp_nop; | ||
| 1057 | break; | 1100 | break; |
| 1058 | } | 1101 | } |
| 1059 | 1102 | ||
| 1060 | init_header(d, dfmt); | 1103 | init_header(d, dfmt); |
| 1061 | perf_hpp__column_register(fmt); | 1104 | perf_hpp__column_register(fmt); |
| 1105 | perf_hpp__register_sort_field(fmt); | ||
| 1062 | } | 1106 | } |
| 1063 | 1107 | ||
| 1064 | static void ui_init(void) | 1108 | static void ui_init(void) |
diff --git a/tools/perf/builtin-list.c b/tools/perf/builtin-list.c index 011195e38f21..198f3c3aff95 100644 --- a/tools/perf/builtin-list.c +++ b/tools/perf/builtin-list.c | |||
| @@ -19,7 +19,9 @@ | |||
| 19 | int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) | 19 | int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) |
| 20 | { | 20 | { |
| 21 | int i; | 21 | int i; |
| 22 | const struct option list_options[] = { | 22 | bool raw_dump = false; |
| 23 | struct option list_options[] = { | ||
| 24 | OPT_BOOLEAN(0, "raw-dump", &raw_dump, "Dump raw events"), | ||
| 23 | OPT_END() | 25 | OPT_END() |
| 24 | }; | 26 | }; |
| 25 | const char * const list_usage[] = { | 27 | const char * const list_usage[] = { |
| @@ -27,11 +29,18 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) | |||
| 27 | NULL | 29 | NULL |
| 28 | }; | 30 | }; |
| 29 | 31 | ||
| 32 | set_option_flag(list_options, 0, "raw-dump", PARSE_OPT_HIDDEN); | ||
| 33 | |||
| 30 | argc = parse_options(argc, argv, list_options, list_usage, | 34 | argc = parse_options(argc, argv, list_options, list_usage, |
| 31 | PARSE_OPT_STOP_AT_NON_OPTION); | 35 | PARSE_OPT_STOP_AT_NON_OPTION); |
| 32 | 36 | ||
| 33 | setup_pager(); | 37 | setup_pager(); |
| 34 | 38 | ||
| 39 | if (raw_dump) { | ||
| 40 | print_events(NULL, true); | ||
| 41 | return 0; | ||
| 42 | } | ||
| 43 | |||
| 35 | if (argc == 0) { | 44 | if (argc == 0) { |
| 36 | print_events(NULL, false); | 45 | print_events(NULL, false); |
| 37 | return 0; | 46 | return 0; |
| @@ -53,8 +62,6 @@ int cmd_list(int argc, const char **argv, const char *prefix __maybe_unused) | |||
| 53 | print_hwcache_events(NULL, false); | 62 | print_hwcache_events(NULL, false); |
| 54 | else if (strcmp(argv[i], "pmu") == 0) | 63 | else if (strcmp(argv[i], "pmu") == 0) |
| 55 | print_pmu_events(NULL, false); | 64 | print_pmu_events(NULL, false); |
| 56 | else if (strcmp(argv[i], "--raw-dump") == 0) | ||
| 57 | print_events(NULL, true); | ||
| 58 | else { | 65 | else { |
| 59 | char *sep = strchr(argv[i], ':'), *s; | 66 | char *sep = strchr(argv[i], ':'), *s; |
| 60 | int sep_idx; | 67 | int sep_idx; |
diff --git a/tools/perf/util/probe-event.c b/tools/perf/util/probe-event.c index 28eb1417cb2a..7f9b8632e433 100644 --- a/tools/perf/util/probe-event.c +++ b/tools/perf/util/probe-event.c | |||
| @@ -495,9 +495,11 @@ static int try_to_find_probe_trace_events(struct perf_probe_event *pev, | |||
| 495 | } | 495 | } |
| 496 | 496 | ||
| 497 | if (ntevs == 0) { /* No error but failed to find probe point. */ | 497 | if (ntevs == 0) { /* No error but failed to find probe point. */ |
| 498 | pr_warning("Probe point '%s' not found.\n", | 498 | pr_warning("Probe point '%s' not found in debuginfo.\n", |
| 499 | synthesize_perf_probe_point(&pev->point)); | 499 | synthesize_perf_probe_point(&pev->point)); |
| 500 | return -ENOENT; | 500 | if (need_dwarf) |
| 501 | return -ENOENT; | ||
| 502 | return 0; | ||
| 501 | } | 503 | } |
| 502 | /* Error path : ntevs < 0 */ | 504 | /* Error path : ntevs < 0 */ |
| 503 | pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); | 505 | pr_debug("An error occurred in debuginfo analysis (%d).\n", ntevs); |
diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c index c7918f83b300..b5247d777f0e 100644 --- a/tools/perf/util/probe-finder.c +++ b/tools/perf/util/probe-finder.c | |||
| @@ -989,8 +989,24 @@ static int debuginfo__find_probes(struct debuginfo *dbg, | |||
| 989 | int ret = 0; | 989 | int ret = 0; |
| 990 | 990 | ||
| 991 | #if _ELFUTILS_PREREQ(0, 142) | 991 | #if _ELFUTILS_PREREQ(0, 142) |
| 992 | Elf *elf; | ||
| 993 | GElf_Ehdr ehdr; | ||
| 994 | GElf_Shdr shdr; | ||
| 995 | |||
| 992 | /* Get the call frame information from this dwarf */ | 996 | /* Get the call frame information from this dwarf */ |
| 993 | pf->cfi = dwarf_getcfi_elf(dwarf_getelf(dbg->dbg)); | 997 | elf = dwarf_getelf(dbg->dbg); |
| 998 | if (elf == NULL) | ||
| 999 | return -EINVAL; | ||
| 1000 | |||
| 1001 | if (gelf_getehdr(elf, &ehdr) == NULL) | ||
| 1002 | return -EINVAL; | ||
| 1003 | |||
| 1004 | if (elf_section_by_name(elf, &ehdr, &shdr, ".eh_frame", NULL) && | ||
| 1005 | shdr.sh_type == SHT_PROGBITS) { | ||
| 1006 | pf->cfi = dwarf_getcfi_elf(elf); | ||
| 1007 | } else { | ||
| 1008 | pf->cfi = dwarf_getcfi(dbg->dbg); | ||
| 1009 | } | ||
| 994 | #endif | 1010 | #endif |
| 995 | 1011 | ||
| 996 | off = 0; | 1012 | off = 0; |
