Patch "perf callchain: Reference count maps" has been added to the 4.9-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
perf callchain: Reference count maps
to the 4.9-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
perf-callchain-reference-count-maps.patch
and it can be found in the queue-4.9 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
aa33b9b9a2ebb00d33c83a5312d4fbf2d5aeba36Mon Sep 17 00:00:00 2001
From: Krister Johansen <[email protected]>
Date: Thu, 5 Jan 2017 22:23:31 -0800
Subject: perf callchain: Reference count maps
From: Krister Johansen <[email protected]>
commit aa33b9b9a2ebb00d33c83a5312d4fbf2d5aeba36 upstream.
If dso__load_kcore frees all of the existing maps, but one has already been attached to a callchain cursor node, then we can get a SIGSEGV in any function that happens to try to use this invalid cursor. Use the existing map refcount mechanism to forestall cleanup of a map until the cursor iterates past the node.
--- tools/perf/util/callchain.c | 11 +++++++++-- tools/perf/util/callchain.h | 6 ++++++ tools/perf/util/hist.c | 7 +++++++ 3 files changed, 22 insertions(+), 2 deletions(-)
tools/perf/util/callchain.c +9 -2
@@ -437,7 +437,7 @@ fill_node(struct callchain_node *node, s } call->ip = cursor_node->ip; call->ms.sym = cursor_node->sym; - call->ms.map = cursor_node->map; + call->ms.map =map__get (cursor_node->map);list_add_tail (&call->list, &node->val);callchain_cursor_advance (cursor);
@@ -462,6 +462,7 @@ add_child(struct callchain_node *parent,list_for_each_entry_safe (call, tmp, &new->val, list) {list_del (&call->list); +map__zput (call->ms.map);free (call); }free (new);
@@ -730,6 +731,7 @@ merge_chain_branch(struct callchain_curscallchain_cursor_append (cursor, list->ip, list->ms.map, list->ms.sym);list_del (&list->list); +map__zput (list->ms.map);free (list); }
@@ -778,7 +780,8 @@ int callchain_cursor_append(struct callc } node->ip = ip; - node->map = map; +map__zput (node->map); + node->map =map__get (map); node->sym = sym; cursor->nr++;
@@ -945,11 +948,13 @@ static void free_callchain_node(struct clist_for_each_entry_safe (list, tmp, &node->parent_val, list) {list_del (&list->list); +map__zput (list->ms.map);free (list); }list_for_each_entry_safe (list, tmp, &node->val, list) {list_del (&list->list); +map__zput (list->ms.map);free (list); }
@@ -1013,6 +1018,7 @@ int callchain_node__make_parent_list(str goto out; *new = *chain; new->has_children = false; +map__get (new->ms.map);list_add_tail (&new->list, &head); } parent = parent->parent;
@@ -1033,6 +1039,7 @@ int callchain_node__make_parent_list(str out:list_for_each_entry_safe (chain, new, &head, list) {list_del (&chain->list); +map__zput (chain->ms.map);free (chain); }return -ENOMEM ;
tools/perf/util/callchain.h +6 -0
@@ -5,6 +5,7 @@#include <linux/list.h> #include <linux/rbtree.h> #include "event.h" +#include "map.h" #include "symbol.h" #define HELP_PAD "\t\t\t\t"
@@ -174,8 +175,13 @@ int callchain_merge(struct callchain_cur*/ static inline void callchain_cursor_reset (struct callchain_cursor *cursor) { +struct callchain_cursor_node *node; + cursor->nr =0 ; cursor->last = &cursor->first; + +for (node = cursor->first; node !=NULL ; node = node->next) +map__zput (node->map); } int callchain_cursor_append(struct callchain_cursor *cursor, u64 ip,
tools/perf/util/hist.c +7 -0
@@ -1,6 +1,7 @@#include "util.h" #include "build-id.h" #include "hist.h" +#include "map.h" #include "session.h" #include "sort.h" #include "evlist.h"
@@ -1019,6 +1020,10 @@ int hist_entry_iter__add(struct hist_ent int max_stack_depth, void *arg) { int err, err2; +struct map *alm =NULL ; + +if (al && al->map) + alm =map__get (al->map); err =sample__resolve_callchain (iter->sample, &callchain_cursor, &iter->parent, iter->evsel, al, max_stack_depth);
@@ -1058,6 +1063,8 @@ out:if (!err) err = err2; +map__put (alm); +return err; }
Patches currently in stable-queue which might be from [email protected] are
queue-4.9/perf-callchain-reference-count-maps.patch