perf tools: Replace map->referenced & maps-> removed_maps with map->refcnt
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 5c24b67aae72f54c5d2a6898be4bae9726df63bb Gitweb: http://git.kernel.org/tip/5c24b67aae72f54c5d2a6898be4bae9726df63bb Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Mon, 15 Jun 2015 23:29:51 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Tue, 16 Jun 2015 10:34:38 -0300
perf tools: Replace map->referenced & maps->removed_maps with map->refcnt
Use just reference counts, so that when no more hist_entry instances references a map and the thread instance goes away by processing a PERF_RECORD_EXIT, we can delete the maps.
Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc David Ahern <[email protected]>
Cc Don Zickus <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/hist.c | 37 +++++++++++++++++++------------- tools/perf/util/map.c | 58 ++------------------------------------------------ tools/perf/util/map.h | 10 +++++++-- 3 files changed, 32 insertions(+), 73 deletions(-)
tools/perf/util/hist.c +22 -15
@@ -313,8 +313,7 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template,memset (&he->stat,0 ,sizeof (he->stat)); } -if (he->ms.map) - he->ms.map->referenced = true; +map__get (he->ms.map);if (he->branch_info) {/*
@@ -324,6 +323,7 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template,*/ he->branch_info =malloc (sizeof (*he->branch_info));if (he->branch_info ==NULL ) { +map__zput (he->ms.map);free (he->stat_acc);free (he);return NULL ;
@@ -332,17 +332,13 @@ static struct hist_entry *hist_entry__new(struct hist_entry *template,memcpy (he->branch_info, template->branch_info,sizeof (*he->branch_info)); -if (he->branch_info->from.map) - he->branch_info->from.map->referenced = true; -if (he->branch_info->to.map) - he->branch_info->to.map->referenced = true; +map__get (he->branch_info->from.map); +map__get (he->branch_info->to.map); }if (he->mem_info) { -if (he->mem_info->iaddr.map) - he->mem_info->iaddr.map->referenced = true; -if (he->mem_info->daddr.map) - he->mem_info->daddr.map->referenced = true; +map__get (he->mem_info->iaddr.map); +map__get (he->mem_info->daddr.map); }if (symbol_conf.use_callchain)
@@ -407,9 +403,8 @@ static struct hist_entry *hists__findnew_entry(struct hists *hists,* the history counter to increment. */ if (he->ms.map != entry->ms.map) { - he->ms.map = entry->ms.map; -if (he->ms.map) - he->ms.map->referenced = true; +map__put (he->ms.map); + he->ms.map =map__get (entry->ms.map); } goto out; }
@@ -933,8 +928,20 @@ hist_entry__collapse(struct hist_entry *left, struct hist_entry *right)void hist_entry__delete (struct hist_entry *he) {thread__zput (he->thread); -zfree (&he->branch_info); -zfree (&he->mem_info); +map__zput (he->ms.map); + +if (he->branch_info) { +map__zput (he->branch_info->from.map); +map__zput (he->branch_info->to.map); +zfree (&he->branch_info); + } + +if (he->mem_info) { +map__zput (he->mem_info->iaddr.map); +map__zput (he->mem_info->daddr.map); +zfree (&he->mem_info); + } +zfree (&he->stat_acc);free_srcline (he->srcline);free_callchain (he->callchain);
tools/perf/util/map.c +2 -56
104 lines not on this page · raw message
tools/perf/util/map.h +8 -2
@@ -34,7 +34,6 @@ struct map {u64 start;u64 end;u8 /* enum map_type */ type; -bool referenced;bool erange_warned;u32 priv;u32 prot;
@@ -63,7 +62,6 @@ struct kmap {struct maps {struct rb_root entries;pthread_rwlock_t lock; -struct list_head removed_maps; };struct map_groups {
@@ -161,6 +159,14 @@ static inline struct map *map__get(struct map *map)void map__put (struct map *map); +static inline void __map__zput (struct map **map) +{ +map__put (*map); + *map =NULL ; +} + +#define map__zput (map) __map__zput(&map) +int map__overlap (struct map *l,struct map *r);size_t map__fprintf (struct map *map,FILE *fp);size_t map__fprintf_dsoname (struct map *map,FILE *fp);