diff options
| author | Ingo Molnar <mingo@kernel.org> | 2014-12-08 05:50:24 -0500 |
|---|---|---|
| committer | Ingo Molnar <mingo@kernel.org> | 2014-12-08 05:50:24 -0500 |
| commit | 2a2662bf88e693d477ef08351d03934f7bc0b51c (patch) | |
| tree | cef243df159cc12ada7e97998a253df7c0abb2a2 /tools/perf/ui | |
| parent | b2776bf7149bddd1f4161f14f79520f17fc1d71d (diff) | |
| parent | 36748b9518a2437beffe861b47dff6d12b736b3f (diff) | |
Merge branch 'perf/core-v3' of git://git.kernel.org/pub/scm/linux/kernel/git/frederic/linux-dynticks into perf/hw_breakpoints
Pull AMD range breakpoints support from Frederic Weisbecker:
" - Extend breakpoint tools and core to support address range through perf
event with initial backend support for AMD extended breakpoints.
Syntax is:
perf record -e mem:addr/len:type
For example set write breakpoint from 0x1000 to 0x1200 (0x1000 + 512)
perf record -e mem:0x1000/512:w
- Clean up a bit breakpoint code validation
It has been acked by Jiri and Oleg. "
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'tools/perf/ui')
| -rw-r--r-- | tools/perf/ui/browsers/annotate.c | 13 | ||||
| -rw-r--r-- | tools/perf/ui/browsers/hists.c | 17 | ||||
| -rw-r--r-- | tools/perf/ui/gtk/hists.c | 11 | ||||
| -rw-r--r-- | tools/perf/ui/stdio/hist.c | 23 |
4 files changed, 22 insertions, 42 deletions
diff --git a/tools/perf/ui/browsers/annotate.c b/tools/perf/ui/browsers/annotate.c index f0697a3aede0..1e0a2fd80115 100644 --- a/tools/perf/ui/browsers/annotate.c +++ b/tools/perf/ui/browsers/annotate.c | |||
| @@ -27,6 +27,7 @@ static struct annotate_browser_opt { | |||
| 27 | bool hide_src_code, | 27 | bool hide_src_code, |
| 28 | use_offset, | 28 | use_offset, |
| 29 | jump_arrows, | 29 | jump_arrows, |
| 30 | show_linenr, | ||
| 30 | show_nr_jumps; | 31 | show_nr_jumps; |
| 31 | } annotate_browser__opts = { | 32 | } annotate_browser__opts = { |
| 32 | .use_offset = true, | 33 | .use_offset = true, |
| @@ -128,7 +129,11 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int | |||
| 128 | if (!*dl->line) | 129 | if (!*dl->line) |
| 129 | slsmg_write_nstring(" ", width - pcnt_width); | 130 | slsmg_write_nstring(" ", width - pcnt_width); |
| 130 | else if (dl->offset == -1) { | 131 | else if (dl->offset == -1) { |
| 131 | printed = scnprintf(bf, sizeof(bf), "%*s ", | 132 | if (dl->line_nr && annotate_browser__opts.show_linenr) |
| 133 | printed = scnprintf(bf, sizeof(bf), "%-*d ", | ||
| 134 | ab->addr_width + 1, dl->line_nr); | ||
| 135 | else | ||
| 136 | printed = scnprintf(bf, sizeof(bf), "%*s ", | ||
| 132 | ab->addr_width, " "); | 137 | ab->addr_width, " "); |
| 133 | slsmg_write_nstring(bf, printed); | 138 | slsmg_write_nstring(bf, printed); |
| 134 | slsmg_write_nstring(dl->line, width - printed - pcnt_width + 1); | 139 | slsmg_write_nstring(dl->line, width - printed - pcnt_width + 1); |
| @@ -733,6 +738,7 @@ static int annotate_browser__run(struct annotate_browser *browser, | |||
| 733 | "o Toggle disassembler output/simplified view\n" | 738 | "o Toggle disassembler output/simplified view\n" |
| 734 | "s Toggle source code view\n" | 739 | "s Toggle source code view\n" |
| 735 | "/ Search string\n" | 740 | "/ Search string\n" |
| 741 | "k Toggle line numbers\n" | ||
| 736 | "r Run available scripts\n" | 742 | "r Run available scripts\n" |
| 737 | "? Search string backwards\n"); | 743 | "? Search string backwards\n"); |
| 738 | continue; | 744 | continue; |
| @@ -741,6 +747,10 @@ static int annotate_browser__run(struct annotate_browser *browser, | |||
| 741 | script_browse(NULL); | 747 | script_browse(NULL); |
| 742 | continue; | 748 | continue; |
| 743 | } | 749 | } |
| 750 | case 'k': | ||
| 751 | annotate_browser__opts.show_linenr = | ||
| 752 | !annotate_browser__opts.show_linenr; | ||
| 753 | break; | ||
| 744 | case 'H': | 754 | case 'H': |
| 745 | nd = browser->curr_hot; | 755 | nd = browser->curr_hot; |
| 746 | break; | 756 | break; |
| @@ -984,6 +994,7 @@ static struct annotate_config { | |||
| 984 | } annotate__configs[] = { | 994 | } annotate__configs[] = { |
| 985 | ANNOTATE_CFG(hide_src_code), | 995 | ANNOTATE_CFG(hide_src_code), |
| 986 | ANNOTATE_CFG(jump_arrows), | 996 | ANNOTATE_CFG(jump_arrows), |
| 997 | ANNOTATE_CFG(show_linenr), | ||
| 987 | ANNOTATE_CFG(show_nr_jumps), | 998 | ANNOTATE_CFG(show_nr_jumps), |
| 988 | ANNOTATE_CFG(use_offset), | 999 | ANNOTATE_CFG(use_offset), |
| 989 | }; | 1000 | }; |
diff --git a/tools/perf/ui/browsers/hists.c b/tools/perf/ui/browsers/hists.c index cfb976b3de3a..12c17c5a3d68 100644 --- a/tools/perf/ui/browsers/hists.c +++ b/tools/perf/ui/browsers/hists.c | |||
| @@ -463,23 +463,6 @@ out: | |||
| 463 | return key; | 463 | return key; |
| 464 | } | 464 | } |
| 465 | 465 | ||
| 466 | static char *callchain_list__sym_name(struct callchain_list *cl, | ||
| 467 | char *bf, size_t bfsize, bool show_dso) | ||
| 468 | { | ||
| 469 | int printed; | ||
| 470 | |||
| 471 | if (cl->ms.sym) | ||
| 472 | printed = scnprintf(bf, bfsize, "%s", cl->ms.sym->name); | ||
| 473 | else | ||
| 474 | printed = scnprintf(bf, bfsize, "%#" PRIx64, cl->ip); | ||
| 475 | |||
| 476 | if (show_dso) | ||
| 477 | scnprintf(bf + printed, bfsize - printed, " %s", | ||
| 478 | cl->ms.map ? cl->ms.map->dso->short_name : "unknown"); | ||
| 479 | |||
| 480 | return bf; | ||
| 481 | } | ||
| 482 | |||
| 483 | struct callchain_print_arg { | 466 | struct callchain_print_arg { |
| 484 | /* for hists browser */ | 467 | /* for hists browser */ |
| 485 | off_t row_offset; | 468 | off_t row_offset; |
diff --git a/tools/perf/ui/gtk/hists.c b/tools/perf/ui/gtk/hists.c index fc654fb77ace..4b3585eed1e8 100644 --- a/tools/perf/ui/gtk/hists.c +++ b/tools/perf/ui/gtk/hists.c | |||
| @@ -89,15 +89,6 @@ void perf_gtk__init_hpp(void) | |||
| 89 | perf_gtk__hpp_color_overhead_acc; | 89 | perf_gtk__hpp_color_overhead_acc; |
| 90 | } | 90 | } |
| 91 | 91 | ||
| 92 | static void callchain_list__sym_name(struct callchain_list *cl, | ||
| 93 | char *bf, size_t bfsize) | ||
| 94 | { | ||
| 95 | if (cl->ms.sym) | ||
| 96 | scnprintf(bf, bfsize, "%s", cl->ms.sym->name); | ||
| 97 | else | ||
| 98 | scnprintf(bf, bfsize, "%#" PRIx64, cl->ip); | ||
| 99 | } | ||
| 100 | |||
| 101 | static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store, | 92 | static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store, |
| 102 | GtkTreeIter *parent, int col, u64 total) | 93 | GtkTreeIter *parent, int col, u64 total) |
| 103 | { | 94 | { |
| @@ -128,7 +119,7 @@ static void perf_gtk__add_callchain(struct rb_root *root, GtkTreeStore *store, | |||
| 128 | scnprintf(buf, sizeof(buf), "%5.2f%%", percent); | 119 | scnprintf(buf, sizeof(buf), "%5.2f%%", percent); |
| 129 | gtk_tree_store_set(store, &iter, 0, buf, -1); | 120 | gtk_tree_store_set(store, &iter, 0, buf, -1); |
| 130 | 121 | ||
| 131 | callchain_list__sym_name(chain, buf, sizeof(buf)); | 122 | callchain_list__sym_name(chain, buf, sizeof(buf), false); |
| 132 | gtk_tree_store_set(store, &iter, col, buf, -1); | 123 | gtk_tree_store_set(store, &iter, col, buf, -1); |
| 133 | 124 | ||
| 134 | if (need_new_parent) { | 125 | if (need_new_parent) { |
diff --git a/tools/perf/ui/stdio/hist.c b/tools/perf/ui/stdio/hist.c index 15b451acbde6..dfcbc90146ef 100644 --- a/tools/perf/ui/stdio/hist.c +++ b/tools/perf/ui/stdio/hist.c | |||
| @@ -41,6 +41,7 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain, | |||
| 41 | { | 41 | { |
| 42 | int i; | 42 | int i; |
| 43 | size_t ret = 0; | 43 | size_t ret = 0; |
| 44 | char bf[1024]; | ||
| 44 | 45 | ||
| 45 | ret += callchain__fprintf_left_margin(fp, left_margin); | 46 | ret += callchain__fprintf_left_margin(fp, left_margin); |
| 46 | for (i = 0; i < depth; i++) { | 47 | for (i = 0; i < depth; i++) { |
| @@ -56,11 +57,8 @@ static size_t ipchain__fprintf_graph(FILE *fp, struct callchain_list *chain, | |||
| 56 | } else | 57 | } else |
| 57 | ret += fprintf(fp, "%s", " "); | 58 | ret += fprintf(fp, "%s", " "); |
| 58 | } | 59 | } |
| 59 | if (chain->ms.sym) | 60 | fputs(callchain_list__sym_name(chain, bf, sizeof(bf), false), fp); |
| 60 | ret += fprintf(fp, "%s\n", chain->ms.sym->name); | 61 | fputc('\n', fp); |
| 61 | else | ||
| 62 | ret += fprintf(fp, "0x%0" PRIx64 "\n", chain->ip); | ||
| 63 | |||
| 64 | return ret; | 62 | return ret; |
| 65 | } | 63 | } |
| 66 | 64 | ||
| @@ -168,6 +166,7 @@ static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root, | |||
| 168 | struct rb_node *node; | 166 | struct rb_node *node; |
| 169 | int i = 0; | 167 | int i = 0; |
| 170 | int ret = 0; | 168 | int ret = 0; |
| 169 | char bf[1024]; | ||
| 171 | 170 | ||
| 172 | /* | 171 | /* |
| 173 | * If have one single callchain root, don't bother printing | 172 | * If have one single callchain root, don't bother printing |
| @@ -196,10 +195,8 @@ static size_t callchain__fprintf_graph(FILE *fp, struct rb_root *root, | |||
| 196 | } else | 195 | } else |
| 197 | ret += callchain__fprintf_left_margin(fp, left_margin); | 196 | ret += callchain__fprintf_left_margin(fp, left_margin); |
| 198 | 197 | ||
| 199 | if (chain->ms.sym) | 198 | ret += fprintf(fp, "%s\n", callchain_list__sym_name(chain, bf, sizeof(bf), |
| 200 | ret += fprintf(fp, " %s\n", chain->ms.sym->name); | 199 | false)); |
| 201 | else | ||
| 202 | ret += fprintf(fp, " %p\n", (void *)(long)chain->ip); | ||
| 203 | 200 | ||
| 204 | if (++entries_printed == callchain_param.print_limit) | 201 | if (++entries_printed == callchain_param.print_limit) |
| 205 | break; | 202 | break; |
| @@ -219,6 +216,7 @@ static size_t __callchain__fprintf_flat(FILE *fp, struct callchain_node *node, | |||
| 219 | { | 216 | { |
| 220 | struct callchain_list *chain; | 217 | struct callchain_list *chain; |
| 221 | size_t ret = 0; | 218 | size_t ret = 0; |
| 219 | char bf[1024]; | ||
| 222 | 220 | ||
| 223 | if (!node) | 221 | if (!node) |
| 224 | return 0; | 222 | return 0; |
| @@ -229,11 +227,8 @@ static size_t __callchain__fprintf_flat(FILE *fp, struct callchain_node *node, | |||
| 229 | list_for_each_entry(chain, &node->val, list) { | 227 | list_for_each_entry(chain, &node->val, list) { |
| 230 | if (chain->ip >= PERF_CONTEXT_MAX) | 228 | if (chain->ip >= PERF_CONTEXT_MAX) |
| 231 | continue; | 229 | continue; |
| 232 | if (chain->ms.sym) | 230 | ret += fprintf(fp, " %s\n", callchain_list__sym_name(chain, |
| 233 | ret += fprintf(fp, " %s\n", chain->ms.sym->name); | 231 | bf, sizeof(bf), false)); |
| 234 | else | ||
| 235 | ret += fprintf(fp, " %p\n", | ||
| 236 | (void *)(long)chain->ip); | ||
| 237 | } | 232 | } |
| 238 | 233 | ||
| 239 | return ret; | 234 | return ret; |
