]> Git Repo - J-linux.git/blobdiff - tools/perf/builtin-annotate.c
Merge tag 'trace-ring-buffer-v6.12' of git://git.kernel.org/pub/scm/linux/kernel...
[J-linux.git] / tools / perf / builtin-annotate.c
index b10b7f00565879441d750059ae9135a74c1a9810..3dc6197ef3fa6dac3b188c2848ef5975b628a221 100644 (file)
@@ -221,7 +221,8 @@ static int process_branch_callback(struct evsel *evsel,
        if (a.map != NULL)
                dso__set_hit(map__dso(a.map));
 
-       hist__account_cycles(sample->branch_stack, al, sample, false, NULL);
+       hist__account_cycles(sample->branch_stack, al, sample, false,
+                            NULL, evsel);
 
        ret = hist_entry_iter__add(&iter, &a, PERF_MAX_STACK_DEPTH, ann);
 out:
@@ -279,7 +280,7 @@ static int evsel__add_sample(struct evsel *evsel, struct perf_sample *sample,
        return ret;
 }
 
-static int process_sample_event(struct perf_tool *tool,
+static int process_sample_event(const struct perf_tool *tool,
                                union perf_event *event,
                                struct perf_sample *sample,
                                struct evsel *evsel,
@@ -396,10 +397,10 @@ static void print_annotate_item_stat(struct list_head *head, const char *title)
        printf("total %d, ok %d (%.1f%%), bad %d (%.1f%%)\n\n", total,
               total_good, 100.0 * total_good / (total ?: 1),
               total_bad, 100.0 * total_bad / (total ?: 1));
-       printf("  %-10s: %5s %5s\n", "Name", "Good", "Bad");
+       printf("  %-20s: %5s %5s\n", "Name/opcode", "Good", "Bad");
        printf("-----------------------------------------------------------\n");
        list_for_each_entry(istat, head, list)
-               printf("  %-10s: %5d %5d\n", istat->name, istat->good, istat->bad);
+               printf("  %-20s: %5d %5d\n", istat->name, istat->good, istat->bad);
        printf("\n");
 }
 
@@ -632,13 +633,23 @@ static int __cmd_annotate(struct perf_annotate *ann)
        evlist__for_each_entry(session->evlist, pos) {
                struct hists *hists = evsel__hists(pos);
                u32 nr_samples = hists->stats.nr_samples;
+               struct ui_progress prog;
+               struct evsel *evsel;
 
-               if (nr_samples == 0)
+               if (!symbol_conf.event_group || !evsel__is_group_leader(pos))
                        continue;
 
-               if (!symbol_conf.event_group || !evsel__is_group_leader(pos))
+               for_each_group_member(evsel, pos)
+                       nr_samples += evsel__hists(evsel)->stats.nr_samples;
+
+               if (nr_samples == 0)
                        continue;
 
+               ui_progress__init(&prog, nr_samples,
+                                 "Sorting group events for output...");
+               evsel__output_resort(pos, &prog);
+               ui_progress__finish();
+
                hists__find_annotations(hists, pos, ann);
        }
 
@@ -686,28 +697,7 @@ static const char * const annotate_usage[] = {
 
 int cmd_annotate(int argc, const char **argv)
 {
-       struct perf_annotate annotate = {
-               .tool = {
-                       .sample = process_sample_event,
-                       .mmap   = perf_event__process_mmap,
-                       .mmap2  = perf_event__process_mmap2,
-                       .comm   = perf_event__process_comm,
-                       .exit   = perf_event__process_exit,
-                       .fork   = perf_event__process_fork,
-                       .namespaces = perf_event__process_namespaces,
-                       .attr   = perf_event__process_attr,
-                       .build_id = perf_event__process_build_id,
-#ifdef HAVE_LIBTRACEEVENT
-                       .tracing_data   = perf_event__process_tracing_data,
-#endif
-                       .id_index       = perf_event__process_id_index,
-                       .auxtrace_info  = perf_event__process_auxtrace_info,
-                       .auxtrace       = perf_event__process_auxtrace,
-                       .feature        = process_feature_event,
-                       .ordered_events = true,
-                       .ordering_requires_timestamps = true,
-               },
-       };
+       struct perf_annotate annotate = {};
        struct perf_data data = {
                .mode  = PERF_DATA_MODE_READ,
        };
@@ -795,6 +785,8 @@ int cmd_annotate(int argc, const char **argv)
                    "Show stats for the data type annotation"),
        OPT_BOOLEAN(0, "insn-stat", &annotate.insn_stat,
                    "Show instruction stats for the data type annotation"),
+       OPT_BOOLEAN(0, "skip-empty", &symbol_conf.skip_empty,
+                   "Do not display empty (or dummy) events in the output"),
        OPT_END()
        };
        int ret;
@@ -864,6 +856,25 @@ int cmd_annotate(int argc, const char **argv)
 
        data.path = input_name;
 
+       perf_tool__init(&annotate.tool, /*ordered_events=*/true);
+       annotate.tool.sample    = process_sample_event;
+       annotate.tool.mmap      = perf_event__process_mmap;
+       annotate.tool.mmap2     = perf_event__process_mmap2;
+       annotate.tool.comm      = perf_event__process_comm;
+       annotate.tool.exit      = perf_event__process_exit;
+       annotate.tool.fork      = perf_event__process_fork;
+       annotate.tool.namespaces = perf_event__process_namespaces;
+       annotate.tool.attr      = perf_event__process_attr;
+       annotate.tool.build_id = perf_event__process_build_id;
+#ifdef HAVE_LIBTRACEEVENT
+       annotate.tool.tracing_data   = perf_event__process_tracing_data;
+#endif
+       annotate.tool.id_index  = perf_event__process_id_index;
+       annotate.tool.auxtrace_info     = perf_event__process_auxtrace_info;
+       annotate.tool.auxtrace  = perf_event__process_auxtrace;
+       annotate.tool.feature   = process_feature_event;
+       annotate.tool.ordering_requires_timestamps = true;
+
        annotate.session = perf_session__new(&data, &annotate.tool);
        if (IS_ERR(annotate.session))
                return PTR_ERR(annotate.session);
@@ -916,11 +927,15 @@ int cmd_annotate(int argc, const char **argv)
                sort_order = "dso,symbol";
 
        /*
-        * Set SORT_MODE__BRANCH so that annotate display IPC/Cycle
-        * if branch info is in perf data in TUI mode.
+        * Set SORT_MODE__BRANCH so that annotate displays IPC/Cycle and
+        * branch counters, if the corresponding branch info is available
+        * in the perf data in the TUI mode.
         */
-       if ((use_browser == 1 || annotate.use_stdio2) && annotate.has_br_stack)
+       if ((use_browser == 1 || annotate.use_stdio2) && annotate.has_br_stack) {
                sort__mode = SORT_MODE__BRANCH;
+               if (annotate.session->evlist->nr_br_cntr > 0)
+                       annotate_opts.show_br_cntr = true;
+       }
 
        if (setup_sorting(NULL) < 0)
                usage_with_options(annotate_usage, options);
This page took 0.032806 seconds and 4 git commands to generate.