Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux
[linux-2.6-microblaze.git] / tools / perf / builtin-report.c
index 2a845d6..36f9ccf 100644 (file)
@@ -84,6 +84,8 @@ struct report {
        bool                    nonany_branch_mode;
        bool                    group_set;
        bool                    stitch_lbr;
+       bool                    disable_order;
+       bool                    skip_empty;
        int                     max_stack;
        struct perf_read_values show_threads_values;
        struct annotation_options annotation_opts;
@@ -134,6 +136,11 @@ static int report__config(const char *var, const char *value, void *cb)
                return 0;
        }
 
+       if (!strcmp(var, "report.skip-empty")) {
+               rep->skip_empty = perf_config_bool(var, value);
+               return 0;
+       }
+
        return 0;
 }
 
@@ -435,7 +442,7 @@ static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct report
 {
        size_t ret;
        char unit;
-       unsigned long nr_samples = hists->stats.nr_events[PERF_RECORD_SAMPLE];
+       unsigned long nr_samples = hists->stats.nr_samples;
        u64 nr_events = hists->stats.total_period;
        struct evsel *evsel = hists_to_evsel(hists);
        char buf[512];
@@ -463,7 +470,7 @@ static size_t hists__fprintf_nr_sample_events(struct hists *hists, struct report
                                nr_samples += pos_hists->stats.nr_non_filtered_samples;
                                nr_events += pos_hists->stats.total_non_filtered_period;
                        } else {
-                               nr_samples += pos_hists->stats.nr_events[PERF_RECORD_SAMPLE];
+                               nr_samples += pos_hists->stats.nr_samples;
                                nr_events += pos_hists->stats.total_period;
                        }
                }
@@ -529,6 +536,9 @@ static int evlist__tty_browse_hists(struct evlist *evlist, struct report *rep, c
                if (symbol_conf.event_group && !evsel__is_group_leader(pos))
                        continue;
 
+               if (rep->skip_empty && !hists->stats.nr_samples)
+                       continue;
+
                hists__fprintf_nr_sample_events(hists, rep, evname, stdout);
 
                if (rep->total_cycles_mode) {
@@ -707,9 +717,22 @@ static void report__output_resort(struct report *rep)
        ui_progress__finish();
 }
 
+static int count_sample_event(struct perf_tool *tool __maybe_unused,
+                             union perf_event *event __maybe_unused,
+                             struct perf_sample *sample __maybe_unused,
+                             struct evsel *evsel,
+                             struct machine *machine __maybe_unused)
+{
+       struct hists *hists = evsel__hists(evsel);
+
+       hists__inc_nr_events(hists);
+       return 0;
+}
+
 static void stats_setup(struct report *rep)
 {
        memset(&rep->tool, 0, sizeof(rep->tool));
+       rep->tool.sample = count_sample_event;
        rep->tool.no_warn = true;
 }
 
@@ -717,7 +740,8 @@ static int stats_print(struct report *rep)
 {
        struct perf_session *session = rep->session;
 
-       perf_session__fprintf_nr_events(session, stdout);
+       perf_session__fprintf_nr_events(session, stdout, rep->skip_empty);
+       evlist__fprintf_nr_events(session->evlist, stdout, rep->skip_empty);
        return 0;
 }
 
@@ -929,8 +953,10 @@ static int __cmd_report(struct report *rep)
                        perf_session__fprintf_dsos(session, stdout);
 
                if (dump_trace) {
-                       perf_session__fprintf_nr_events(session, stdout);
-                       evlist__fprintf_nr_events(session->evlist, stdout);
+                       perf_session__fprintf_nr_events(session, stdout,
+                                                       rep->skip_empty);
+                       evlist__fprintf_nr_events(session->evlist, stdout,
+                                                 rep->skip_empty);
                        return 0;
                }
        }
@@ -1139,6 +1165,7 @@ int cmd_report(int argc, const char **argv)
                .pretty_printing_style   = "normal",
                .socket_filter           = -1,
                .annotation_opts         = annotation__default_options,
+               .skip_empty              = true,
        };
        const struct option options[] = {
        OPT_STRING('i', "input", &input_name, "file",
@@ -1296,6 +1323,10 @@ int cmd_report(int argc, const char **argv)
        OPTS_EVSWITCH(&report.evswitch),
        OPT_BOOLEAN(0, "total-cycles", &report.total_cycles_mode,
                    "Sort all blocks by 'Sampled Cycles%'"),
+       OPT_BOOLEAN(0, "disable-order", &report.disable_order,
+                   "Disable raw trace ordering"),
+       OPT_BOOLEAN(0, "skip-empty", &report.skip_empty,
+                   "Do not display empty (or dummy) events in the output"),
        OPT_END()
        };
        struct perf_data data = {
@@ -1329,7 +1360,7 @@ int cmd_report(int argc, const char **argv)
        if (report.mmaps_mode)
                report.tasks_mode = true;
 
-       if (dump_trace)
+       if (dump_trace && report.disable_order)
                report.tool.ordered_events = false;
 
        if (quiet)