aboutsummaryrefslogtreecommitdiffstats
path: root/kernel/events
diff options
context:
space:
mode:
authorPeter Zijlstra <peterz@infradead.org>2017-01-26 17:15:08 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2017-02-09 02:08:26 -0500
commitb41615aa705626e0fbb5541e4715090370fe8c23 (patch)
tree09b9d29203e93b39620756bffcb66668abb69421 /kernel/events
parent3996a91e3bdc04b6e41d93a7de3e5c6b63db5cb3 (diff)
perf/core: Fix PERF_RECORD_MMAP2 prot/flags for anonymous memory
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>
Diffstat (limited to 'kernel/events')
-rw-r--r--kernel/events/core.c42
1 files changed, 21 insertions, 21 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 6e440c4d17fe..b1cfd7416db0 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -6606,6 +6606,27 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event)
6606 char *buf = NULL; 6606 char *buf = NULL;
6607 char *name; 6607 char *name;
6608 6608
6609 if (vma->vm_flags & VM_READ)
6610 prot |= PROT_READ;
6611 if (vma->vm_flags & VM_WRITE)
6612 prot |= PROT_WRITE;
6613 if (vma->vm_flags & VM_EXEC)
6614 prot |= PROT_EXEC;
6615
6616 if (vma->vm_flags & VM_MAYSHARE)
6617 flags = MAP_SHARED;
6618 else
6619 flags = MAP_PRIVATE;
6620
6621 if (vma->vm_flags & VM_DENYWRITE)
6622 flags |= MAP_DENYWRITE;
6623 if (vma->vm_flags & VM_MAYEXEC)
6624 flags |= MAP_EXECUTABLE;
6625 if (vma->vm_flags & VM_LOCKED)
6626 flags |= MAP_LOCKED;
6627 if (vma->vm_flags & VM_HUGETLB)
6628 flags |= MAP_HUGETLB;
6629
6609 if (file) { 6630 if (file) {
6610 struct inode *inode; 6631 struct inode *inode;
6611 dev_t dev; 6632 dev_t dev;
@@ -6632,27 +6653,6 @@ static void perf_event_mmap_event(struct perf_mmap_event *mmap_event)
6632 maj = MAJOR(dev); 6653 maj = MAJOR(dev);
6633 min = MINOR(dev); 6654 min = MINOR(dev);
6634 6655
6635 if (vma->vm_flags & VM_READ)
6636 prot |= PROT_READ;
6637 if (vma->vm_flags & VM_WRITE)
6638 prot |= PROT_WRITE;
6639 if (vma->vm_flags & VM_EXEC)
6640 prot |= PROT_EXEC;
6641
6642 if (vma->vm_flags & VM_MAYSHARE)
6643 flags = MAP_SHARED;
6644 else
6645 flags = MAP_PRIVATE;
6646
6647 if (vma->vm_flags & VM_DENYWRITE)
6648 flags |= MAP_DENYWRITE;
6649 if (vma->vm_flags & VM_MAYEXEC)
6650 flags |= MAP_EXECUTABLE;
6651 if (vma->vm_flags & VM_LOCKED)
6652 flags |= MAP_LOCKED;
6653 if (vma->vm_flags & VM_HUGETLB)
6654 flags |= MAP_HUGETLB;
6655
6656 goto got_name; 6656 goto got_name;
6657 } else { 6657 } else {
6658 if (vma->vm_ops && vma->vm_ops->name) { 6658 if (vma->vm_ops && vma->vm_ops->name) {