Merge tag 'for_linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mst/vhost
[firefly-linux-kernel-4.4.55.git] / tools / perf / builtin-annotate.c
index 2e6961ea3184f510e4f51143168bc1ea8eb607ae..db491e9a812b1b8cf7134f51fedd27c206e4f8fc 100644 (file)
@@ -63,7 +63,7 @@ static int perf_evsel__add_sample(struct perf_evsel *evsel,
                return 0;
        }
 
-       he = __hists__add_entry(&evsel->hists, al, NULL, 1);
+       he = __hists__add_entry(&evsel->hists, al, NULL, 1, 1);
        if (he == NULL)
                return -ENOMEM;
 
@@ -109,14 +109,16 @@ static int process_sample_event(struct perf_tool *tool,
        return 0;
 }
 
-static int hist_entry__tty_annotate(struct hist_entry *he, int evidx,
+static int hist_entry__tty_annotate(struct hist_entry *he,
+                                   struct perf_evsel *evsel,
                                    struct perf_annotate *ann)
 {
-       return symbol__tty_annotate(he->ms.sym, he->ms.map, evidx,
+       return symbol__tty_annotate(he->ms.sym, he->ms.map, evsel,
                                    ann->print_line, ann->full_paths, 0, 0);
 }
 
-static void hists__find_annotations(struct hists *self, int evidx,
+static void hists__find_annotations(struct hists *self,
+                                   struct perf_evsel *evsel,
                                    struct perf_annotate *ann)
 {
        struct rb_node *nd = rb_first(&self->entries), *next;
@@ -142,14 +144,14 @@ find_next:
                if (use_browser == 2) {
                        int ret;
 
-                       ret = hist_entry__gtk_annotate(he, evidx, NULL);
+                       ret = hist_entry__gtk_annotate(he, evsel, NULL);
                        if (!ret || !ann->skip_missing)
                                return;
 
                        /* skip missing symbols */
                        nd = rb_next(nd);
                } else if (use_browser == 1) {
-                       key = hist_entry__tui_annotate(he, evidx, NULL);
+                       key = hist_entry__tui_annotate(he, evsel, NULL);
                        switch (key) {
                        case -1:
                                if (!ann->skip_missing)
@@ -168,7 +170,7 @@ find_next:
                        if (next != NULL)
                                nd = next;
                } else {
-                       hist_entry__tty_annotate(he, evidx, ann);
+                       hist_entry__tty_annotate(he, evsel, ann);
                        nd = rb_next(nd);
                        /*
                         * Since we have a hist_entry per IP for the same
@@ -230,7 +232,12 @@ static int __cmd_annotate(struct perf_annotate *ann)
                        total_nr_samples += nr_samples;
                        hists__collapse_resort(hists);
                        hists__output_resort(hists);
-                       hists__find_annotations(hists, pos->idx, ann);
+
+                       if (symbol_conf.event_group &&
+                           !perf_evsel__is_group_leader(pos))
+                               continue;
+
+                       hists__find_annotations(hists, pos, ann);
                }
        }
 
@@ -312,6 +319,8 @@ int cmd_annotate(int argc, const char **argv, const char *prefix __maybe_unused)
                   "Specify disassembler style (e.g. -M intel for intel syntax)"),
        OPT_STRING(0, "objdump", &objdump_path, "path",
                   "objdump binary to use for disassembly and annotations"),
+       OPT_BOOLEAN(0, "group", &symbol_conf.event_group,
+                   "Show event group information together"),
        OPT_END()
        };