Commit 5b6a42fc authored by Adrian Hunter's avatar Adrian Hunter Committed by Arnaldo Carvalho de Melo

perf tools: Fix buildid cache handling of kallsyms with kcore

When kallsyms is used with kcore the dso long_name becomes the kcore
file name.  That prevents the buildid cache from caching kallsyms.
(There is no support at present for caching kcore).  Fix by changing it
so that the kallsyms name is used in that case instead.
Signed-off-by: default avatarAdrian Hunter <adrian.hunter@intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Namhyung Kim <namhyung@gmail.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1379009959-28046-1-git-send-email-adrian.hunter@intel.com
[ Kept 'struct foo' pointer as first parameter of foo__ prefixed functions ]
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 886b37ba
...@@ -199,9 +199,11 @@ static int write_buildid(char *name, size_t name_len, u8 *build_id, ...@@ -199,9 +199,11 @@ static int write_buildid(char *name, size_t name_len, u8 *build_id,
return write_padded(fd, name, name_len + 1, len); return write_padded(fd, name, name_len + 1, len);
} }
static int __dsos__write_buildid_table(struct list_head *head, pid_t pid, static int __dsos__write_buildid_table(struct list_head *head,
u16 misc, int fd) struct machine *machine,
pid_t pid, u16 misc, int fd)
{ {
char nm[PATH_MAX];
struct dso *pos; struct dso *pos;
dsos__for_each_with_build_id(pos, head) { dsos__for_each_with_build_id(pos, head) {
...@@ -215,6 +217,10 @@ static int __dsos__write_buildid_table(struct list_head *head, pid_t pid, ...@@ -215,6 +217,10 @@ static int __dsos__write_buildid_table(struct list_head *head, pid_t pid,
if (is_vdso_map(pos->short_name)) { if (is_vdso_map(pos->short_name)) {
name = (char *) VDSO__MAP_NAME; name = (char *) VDSO__MAP_NAME;
name_len = sizeof(VDSO__MAP_NAME) + 1; name_len = sizeof(VDSO__MAP_NAME) + 1;
} else if (dso__is_kcore(pos)) {
machine__mmap_name(machine, nm, sizeof(nm));
name = nm;
name_len = strlen(nm) + 1;
} else { } else {
name = pos->long_name; name = pos->long_name;
name_len = pos->long_name_len + 1; name_len = pos->long_name_len + 1;
...@@ -240,10 +246,10 @@ static int machine__write_buildid_table(struct machine *machine, int fd) ...@@ -240,10 +246,10 @@ static int machine__write_buildid_table(struct machine *machine, int fd)
umisc = PERF_RECORD_MISC_GUEST_USER; umisc = PERF_RECORD_MISC_GUEST_USER;
} }
err = __dsos__write_buildid_table(&machine->kernel_dsos, machine->pid, err = __dsos__write_buildid_table(&machine->kernel_dsos, machine,
kmisc, fd); machine->pid, kmisc, fd);
if (err == 0) if (err == 0)
err = __dsos__write_buildid_table(&machine->user_dsos, err = __dsos__write_buildid_table(&machine->user_dsos, machine,
machine->pid, umisc, fd); machine->pid, umisc, fd);
return err; return err;
} }
...@@ -375,23 +381,31 @@ int build_id_cache__remove_s(const char *sbuild_id, const char *debugdir) ...@@ -375,23 +381,31 @@ int build_id_cache__remove_s(const char *sbuild_id, const char *debugdir)
return err; return err;
} }
static int dso__cache_build_id(struct dso *dso, const char *debugdir) static int dso__cache_build_id(struct dso *dso, struct machine *machine,
const char *debugdir)
{ {
bool is_kallsyms = dso->kernel && dso->long_name[0] != '/'; bool is_kallsyms = dso->kernel && dso->long_name[0] != '/';
bool is_vdso = is_vdso_map(dso->short_name); bool is_vdso = is_vdso_map(dso->short_name);
char *name = dso->long_name;
char nm[PATH_MAX];
return build_id_cache__add_b(dso->build_id, sizeof(dso->build_id), if (dso__is_kcore(dso)) {
dso->long_name, debugdir, is_kallsyms = true;
is_kallsyms, is_vdso); machine__mmap_name(machine, nm, sizeof(nm));
name = nm;
}
return build_id_cache__add_b(dso->build_id, sizeof(dso->build_id), name,
debugdir, is_kallsyms, is_vdso);
} }
static int __dsos__cache_build_ids(struct list_head *head, const char *debugdir) static int __dsos__cache_build_ids(struct list_head *head,
struct machine *machine, const char *debugdir)
{ {
struct dso *pos; struct dso *pos;
int err = 0; int err = 0;
dsos__for_each_with_build_id(pos, head) dsos__for_each_with_build_id(pos, head)
if (dso__cache_build_id(pos, debugdir)) if (dso__cache_build_id(pos, machine, debugdir))
err = -1; err = -1;
return err; return err;
...@@ -399,8 +413,9 @@ static int __dsos__cache_build_ids(struct list_head *head, const char *debugdir) ...@@ -399,8 +413,9 @@ static int __dsos__cache_build_ids(struct list_head *head, const char *debugdir)
static int machine__cache_build_ids(struct machine *machine, const char *debugdir) static int machine__cache_build_ids(struct machine *machine, const char *debugdir)
{ {
int ret = __dsos__cache_build_ids(&machine->kernel_dsos, debugdir); int ret = __dsos__cache_build_ids(&machine->kernel_dsos, machine,
ret |= __dsos__cache_build_ids(&machine->user_dsos, debugdir); debugdir);
ret |= __dsos__cache_build_ids(&machine->user_dsos, machine, debugdir);
return ret; return ret;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment