]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - tools/perf/builtin-c2c.c
perf c2c report: Add TUI cacheline browser
[mirror_ubuntu-artful-kernel.git] / tools / perf / builtin-c2c.c
index 34da2a3975b0bc2dc8d168d9c7ff0eeaa31dff7b..1415640c4aca5f8404b00a0f6b2d01902af029a4 100644 (file)
@@ -1829,6 +1829,84 @@ static void c2c_browser__update_nr_entries(struct hist_browser *hb)
        hb->nr_non_filtered_entries = nr_entries;
 }
 
+struct c2c_cacheline_browser {
+       struct hist_browser      hb;
+       struct hist_entry       *he;
+};
+
+static int
+perf_c2c_cacheline_browser__title(struct hist_browser *browser,
+                                 char *bf, size_t size)
+{
+       struct c2c_cacheline_browser *cl_browser;
+       struct hist_entry *he;
+       uint64_t addr = 0;
+
+       cl_browser = container_of(browser, struct c2c_cacheline_browser, hb);
+       he = cl_browser->he;
+
+       if (he->mem_info)
+               addr = cl_address(he->mem_info->daddr.addr);
+
+       scnprintf(bf, size, "Cacheline 0x%lx", addr);
+       return 0;
+}
+
+static struct c2c_cacheline_browser*
+c2c_cacheline_browser__new(struct hists *hists, struct hist_entry *he)
+{
+       struct c2c_cacheline_browser *browser;
+
+       browser = zalloc(sizeof(*browser));
+       if (browser) {
+               hist_browser__init(&browser->hb, hists);
+               browser->hb.c2c_filter  = true;
+               browser->hb.title       = perf_c2c_cacheline_browser__title;
+               browser->he             = he;
+       }
+
+       return browser;
+}
+
+static int perf_c2c__browse_cacheline(struct hist_entry *he)
+{
+       struct c2c_hist_entry *c2c_he;
+       struct c2c_hists *c2c_hists;
+       struct c2c_cacheline_browser *cl_browser;
+       struct hist_browser *browser;
+       int key = -1;
+
+       c2c_he = container_of(he, struct c2c_hist_entry, he);
+       c2c_hists = c2c_he->hists;
+
+       cl_browser = c2c_cacheline_browser__new(&c2c_hists->hists, he);
+       if (cl_browser == NULL)
+               return -1;
+
+       browser = &cl_browser->hb;
+
+       /* reset abort key so that it can get Ctrl-C as a key */
+       SLang_reset_tty();
+       SLang_init_tty(0, 0, 0);
+
+       c2c_browser__update_nr_entries(browser);
+
+       while (1) {
+               key = hist_browser__run(browser, "help");
+
+               switch (key) {
+               case 'q':
+                       goto out;
+               default:
+                       break;
+               }
+       }
+
+out:
+       free(cl_browser);
+       return 0;
+}
+
 static int perf_c2c_browser__title(struct hist_browser *browser,
                                   char *bf, size_t size)
 {
@@ -1872,6 +1950,9 @@ static int perf_c2c__hists_browse(struct hists *hists)
                switch (key) {
                case 'q':
                        goto out;
+               case 'd':
+                       perf_c2c__browse_cacheline(browser->he_selection);
+                       break;
                default:
                        break;
                }