Commit 18c3daa4 authored by Arnaldo Carvalho de Melo's avatar Arnaldo Carvalho de Melo Committed by Ingo Molnar

perf record: Encode the domain while synthesizing MMAP events

In the past 'perf record' had to process only userspace MMAP
events, the ones generated in the kernel, but after we reused
the MMAP events to encode the module mapings we ended up adding
them first to the list of userspace DSOs (dsos__user) and to the
kernel one (dsos__kernel).

Fix this by encoding the header.misc field and then using it,
like other parts to decide the right DSOs list to insert/find.

The gotcha here is that since the kernel puts zero in .misc,
which isn't PERF_RECORD_MISC_KERNEL (1 << 1), to differentiate,
we put 1 in .misc.
Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Paul Mackerras <paulus@samba.org>
LKML-Reference: <1263519930-22803-2-git-send-email-acme@infradead.org>
Signed-off-by: default avatarIngo Molnar <mingo@elte.hu>
parent cf4e5b08
...@@ -117,8 +117,12 @@ static void write_event(event_t *buf, size_t size) ...@@ -117,8 +117,12 @@ static void write_event(event_t *buf, size_t size)
* Add it to the list of DSOs, so that when we finish this * Add it to the list of DSOs, so that when we finish this
* record session we can pick the available build-ids. * record session we can pick the available build-ids.
*/ */
if (buf->header.type == PERF_RECORD_MMAP) if (buf->header.type == PERF_RECORD_MMAP) {
dsos__findnew(buf->mmap.filename); struct list_head *head = &dsos__user;
if (buf->mmap.header.misc == 1)
head = &dsos__kernel;
__dsos__findnew(head, buf->mmap.filename);
}
write_output(buf, size); write_output(buf, size);
} }
......
...@@ -110,7 +110,10 @@ static int event__synthesize_mmap_events(pid_t pid, pid_t tgid, ...@@ -110,7 +110,10 @@ static int event__synthesize_mmap_events(pid_t pid, pid_t tgid,
while (1) { while (1) {
char bf[BUFSIZ], *pbf = bf; char bf[BUFSIZ], *pbf = bf;
event_t ev = { event_t ev = {
.header = { .type = PERF_RECORD_MMAP }, .header = {
.type = PERF_RECORD_MMAP,
.misc = 0, /* Just like the kernel, see kernel/perf_event.c __perf_event_mmap */
},
}; };
int n; int n;
size_t size; size_t size;
...@@ -170,6 +173,7 @@ int event__synthesize_modules(event__handler_t process, ...@@ -170,6 +173,7 @@ int event__synthesize_modules(event__handler_t process,
size = ALIGN(pos->dso->long_name_len + 1, sizeof(u64)); size = ALIGN(pos->dso->long_name_len + 1, sizeof(u64));
memset(&ev, 0, sizeof(ev)); memset(&ev, 0, sizeof(ev));
ev.mmap.header.misc = 1; /* kernel uses 0 for user space maps, see kernel/perf_event.c __perf_event_mmap */
ev.mmap.header.type = PERF_RECORD_MMAP; ev.mmap.header.type = PERF_RECORD_MMAP;
ev.mmap.header.size = (sizeof(ev.mmap) - ev.mmap.header.size = (sizeof(ev.mmap) -
(sizeof(ev.mmap.filename) - size)); (sizeof(ev.mmap.filename) - size));
...@@ -236,7 +240,10 @@ int event__synthesize_kernel_mmap(event__handler_t process, ...@@ -236,7 +240,10 @@ int event__synthesize_kernel_mmap(event__handler_t process,
{ {
size_t size; size_t size;
event_t ev = { event_t ev = {
.header = { .type = PERF_RECORD_MMAP }, .header = {
.type = PERF_RECORD_MMAP,
.misc = 1, /* kernel uses 0 for user space maps, see kernel/perf_event.c __perf_event_mmap */
},
}; };
/* /*
* We should get this from /sys/kernel/sections/.text, but till that is * We should get this from /sys/kernel/sections/.text, but till that is
......
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