]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - tools/perf/util/block-info.c
perf report: Sort by sampled cycles percent per block for tui
[linux.git] / tools / perf / util / block-info.c
index 597d1205fa6c1cab10294754854212570f1d2b32..9abc201ebe63937342dc2d04612e32e36a210573 100644 (file)
@@ -10,6 +10,7 @@
 #include "map.h"
 #include "srcline.h"
 #include "evlist.h"
+#include "ui/browsers/hists.h"
 
 static struct block_header_column {
        const char *name;
@@ -438,9 +439,75 @@ struct block_report *block_info__create_report(struct evlist *evlist,
        return block_reports;
 }
 
+#ifdef HAVE_SLANG_SUPPORT
+static int block_hists_browser__title(struct hist_browser *browser, char *bf,
+                                     size_t size)
+{
+       struct hists *hists = evsel__hists(browser->block_evsel);
+       const char *evname = perf_evsel__name(browser->block_evsel);
+       unsigned long nr_samples = hists->stats.nr_events[PERF_RECORD_SAMPLE];
+       int ret;
+
+       ret = scnprintf(bf, size, "# Samples: %lu", nr_samples);
+       if (evname)
+               scnprintf(bf + ret, size -  ret, " of event '%s'", evname);
+
+       return 0;
+}
+
+static int block_hists_tui_browse(struct block_hist *bh, struct evsel *evsel,
+                                 float min_percent)
+{
+       struct hists *hists = &bh->block_hists;
+       struct hist_browser *browser;
+       int key = -1;
+       static const char help[] =
+       " q             Quit \n";
+
+       browser = hist_browser__new(hists);
+       if (!browser)
+               return -1;
+
+       browser->block_evsel = evsel;
+       browser->title = block_hists_browser__title;
+       browser->min_pcnt = min_percent;
+
+       /* reset abort key so that it can get Ctrl-C as a key */
+       SLang_reset_tty();
+       SLang_init_tty(0, 0, 0);
+
+       while (1) {
+               key = hist_browser__run(browser, "? - help", true);
+
+               switch (key) {
+               case 'q':
+                       goto out;
+               case '?':
+                       ui_browser__help_window(&browser->b, help);
+                       break;
+               default:
+                       break;
+               }
+       }
+
+out:
+       hist_browser__delete(browser);
+       return 0;
+}
+#else
+static int block_hists_tui_browse(struct block_hist *bh __maybe_unused,
+                                 struct evsel *evsel __maybe_unused,
+                                 float min_percent __maybe_unused)
+{
+       return 0;
+}
+#endif
+
 int report__browse_block_hists(struct block_hist *bh, float min_percent,
-                              struct evsel *evsel __maybe_unused)
+                              struct evsel *evsel)
 {
+       int ret;
+
        switch (use_browser) {
        case 0:
                symbol_conf.report_individual_block = true;
@@ -448,6 +515,11 @@ int report__browse_block_hists(struct block_hist *bh, float min_percent,
                               stdout, true);
                hists__delete_entries(&bh->block_hists);
                return 0;
+       case 1:
+               symbol_conf.report_individual_block = true;
+               ret = block_hists_tui_browse(bh, evsel, min_percent);
+               hists__delete_entries(&bh->block_hists);
+               return ret;
        default:
                return -1;
        }