mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
perf symbols: Fix dso lookup by long name and missing buildids
Commit4598a0a6d2("perf symbols: Improve DSO long names lookup speed with rbtree") Added a tree to lookup dsos by long name. That tree gets corrupted whenever a dso long name is changed because the tree is not updated. One effect of that is buildid-list does not work with the 'with-hits' option because dso lookup fails and results in two structs for the same dso. The first has the buildid but no hits, the second has hits but no buildid. e.g. Before: $ tools/perf/perf record ls arch certs CREDITS Documentation firmware include ipc Kconfig lib Makefile net REPORTING-BUGS scripts sound usr block COPYING crypto drivers fs init Kbuild kernel MAINTAINERS mm README samples security tools virt [ perf record: Woken up 1 times to write data ] [ perf record: Captured and wrote 0.012 MB perf.data (11 samples) ] $ tools/perf/perf buildid-list 574da826c66538a8d9060d393a8866289bd06005 [kernel.kallsyms] 30c94dc66a1fe95180c3d68d2b89e576d5ae213c /lib/x86_64-linux-gnu/libc-2.19.so $ tools/perf/perf buildid-list -H 574da826c66538a8d9060d393a8866289bd06005 [kernel.kallsyms] 0000000000000000000000000000000000000000 /lib/x86_64-linux-gnu/libc-2.19.so After: $ tools/perf/perf buildid-list -H 574da826c66538a8d9060d393a8866289bd06005 [kernel.kallsyms] 30c94dc66a1fe95180c3d68d2b89e576d5ae213c /lib/x86_64-linux-gnu/libc-2.19.so The fix is to record the root of the tree on the dso so that dso__set_long_name() can update the tree when the long name changes. Signed-off-by: Adrian Hunter <[email protected]> Tested-by: Arnaldo Carvalho de Melo <[email protected]> Cc: Adrian Hunter <[email protected]> Cc: Don Zickus <[email protected]> Cc: Douglas Hatch <[email protected]> Cc: Jiri Olsa <[email protected]> Cc: Namhyung Kim <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Scott J Norton <[email protected]> Cc: Waiman Long <[email protected]> Fixes:4598a0a6d2("perf symbols: Improve DSO long names lookup speed with rbtree") Link: http://lkml.kernel.org/r/[email protected] Signed-off-by: Arnaldo Carvalho de Melo <[email protected]>
This commit is contained in:
parent
2059fc7a5a
commit
e266a753bf
3 changed files with 19 additions and 0 deletions
|
|
@ -933,6 +933,7 @@ static struct dso *__dso__findlink_by_longname(struct rb_root *root,
|
|||
/* Add new node and rebalance tree */
|
||||
rb_link_node(&dso->rb_node, parent, p);
|
||||
rb_insert_color(&dso->rb_node, root);
|
||||
dso->root = root;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
|
@ -945,15 +946,30 @@ static inline struct dso *__dso__find_by_longname(struct rb_root *root,
|
|||
|
||||
void dso__set_long_name(struct dso *dso, const char *name, bool name_allocated)
|
||||
{
|
||||
struct rb_root *root = dso->root;
|
||||
|
||||
if (name == NULL)
|
||||
return;
|
||||
|
||||
if (dso->long_name_allocated)
|
||||
free((char *)dso->long_name);
|
||||
|
||||
if (root) {
|
||||
rb_erase(&dso->rb_node, root);
|
||||
/*
|
||||
* __dso__findlink_by_longname() isn't guaranteed to add it
|
||||
* back, so a clean removal is required here.
|
||||
*/
|
||||
RB_CLEAR_NODE(&dso->rb_node);
|
||||
dso->root = NULL;
|
||||
}
|
||||
|
||||
dso->long_name = name;
|
||||
dso->long_name_len = strlen(name);
|
||||
dso->long_name_allocated = name_allocated;
|
||||
|
||||
if (root)
|
||||
__dso__findlink_by_longname(root, dso, NULL);
|
||||
}
|
||||
|
||||
void dso__set_short_name(struct dso *dso, const char *name, bool name_allocated)
|
||||
|
|
@ -1046,6 +1062,7 @@ struct dso *dso__new(const char *name)
|
|||
dso->kernel = DSO_TYPE_USER;
|
||||
dso->needs_swap = DSO_SWAP__UNSET;
|
||||
RB_CLEAR_NODE(&dso->rb_node);
|
||||
dso->root = NULL;
|
||||
INIT_LIST_HEAD(&dso->node);
|
||||
INIT_LIST_HEAD(&dso->data.open_entry);
|
||||
pthread_mutex_init(&dso->lock, NULL);
|
||||
|
|
|
|||
|
|
@ -135,6 +135,7 @@ struct dso {
|
|||
pthread_mutex_t lock;
|
||||
struct list_head node;
|
||||
struct rb_node rb_node; /* rbtree node sorted by long name */
|
||||
struct rb_root *root; /* root of rbtree that rb_node is in */
|
||||
struct rb_root symbols[MAP__NR_TYPES];
|
||||
struct rb_root symbol_names[MAP__NR_TYPES];
|
||||
struct {
|
||||
|
|
|
|||
|
|
@ -91,6 +91,7 @@ static void dsos__purge(struct dsos *dsos)
|
|||
|
||||
list_for_each_entry_safe(pos, n, &dsos->head, node) {
|
||||
RB_CLEAR_NODE(&pos->rb_node);
|
||||
pos->root = NULL;
|
||||
list_del_init(&pos->node);
|
||||
dso__put(pos);
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue