perf: Disable PERF_RECORD_MMAP2 support
For now, we disable the extended MMAP record support (MMAP2). We have identified cases where it would not report the correct mapping information, clone(VM_CLONE) but with separate pids. We will revisit the support once we find a solution for this case. The patch changes the kernel to return EINVAL if attr->mmap2 is set. The patch also modifies the perf tool to use regular PERF_RECORD_MMAP for synthetic events and it also prevents the tool from requesting attr->mmap2 mode because the kernel would reject it. The support will be revisited once the kenrel interface is updated. In V2, we reduce the patch to the strict minimum. In V3, we avoid calling perf_event_open() with mmap2 set because we know it will fail and require fallback retry. 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: Peter Zijlstra <peterz@infradead.org> Link: http://lkml.kernel.org/r/20131017173215.GA8820@quad Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Родитель
3b16ff8967
Коммит
3090ffb5a2
|
@ -6767,6 +6767,10 @@ static int perf_copy_attr(struct perf_event_attr __user *uattr,
|
||||||
if (ret)
|
if (ret)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
|
/* disabled for now */
|
||||||
|
if (attr->mmap2)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
if (attr->__reserved_1)
|
if (attr->__reserved_1)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
|
|
|
@ -187,7 +187,7 @@ static int perf_event__synthesize_mmap_events(struct perf_tool *tool,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
event->header.type = PERF_RECORD_MMAP2;
|
event->header.type = PERF_RECORD_MMAP;
|
||||||
/*
|
/*
|
||||||
* Just like the kernel, see __perf_event_mmap in kernel/perf_event.c
|
* Just like the kernel, see __perf_event_mmap in kernel/perf_event.c
|
||||||
*/
|
*/
|
||||||
|
@ -198,7 +198,6 @@ static int perf_event__synthesize_mmap_events(struct perf_tool *tool,
|
||||||
char prot[5];
|
char prot[5];
|
||||||
char execname[PATH_MAX];
|
char execname[PATH_MAX];
|
||||||
char anonstr[] = "//anon";
|
char anonstr[] = "//anon";
|
||||||
unsigned int ino;
|
|
||||||
size_t size;
|
size_t size;
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
|
|
||||||
|
@ -209,13 +208,10 @@ static int perf_event__synthesize_mmap_events(struct perf_tool *tool,
|
||||||
strcpy(execname, "");
|
strcpy(execname, "");
|
||||||
|
|
||||||
/* 00400000-0040c000 r-xp 00000000 fd:01 41038 /bin/cat */
|
/* 00400000-0040c000 r-xp 00000000 fd:01 41038 /bin/cat */
|
||||||
n = sscanf(bf, "%"PRIx64"-%"PRIx64" %s %"PRIx64" %x:%x %u %s\n",
|
n = sscanf(bf, "%"PRIx64"-%"PRIx64" %s %"PRIx64" %*x:%*x %*u %s\n",
|
||||||
&event->mmap2.start, &event->mmap2.len, prot,
|
&event->mmap.start, &event->mmap.len, prot,
|
||||||
&event->mmap2.pgoff, &event->mmap2.maj,
|
&event->mmap.pgoff,
|
||||||
&event->mmap2.min,
|
execname);
|
||||||
&ino, execname);
|
|
||||||
|
|
||||||
event->mmap2.ino = (u64)ino;
|
|
||||||
|
|
||||||
if (n != 8)
|
if (n != 8)
|
||||||
continue;
|
continue;
|
||||||
|
@ -227,15 +223,15 @@ static int perf_event__synthesize_mmap_events(struct perf_tool *tool,
|
||||||
strcpy(execname, anonstr);
|
strcpy(execname, anonstr);
|
||||||
|
|
||||||
size = strlen(execname) + 1;
|
size = strlen(execname) + 1;
|
||||||
memcpy(event->mmap2.filename, execname, size);
|
memcpy(event->mmap.filename, execname, size);
|
||||||
size = PERF_ALIGN(size, sizeof(u64));
|
size = PERF_ALIGN(size, sizeof(u64));
|
||||||
event->mmap2.len -= event->mmap.start;
|
event->mmap.len -= event->mmap.start;
|
||||||
event->mmap2.header.size = (sizeof(event->mmap2) -
|
event->mmap.header.size = (sizeof(event->mmap) -
|
||||||
(sizeof(event->mmap2.filename) - size));
|
(sizeof(event->mmap.filename) - size));
|
||||||
memset(event->mmap2.filename + size, 0, machine->id_hdr_size);
|
memset(event->mmap.filename + size, 0, machine->id_hdr_size);
|
||||||
event->mmap2.header.size += machine->id_hdr_size;
|
event->mmap.header.size += machine->id_hdr_size;
|
||||||
event->mmap2.pid = tgid;
|
event->mmap.pid = tgid;
|
||||||
event->mmap2.tid = pid;
|
event->mmap.tid = pid;
|
||||||
|
|
||||||
if (process(tool, event, &synth_sample, machine) != 0) {
|
if (process(tool, event, &synth_sample, machine) != 0) {
|
||||||
rc = -1;
|
rc = -1;
|
||||||
|
|
|
@ -678,7 +678,6 @@ void perf_evsel__config(struct perf_evsel *evsel,
|
||||||
attr->sample_type |= PERF_SAMPLE_WEIGHT;
|
attr->sample_type |= PERF_SAMPLE_WEIGHT;
|
||||||
|
|
||||||
attr->mmap = track;
|
attr->mmap = track;
|
||||||
attr->mmap2 = track && !perf_missing_features.mmap2;
|
|
||||||
attr->comm = track;
|
attr->comm = track;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Загрузка…
Ссылка в новой задаче