perf tools: Add attr->mmap2 support
This patch adds support for the new PERF_RECORD_MMAP2 record type
exposed by the kernel. This is an extended PERF_RECORD_MMAP record.
It adds for each file-backed mapping the device major, minor number and
the inode number and generation.
This triplet uniquely identifies the source of a file-backed mapping. It
can be used to detect identical virtual mappings between processes, for
instance.
The patch will prefer MMAP2 over MMAP.
Signed-off-by: Stephane Eranian <eranian@google.com>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Ingo Molnar <mingo@elte.hu>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung.kim@lge.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/1377079825-19057-3-git-send-email-eranian@google.com
[ Cope with 314add6
"Change machine__findnew_thread() to set thread pid",
fix 'perf test' regression test entry affected,
use perf_missing_features.mmap2 to fallback to not using .mmap2 in older kernels,
so that new tools can work with kernels where this feature is not present ]
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
e71aa28312
commit
5c5e854bc7
17 changed files with 200 additions and 25 deletions
|
@ -351,6 +351,25 @@ static void perf_event__mmap_swap(union perf_event *event,
|
|||
}
|
||||
}
|
||||
|
||||
static void perf_event__mmap2_swap(union perf_event *event,
|
||||
bool sample_id_all)
|
||||
{
|
||||
event->mmap2.pid = bswap_32(event->mmap2.pid);
|
||||
event->mmap2.tid = bswap_32(event->mmap2.tid);
|
||||
event->mmap2.start = bswap_64(event->mmap2.start);
|
||||
event->mmap2.len = bswap_64(event->mmap2.len);
|
||||
event->mmap2.pgoff = bswap_64(event->mmap2.pgoff);
|
||||
event->mmap2.maj = bswap_32(event->mmap2.maj);
|
||||
event->mmap2.min = bswap_32(event->mmap2.min);
|
||||
event->mmap2.ino = bswap_64(event->mmap2.ino);
|
||||
|
||||
if (sample_id_all) {
|
||||
void *data = &event->mmap2.filename;
|
||||
|
||||
data += PERF_ALIGN(strlen(data) + 1, sizeof(u64));
|
||||
swap_sample_id_all(event, data);
|
||||
}
|
||||
}
|
||||
static void perf_event__task_swap(union perf_event *event, bool sample_id_all)
|
||||
{
|
||||
event->fork.pid = bswap_32(event->fork.pid);
|
||||
|
@ -455,6 +474,7 @@ typedef void (*perf_event__swap_op)(union perf_event *event,
|
|||
|
||||
static perf_event__swap_op perf_event__swap_ops[] = {
|
||||
[PERF_RECORD_MMAP] = perf_event__mmap_swap,
|
||||
[PERF_RECORD_MMAP2] = perf_event__mmap2_swap,
|
||||
[PERF_RECORD_COMM] = perf_event__comm_swap,
|
||||
[PERF_RECORD_FORK] = perf_event__task_swap,
|
||||
[PERF_RECORD_EXIT] = perf_event__task_swap,
|
||||
|
@ -851,7 +871,8 @@ static struct machine *
|
|||
(cpumode == PERF_RECORD_MISC_GUEST_USER))) {
|
||||
u32 pid;
|
||||
|
||||
if (event->header.type == PERF_RECORD_MMAP)
|
||||
if (event->header.type == PERF_RECORD_MMAP
|
||||
|| event->header.type == PERF_RECORD_MMAP2)
|
||||
pid = event->mmap.pid;
|
||||
else
|
||||
pid = sample->pid;
|
||||
|
@ -978,6 +999,8 @@ static int perf_session_deliver_event(struct perf_session *session,
|
|||
sample, evsel, machine);
|
||||
case PERF_RECORD_MMAP:
|
||||
return tool->mmap(tool, event, sample, machine);
|
||||
case PERF_RECORD_MMAP2:
|
||||
return tool->mmap2(tool, event, sample, machine);
|
||||
case PERF_RECORD_COMM:
|
||||
return tool->comm(tool, event, sample, machine);
|
||||
case PERF_RECORD_FORK:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue