diff options
| author | Peter Zijlstra <peterz@infradead.org> | 2017-01-26 17:15:08 -0500 |
|---|---|---|
| committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2017-02-09 02:08:26 -0500 |
| commit | b41615aa705626e0fbb5541e4715090370fe8c23 (patch) | |
| tree | 09b9d29203e93b39620756bffcb66668abb69421 /kernel/events | |
| parent | 3996a91e3bdc04b6e41d93a7de3e5c6b63db5cb3 (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.c | 42 |
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) { |
