| From 0b3589be9b98994ce3d5aeca52445d1f5627c4ba Mon Sep 17 00:00:00 2001 |
| From: Peter Zijlstra <peterz@infradead.org> |
| Date: Thu, 26 Jan 2017 23:15:08 +0100 |
| Subject: perf/core: Fix PERF_RECORD_MMAP2 prot/flags for anonymous memory |
| |
| From: Peter Zijlstra <peterz@infradead.org> |
| |
| commit 0b3589be9b98994ce3d5aeca52445d1f5627c4ba upstream. |
| |
| Andres reported that MMAP2 records for anonymous memory always have |
| their protection field 0. |
| |
| Turns out, someone daft put the prot/flags generation code in the file |
| branch, leaving them unset for anonymous memory. |
| |
| Reported-by: Andres Freund <andres@anarazel.de> |
| Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> |
| Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com> |
| Cc: Arnaldo Carvalho de Melo <acme@redhat.com> |
| Cc: Don Zickus <dzickus@redhat.com |
| Cc: Jiri Olsa <jolsa@redhat.com> |
| Cc: Linus Torvalds <torvalds@linux-foundation.org> |
| Cc: Peter Zijlstra <peterz@infradead.org> |
| Cc: Stephane Eranian <eranian@gmail.com> |
| Cc: Stephane Eranian <eranian@google.com> |
| Cc: Thomas Gleixner <tglx@linutronix.de> |
| Cc: acme@kernel.org |
| Cc: anton@ozlabs.org |
| Cc: namhyung@kernel.org |
| Fixes: f972eb63b100 ("perf: Pass protection and flags bits through mmap2 interface") |
| Link: http://lkml.kernel.org/r/20170126221508.GF6536@twins.programming.kicks-ass.net |
| Signed-off-by: Ingo Molnar <mingo@kernel.org> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| kernel/events/core.c | 42 +++++++++++++++++++++--------------------- |
| 1 file changed, 21 insertions(+), 21 deletions(-) |
| |
| --- a/kernel/events/core.c |
| +++ b/kernel/events/core.c |
| @@ -6606,6 +6606,27 @@ static void perf_event_mmap_event(struct |
| char *buf = NULL; |
| char *name; |
| |
| + if (vma->vm_flags & VM_READ) |
| + prot |= PROT_READ; |
| + if (vma->vm_flags & VM_WRITE) |
| + prot |= PROT_WRITE; |
| + if (vma->vm_flags & VM_EXEC) |
| + prot |= PROT_EXEC; |
| + |
| + if (vma->vm_flags & VM_MAYSHARE) |
| + flags = MAP_SHARED; |
| + else |
| + flags = MAP_PRIVATE; |
| + |
| + if (vma->vm_flags & VM_DENYWRITE) |
| + flags |= MAP_DENYWRITE; |
| + if (vma->vm_flags & VM_MAYEXEC) |
| + flags |= MAP_EXECUTABLE; |
| + if (vma->vm_flags & VM_LOCKED) |
| + flags |= MAP_LOCKED; |
| + if (vma->vm_flags & VM_HUGETLB) |
| + flags |= MAP_HUGETLB; |
| + |
| if (file) { |
| struct inode *inode; |
| dev_t dev; |
| @@ -6632,27 +6653,6 @@ static void perf_event_mmap_event(struct |
| maj = MAJOR(dev); |
| min = MINOR(dev); |
| |
| - if (vma->vm_flags & VM_READ) |
| - prot |= PROT_READ; |
| - if (vma->vm_flags & VM_WRITE) |
| - prot |= PROT_WRITE; |
| - if (vma->vm_flags & VM_EXEC) |
| - prot |= PROT_EXEC; |
| - |
| - if (vma->vm_flags & VM_MAYSHARE) |
| - flags = MAP_SHARED; |
| - else |
| - flags = MAP_PRIVATE; |
| - |
| - if (vma->vm_flags & VM_DENYWRITE) |
| - flags |= MAP_DENYWRITE; |
| - if (vma->vm_flags & VM_MAYEXEC) |
| - flags |= MAP_EXECUTABLE; |
| - if (vma->vm_flags & VM_LOCKED) |
| - flags |= MAP_LOCKED; |
| - if (vma->vm_flags & VM_HUGETLB) |
| - flags |= MAP_HUGETLB; |
| - |
| goto got_name; |
| } else { |
| if (vma->vm_ops && vma->vm_ops->name) { |