Merge tag 'iio-for-4.20a' of git://git.kernel.org/pub/scm/linux/kernel/git/jic23...
[sfrench/cifs-2.6.git] / tools / perf / ui / browsers / annotate.c
index 3b4f1c10ff57c8ae7b64baaee79ada7aec3b5ba1..1d00e5ec7906ebaf23b57a5d9e1471ed1cbab465 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/kernel.h>
 #include <linux/string.h>
 #include <sys/ttydefaults.h>
+#include <asm/bug.h>
 
 struct disasm_line_samples {
        double                percent;
@@ -115,7 +116,7 @@ static void annotate_browser__write(struct ui_browser *browser, void *entry, int
        if (!browser->navkeypressed)
                ops.width += 1;
 
-       annotation_line__write(al, notes, &ops);
+       annotation_line__write(al, notes, &ops, ab->opts);
 
        if (ops.current_entry)
                ab->selection = al;
@@ -227,10 +228,10 @@ static int disasm__cmp(struct annotation_line *a, struct annotation_line *b)
 {
        int i;
 
-       for (i = 0; i < a->samples_nr; i++) {
-               if (a->samples[i].percent == b->samples[i].percent)
+       for (i = 0; i < a->data_nr; i++) {
+               if (a->data[i].percent == b->data[i].percent)
                        continue;
-               return a->samples[i].percent < b->samples[i].percent;
+               return a->data[i].percent < b->data[i].percent;
        }
        return 0;
 }
@@ -314,11 +315,14 @@ static void annotate_browser__calc_percent(struct annotate_browser *browser,
                        continue;
                }
 
-               for (i = 0; i < pos->al.samples_nr; i++) {
-                       struct annotation_data *sample = &pos->al.samples[i];
+               for (i = 0; i < pos->al.data_nr; i++) {
+                       double percent;
 
-                       if (max_percent < sample->percent)
-                               max_percent = sample->percent;
+                       percent = annotation_data__percent(&pos->al.data[i],
+                                                          browser->opts->percent_type);
+
+                       if (max_percent < percent)
+                               max_percent = percent;
                }
 
                if (max_percent < 0.01 && pos->al.ipc == 0) {
@@ -380,9 +384,10 @@ static void ui_browser__init_asm_mode(struct ui_browser *browser)
 #define SYM_TITLE_MAX_SIZE (PATH_MAX + 64)
 
 static int sym_title(struct symbol *sym, struct map *map, char *title,
-                    size_t sz)
+                    size_t sz, int percent_type)
 {
-       return snprintf(title, sz, "%s  %s", sym->name, map->dso->long_name);
+       return snprintf(title, sz, "%s  %s [Percent: %s]", sym->name, map->dso->long_name,
+                       percent_type_str(percent_type));
 }
 
 /*
@@ -420,7 +425,7 @@ static bool annotate_browser__callq(struct annotate_browser *browser,
 
        pthread_mutex_unlock(&notes->lock);
        symbol__tui_annotate(dl->ops.target.sym, ms->map, evsel, hbt, browser->opts);
-       sym_title(ms->sym, ms->map, title, sizeof(title));
+       sym_title(ms->sym, ms->map, title, sizeof(title), browser->opts->percent_type);
        ui_browser__show_title(&browser->b, title);
        return true;
 }
@@ -595,6 +600,7 @@ bool annotate_browser__continue_search_reverse(struct annotate_browser *browser,
 
 static int annotate_browser__show(struct ui_browser *browser, char *title, const char *help)
 {
+       struct annotate_browser *ab = container_of(browser, struct annotate_browser, b);
        struct map_symbol *ms = browser->priv;
        struct symbol *sym = ms->sym;
        char symbol_dso[SYM_TITLE_MAX_SIZE];
@@ -602,7 +608,7 @@ static int annotate_browser__show(struct ui_browser *browser, char *title, const
        if (ui_browser__show(browser, title, help) < 0)
                return -1;
 
-       sym_title(sym, ms->map, symbol_dso, sizeof(symbol_dso));
+       sym_title(sym, ms->map, symbol_dso, sizeof(symbol_dso), ab->opts->percent_type);
 
        ui_browser__gotorc_title(browser, 0, 0);
        ui_browser__set_color(browser, HE_COLORSET_ROOT);
@@ -610,6 +616,39 @@ static int annotate_browser__show(struct ui_browser *browser, char *title, const
        return 0;
 }
 
+static void
+switch_percent_type(struct annotation_options *opts, bool base)
+{
+       switch (opts->percent_type) {
+       case PERCENT_HITS_LOCAL:
+               if (base)
+                       opts->percent_type = PERCENT_PERIOD_LOCAL;
+               else
+                       opts->percent_type = PERCENT_HITS_GLOBAL;
+               break;
+       case PERCENT_HITS_GLOBAL:
+               if (base)
+                       opts->percent_type = PERCENT_PERIOD_GLOBAL;
+               else
+                       opts->percent_type = PERCENT_HITS_LOCAL;
+               break;
+       case PERCENT_PERIOD_LOCAL:
+               if (base)
+                       opts->percent_type = PERCENT_HITS_LOCAL;
+               else
+                       opts->percent_type = PERCENT_PERIOD_GLOBAL;
+               break;
+       case PERCENT_PERIOD_GLOBAL:
+               if (base)
+                       opts->percent_type = PERCENT_HITS_GLOBAL;
+               else
+                       opts->percent_type = PERCENT_PERIOD_LOCAL;
+               break;
+       default:
+               WARN_ON(1);
+       }
+}
+
 static int annotate_browser__run(struct annotate_browser *browser,
                                 struct perf_evsel *evsel,
                                 struct hist_browser_timer *hbt)
@@ -624,8 +663,7 @@ static int annotate_browser__run(struct annotate_browser *browser,
        char title[256];
        int key;
 
-       annotation__scnprintf_samples_period(notes, title, sizeof(title), evsel);
-
+       hists__scnprintf_title(hists, title, sizeof(title));
        if (annotate_browser__show(&browser->b, title, help) < 0)
                return -1;
 
@@ -701,6 +739,8 @@ static int annotate_browser__run(struct annotate_browser *browser,
                "k             Toggle line numbers\n"
                "P             Print to [symbol_name].annotation file.\n"
                "r             Run available scripts\n"
+               "p             Toggle percent type [local/global]\n"
+               "b             Toggle percent base [period/hits]\n"
                "?             Search string backwards\n");
                        continue;
                case 'r':
@@ -781,7 +821,7 @@ show_sup_ins:
                        continue;
                }
                case 'P':
-                       map_symbol__annotation_dump(ms, evsel);
+                       map_symbol__annotation_dump(ms, evsel, browser->opts);
                        continue;
                case 't':
                        if (notes->options->show_total_period) {
@@ -800,6 +840,12 @@ show_sup_ins:
                                notes->options->show_minmax_cycle = true;
                        annotation__update_column_widths(notes);
                        continue;
+               case 'p':
+               case 'b':
+                       switch_percent_type(browser->opts, key == 'b');
+                       hists__scnprintf_title(hists, title, sizeof(title));
+                       annotate_browser__show(&browser->b, title, help);
+                       continue;
                case K_LEFT:
                case K_ESC:
                case 'q':