perf report: Count number of entries separately
authorNamhyung Kim <namhyung@kernel.org>
Tue, 22 Apr 2014 00:47:25 +0000 (09:47 +0900)
committerJiri Olsa <jolsa@kernel.org>
Thu, 24 Apr 2014 14:29:20 +0000 (16:29 +0200)
The hists->nr_entries is counted in multiple places so that they can
confuse readers of the code.  This is a preparation of later change
and do not intend any functional difference.

Note that report__collapse_hists() now changed to return nothing since
its return value (nr_samples) is only for checking if there's any data
in the input file and this can be acheived by checking ->nr_entries.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Link: http://lkml.kernel.org/r/1398327843-31845-2-git-send-email-namhyung@kernel.org
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
tools/perf/builtin-report.c

index 76e2bb6cf571abc334aedad508cbb051a469d94f..aed52036468daccd84f78995fc65dced9c0fb6a8 100644 (file)
@@ -57,6 +57,7 @@ struct report {
        const char              *cpu_list;
        const char              *symbol_filter_str;
        float                   min_percent;
+       u64                     nr_entries;
        DECLARE_BITMAP(cpu_bitmap, MAX_NR_CPUS);
 };
 
@@ -75,6 +76,17 @@ static int report__config(const char *var, const char *value, void *cb)
        return perf_default_config(var, value, cb);
 }
 
+static void report__inc_stats(struct report *rep, struct hist_entry *he)
+{
+       /*
+        * The @he is either of a newly created one or an existing one
+        * merging current sample.  We only want to count a new one so
+        * checking ->nr_events being 1.
+        */
+       if (he->stat.nr_events == 1)
+               rep->nr_entries++;
+}
+
 static int report__add_mem_hist_entry(struct report *rep, struct addr_location *al,
                                      struct perf_sample *sample, struct perf_evsel *evsel)
 {
@@ -121,6 +133,8 @@ static int report__add_mem_hist_entry(struct report *rep, struct addr_location *
                        goto out;
        }
 
+       report__inc_stats(rep, he);
+
        evsel->hists.stats.total_period += cost;
        hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
        if (!he->filtered)
@@ -176,6 +190,8 @@ static int report__add_branch_hist_entry(struct report *rep, struct addr_locatio
                                        goto out;
                        }
 
+                       report__inc_stats(rep, he);
+
                        evsel->hists.stats.total_period += 1;
                        hists__inc_nr_events(&evsel->hists, PERF_RECORD_SAMPLE);
                        if (!he->filtered)
@@ -212,6 +228,8 @@ static int report__add_hist_entry(struct report *rep, struct perf_evsel *evsel,
        if (ui__has_annotation())
                err = hist_entry__inc_addr_samples(he, evsel->idx, al->addr);
 
+       report__inc_stats(rep, he);
+
        evsel->hists.stats.total_period += sample->period;
        if (!he->filtered)
                evsel->hists.stats.nr_non_filtered_samples++;
@@ -486,24 +504,12 @@ static int report__browse_hists(struct report *rep)
        return ret;
 }
 
-static u64 report__collapse_hists(struct report *rep)
+static void report__collapse_hists(struct report *rep)
 {
        struct ui_progress prog;
        struct perf_evsel *pos;
-       u64 nr_samples = 0;
-       /*
-        * Count number of histogram entries to use when showing progress,
-        * reusing nr_samples variable.
-        */
-       evlist__for_each(rep->session->evlist, pos)
-               nr_samples += pos->hists.nr_entries;
 
-       ui_progress__init(&prog, nr_samples, "Merging related events...");
-       /*
-        * Count total number of samples, will be used to check if this
-        * session had any.
-        */
-       nr_samples = 0;
+       ui_progress__init(&prog, rep->nr_entries, "Merging related events...");
 
        evlist__for_each(rep->session->evlist, pos) {
                struct hists *hists = &pos->hists;
@@ -512,7 +518,6 @@ static u64 report__collapse_hists(struct report *rep)
                        hists->symbol_filter_str = rep->symbol_filter_str;
 
                hists__collapse_resort(hists, &prog);
-               nr_samples += hists->stats.nr_events[PERF_RECORD_SAMPLE];
 
                /* Non-group events are considered as leader */
                if (symbol_conf.event_group &&
@@ -525,14 +530,11 @@ static u64 report__collapse_hists(struct report *rep)
        }
 
        ui_progress__finish();
-
-       return nr_samples;
 }
 
 static int __cmd_report(struct report *rep)
 {
        int ret;
-       u64 nr_samples;
        struct perf_session *session = rep->session;
        struct perf_evsel *pos;
        struct perf_data_file *file = session->file;
@@ -572,12 +574,12 @@ static int __cmd_report(struct report *rep)
                }
        }
 
-       nr_samples = report__collapse_hists(rep);
+       report__collapse_hists(rep);
 
        if (session_done())
                return 0;
 
-       if (nr_samples == 0) {
+       if (rep->nr_entries == 0) {
                ui__error("The %s file has no samples!\n", file->path);
                return 0;
        }