From: Madhavan Srinivasan <ma...@linux.vnet.ibm.com>

To enable hazard mode with perf report (followup patch) we need to
have cpu pipeline hazard data available in hist_entry. Add hazard
info into struct hist_entry. Also add hazard_info as parameter to
hists__add_entry().

Signed-off-by: Madhavan Srinivasan <ma...@linux.vnet.ibm.com>
Signed-off-by: Ravi Bangoria <ravi.bango...@linux.ibm.com>
---
 tools/perf/builtin-annotate.c |  2 +-
 tools/perf/builtin-c2c.c      |  4 ++--
 tools/perf/builtin-diff.c     |  6 +++---
 tools/perf/tests/hists_link.c |  4 ++--
 tools/perf/util/hist.c        | 22 +++++++++++++++-------
 tools/perf/util/hist.h        |  2 ++
 tools/perf/util/sort.h        |  1 +
 7 files changed, 26 insertions(+), 15 deletions(-)

diff --git a/tools/perf/builtin-annotate.c b/tools/perf/builtin-annotate.c
index 6c0a0412502e..78552a9428a6 100644
--- a/tools/perf/builtin-annotate.c
+++ b/tools/perf/builtin-annotate.c
@@ -249,7 +249,7 @@ static int perf_evsel__add_sample(struct evsel *evsel,
        if (ann->has_br_stack && has_annotation(ann))
                return process_branch_callback(evsel, sample, al, ann, machine);
 
-       he = hists__add_entry(hists, al, NULL, NULL, NULL, sample, true);
+       he = hists__add_entry(hists, al, NULL, NULL, NULL, NULL, sample, true);
        if (he == NULL)
                return -ENOMEM;
 
diff --git a/tools/perf/builtin-c2c.c b/tools/perf/builtin-c2c.c
index 246ac0b4d54f..2a1cb5cda6d9 100644
--- a/tools/perf/builtin-c2c.c
+++ b/tools/perf/builtin-c2c.c
@@ -292,7 +292,7 @@ static int process_sample_event(struct perf_tool *tool 
__maybe_unused,
        c2c_decode_stats(&stats, mi);
 
        he = hists__add_entry_ops(&c2c_hists->hists, &c2c_entry_ops,
-                                 &al, NULL, NULL, mi,
+                                 &al, NULL, NULL, mi, NULL,
                                  sample, true);
        if (he == NULL)
                goto free_mi;
@@ -326,7 +326,7 @@ static int process_sample_event(struct perf_tool *tool 
__maybe_unused,
                        goto free_mi;
 
                he = hists__add_entry_ops(&c2c_hists->hists, &c2c_entry_ops,
-                                         &al, NULL, NULL, mi,
+                                         &al, NULL, NULL, mi, NULL,
                                          sample, true);
                if (he == NULL)
                        goto free_mi;
diff --git a/tools/perf/builtin-diff.c b/tools/perf/builtin-diff.c
index f8b6ae557d8b..e32e91f89a18 100644
--- a/tools/perf/builtin-diff.c
+++ b/tools/perf/builtin-diff.c
@@ -412,15 +412,15 @@ static int diff__process_sample_event(struct perf_tool 
*tool,
        }
 
        if (compute != COMPUTE_CYCLES) {
-               if (!hists__add_entry(hists, &al, NULL, NULL, NULL, sample,
-                                     true)) {
+               if (!hists__add_entry(hists, &al, NULL, NULL, NULL, NULL,
+                                     sample, true)) {
                        pr_warning("problem incrementing symbol period, "
                                   "skipping event\n");
                        goto out_put;
                }
        } else {
                if (!hists__add_entry_ops(hists, &block_hist_ops, &al, NULL,
-                                         NULL, NULL, sample, true)) {
+                                         NULL, NULL, NULL, sample, true)) {
                        pr_warning("problem incrementing symbol period, "
                                   "skipping event\n");
                        goto out_put;
diff --git a/tools/perf/tests/hists_link.c b/tools/perf/tests/hists_link.c
index a024d3f3a412..112a90818d2e 100644
--- a/tools/perf/tests/hists_link.c
+++ b/tools/perf/tests/hists_link.c
@@ -86,7 +86,7 @@ static int add_hist_entries(struct evlist *evlist, struct 
machine *machine)
                        if (machine__resolve(machine, &al, &sample) < 0)
                                goto out;
 
-                       he = hists__add_entry(hists, &al, NULL,
+                       he = hists__add_entry(hists, &al, NULL, NULL,
                                                NULL, NULL, &sample, true);
                        if (he == NULL) {
                                addr_location__put(&al);
@@ -105,7 +105,7 @@ static int add_hist_entries(struct evlist *evlist, struct 
machine *machine)
                        if (machine__resolve(machine, &al, &sample) < 0)
                                goto out;
 
-                       he = hists__add_entry(hists, &al, NULL,
+                       he = hists__add_entry(hists, &al, NULL, NULL,
                                                NULL, NULL, &sample, true);
                        if (he == NULL) {
                                addr_location__put(&al);
diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c
index ca5a8f4d007e..6d23efaa52c8 100644
--- a/tools/perf/util/hist.c
+++ b/tools/perf/util/hist.c
@@ -604,6 +604,7 @@ static struct hist_entry *hists__findnew_entry(struct hists 
*hists,
                         * and will not be used anymore.
                         */
                        mem_info__zput(entry->mem_info);
+                       zfree(&entry->haz_data);
 
                        block_info__zput(entry->block_info);
 
@@ -678,6 +679,7 @@ __hists__add_entry(struct hists *hists,
                   struct symbol *sym_parent,
                   struct branch_info *bi,
                   struct mem_info *mi,
+                  struct perf_pipeline_haz_data *haz_data,
                   struct block_info *block_info,
                   struct perf_sample *sample,
                   bool sample_self,
@@ -712,6 +714,7 @@ __hists__add_entry(struct hists *hists,
                .hists  = hists,
                .branch_info = bi,
                .mem_info = mi,
+               .haz_data = haz_data,
                .block_info = block_info,
                .transaction = sample->transaction,
                .raw_data = sample->raw_data,
@@ -732,10 +735,11 @@ struct hist_entry *hists__add_entry(struct hists *hists,
                                    struct symbol *sym_parent,
                                    struct branch_info *bi,
                                    struct mem_info *mi,
+                                   struct perf_pipeline_haz_data *haz_data,
                                    struct perf_sample *sample,
                                    bool sample_self)
 {
-       return __hists__add_entry(hists, al, sym_parent, bi, mi, NULL,
+       return __hists__add_entry(hists, al, sym_parent, bi, mi, haz_data, NULL,
                                  sample, sample_self, NULL);
 }
 
@@ -745,10 +749,11 @@ struct hist_entry *hists__add_entry_ops(struct hists 
*hists,
                                        struct symbol *sym_parent,
                                        struct branch_info *bi,
                                        struct mem_info *mi,
+                                       struct perf_pipeline_haz_data *haz_data,
                                        struct perf_sample *sample,
                                        bool sample_self)
 {
-       return __hists__add_entry(hists, al, sym_parent, bi, mi, NULL,
+       return __hists__add_entry(hists, al, sym_parent, bi, mi, haz_data, NULL,
                                  sample, sample_self, ops);
 }
 
@@ -823,7 +828,7 @@ iter_add_single_mem_entry(struct hist_entry_iter *iter, 
struct addr_location *al
        sample->period = cost;
 
        he = hists__add_entry(hists, al, iter->parent, NULL, mi,
-                             sample, true);
+                             NULL, sample, true);
        if (!he)
                return -ENOMEM;
 
@@ -926,7 +931,7 @@ iter_add_next_branch_entry(struct hist_entry_iter *iter, 
struct addr_location *a
        sample->weight = bi->flags.cycles ? bi->flags.cycles : 1;
 
        he = hists__add_entry(hists, al, iter->parent, &bi[i], NULL,
-                             sample, true);
+                             NULL, sample, true);
        if (he == NULL)
                return -ENOMEM;
 
@@ -963,7 +968,7 @@ iter_add_single_normal_entry(struct hist_entry_iter *iter, 
struct addr_location
        struct hist_entry *he;
 
        he = hists__add_entry(evsel__hists(evsel), al, iter->parent, NULL, NULL,
-                             sample, true);
+                             NULL, sample, true);
        if (he == NULL)
                return -ENOMEM;
 
@@ -1024,7 +1029,7 @@ iter_add_single_cumulative_entry(struct hist_entry_iter 
*iter,
        int err = 0;
 
        he = hists__add_entry(hists, al, iter->parent, NULL, NULL,
-                             sample, true);
+                             NULL, sample, true);
        if (he == NULL)
                return -ENOMEM;
 
@@ -1101,7 +1106,7 @@ iter_add_next_cumulative_entry(struct hist_entry_iter 
*iter,
        }
 
        he = hists__add_entry(evsel__hists(evsel), al, iter->parent, NULL, NULL,
-                             sample, false);
+                             NULL, sample, false);
        if (he == NULL)
                return -ENOMEM;
 
@@ -1268,6 +1273,9 @@ void hist_entry__delete(struct hist_entry *he)
                mem_info__zput(he->mem_info);
        }
 
+       if (he->haz_data)
+               zfree(&he->haz_data);
+
        if (he->block_info)
                block_info__zput(he->block_info);
 
diff --git a/tools/perf/util/hist.h b/tools/perf/util/hist.h
index 0aa63aeb58ec..a4d12a503126 100644
--- a/tools/perf/util/hist.h
+++ b/tools/perf/util/hist.h
@@ -139,6 +139,7 @@ struct hist_entry *hists__add_entry(struct hists *hists,
                                    struct symbol *parent,
                                    struct branch_info *bi,
                                    struct mem_info *mi,
+                                   struct perf_pipeline_haz_data *haz_data,
                                    struct perf_sample *sample,
                                    bool sample_self);
 
@@ -148,6 +149,7 @@ struct hist_entry *hists__add_entry_ops(struct hists *hists,
                                        struct symbol *sym_parent,
                                        struct branch_info *bi,
                                        struct mem_info *mi,
+                                       struct perf_pipeline_haz_data *haz_data,
                                        struct perf_sample *sample,
                                        bool sample_self);
 
diff --git a/tools/perf/util/sort.h b/tools/perf/util/sort.h
index 6c862d62d052..55eb65fd593f 100644
--- a/tools/perf/util/sort.h
+++ b/tools/perf/util/sort.h
@@ -139,6 +139,7 @@ struct hist_entry {
        long                    time;
        struct hists            *hists;
        struct mem_info         *mem_info;
+       struct perf_pipeline_haz_data *haz_data;
        struct block_info       *block_info;
        void                    *raw_data;
        u32                     raw_size;
-- 
2.21.1

Reply via email to