From: Namhyung Kim <namhyung....@lge.com> To support callchain accumulation, @entry should be recognized if it's accumulated or not when add_hist_entry() called. The period of an accumulated entry should be added to ->stat_acc but not ->stat. Add @sample_self arg for that.
Cc: Arun Sharma <asha...@fb.com> Cc: Frederic Weisbecker <fweis...@gmail.com> Signed-off-by: Namhyung Kim <namhy...@kernel.org> --- tools/perf/util/hist.c | 62 +++++++++++++++++++++++++++++++++++--------------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/tools/perf/util/hist.c b/tools/perf/util/hist.c index 2802302e5904..46433a0830dd 100644 --- a/tools/perf/util/hist.c +++ b/tools/perf/util/hist.c @@ -234,26 +234,50 @@ void hists__decay_entries_threaded(struct hists *hists, * histogram, sorted on item, collects periods */ -static struct hist_entry *hist_entry__new(struct hist_entry *template) +static struct hist_entry *hist_entry__new_callchain(struct hist_entry *template, + bool sample_self) { - size_t callchain_size = symbol_conf.use_callchain ? sizeof(struct callchain_root) : 0; + const size_t callchain_size = sizeof(struct callchain_root); struct hist_entry *he = malloc(sizeof(*he) + callchain_size); + if (he == NULL) + return NULL; + + *he = *template; + + if (symbol_conf.cumulate_callchain) { + he->stat_acc = malloc(sizeof(he->stat)); + if (he->stat_acc == NULL) { + free(he); + return NULL; + } + memcpy(he->stat_acc, &he->stat, sizeof(he->stat)); + if (!sample_self) + memset(&he->stat, 0, sizeof(he->stat)); + } + + if (he->ms.map) + he->ms.map->referenced = true; + + callchain_init(he->callchain); + + return he; +} + +static struct hist_entry *hist_entry__new(struct hist_entry *template, + bool sample_self) +{ + struct hist_entry *he; + + if (symbol_conf.use_callchain) + return hist_entry__new_callchain(template, sample_self); + + he = malloc(sizeof(*he)); if (he != NULL) { *he = *template; - if (symbol_conf.cumulate_callchain) { - he->stat_acc = malloc(sizeof(he->stat)); - if (he->stat_acc == NULL) { - free(he); - return NULL; - } - memcpy(he->stat_acc, &he->stat, sizeof(he->stat)); - } if (he->ms.map) he->ms.map->referenced = true; - if (symbol_conf.use_callchain) - callchain_init(he->callchain); } return he; @@ -278,7 +302,7 @@ static u8 symbol__parent_filter(const struct symbol *parent) static struct hist_entry *add_hist_entry(struct hists *hists, struct hist_entry *entry, struct addr_location *al, - u64 period) + u64 period, bool sample_self) { struct rb_node **p; struct rb_node *parent = NULL; @@ -296,7 +320,8 @@ static struct hist_entry *add_hist_entry(struct hists *hists, cmp = hist_entry__cmp(entry, he); if (!cmp) { - hist_entry__add_period(&he->stat, period); + if (sample_self) + hist_entry__add_period(&he->stat, period); if (symbol_conf.cumulate_callchain) hist_entry__add_period(he->stat_acc, period); @@ -320,14 +345,15 @@ static struct hist_entry *add_hist_entry(struct hists *hists, p = &(*p)->rb_right; } - he = hist_entry__new(entry); + he = hist_entry__new(entry, sample_self); if (!he) goto out_unlock; rb_link_node(&he->rb_node_in, parent, p); rb_insert_color(&he->rb_node_in, hists->entries_in); out: - hist_entry__add_cpumode_period(&he->stat, al->cpumode, period); + if (sample_self) + hist_entry__add_cpumode_period(&he->stat, al->cpumode, period); if (symbol_conf.cumulate_callchain) hist_entry__add_cpumode_period(he->stat_acc, al->cpumode, period); @@ -360,7 +386,7 @@ struct hist_entry *__hists__add_branch_entry(struct hists *self, .branch_info = bi, }; - return add_hist_entry(self, &entry, al, period); + return add_hist_entry(self, &entry, al, period, true); } struct hist_entry *__hists__add_entry(struct hists *self, @@ -384,7 +410,7 @@ struct hist_entry *__hists__add_entry(struct hists *self, .filtered = symbol__parent_filter(sym_parent), }; - return add_hist_entry(self, &entry, al, period); + return add_hist_entry(self, &entry, al, period, true); } int64_t -- 1.7.11.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/