summaryrefslogtreecommitdiff
path: root/kernel/events
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/events')
-rw-r--r--kernel/events/core.c20
-rw-r--r--kernel/events/uprobes.c13
2 files changed, 19 insertions, 14 deletions
diff --git a/kernel/events/core.c b/kernel/events/core.c
index 421b897de71e..66d874e2b173 100644
--- a/kernel/events/core.c
+++ b/kernel/events/core.c
@@ -7005,7 +7005,7 @@ static void perf_mmap_open(struct vm_area_struct *vma)
refcount_inc(&event->mmap_count);
refcount_inc(&event->rb->mmap_count);
- if (vma->vm_pgoff)
+ if (vma_start_pgoff(vma))
refcount_inc(&event->rb->aux_mmap_count);
if (mapped)
@@ -7039,7 +7039,7 @@ static void perf_mmap_close(struct vm_area_struct *vma)
* The AUX buffer is strictly a sub-buffer, serialize using aux_mutex
* to avoid complications.
*/
- if (rb_has_aux(rb) && vma->vm_pgoff == rb->aux_pgoff &&
+ if (rb_has_aux(rb) && vma_start_pgoff(vma) == rb->aux_pgoff &&
refcount_dec_and_mutex_lock(&rb->aux_mmap_count, &rb->aux_mutex)) {
/*
* Stop all AUX events that are writing to this buffer,
@@ -7199,7 +7199,8 @@ static int map_range(struct perf_buffer *rb, struct vm_area_struct *vma)
*/
for (pagenum = 0; pagenum < nr_pages; pagenum++) {
unsigned long va = vma->vm_start + PAGE_SIZE * pagenum;
- struct page *page = perf_mmap_to_page(rb, vma->vm_pgoff + pagenum);
+ struct page *page = perf_mmap_to_page(rb,
+ vma_start_pgoff(vma) + pagenum);
if (page == NULL) {
err = -EINVAL;
@@ -7353,6 +7354,7 @@ static int perf_mmap_rb(struct vm_area_struct *vma, struct perf_event *event,
static int perf_mmap_aux(struct vm_area_struct *vma, struct perf_event *event,
unsigned long nr_pages)
{
+ const pgoff_t pgoff_start = vma_start_pgoff(vma);
long extra = 0, user_extra = nr_pages;
u64 aux_offset, aux_size;
struct perf_buffer *rb;
@@ -7375,11 +7377,11 @@ static int perf_mmap_aux(struct vm_area_struct *vma, struct perf_event *event,
if (aux_offset < perf_data_size(rb) + PAGE_SIZE)
return -EINVAL;
- if (aux_offset != vma->vm_pgoff << PAGE_SHIFT)
+ if (aux_offset != pgoff_start << PAGE_SHIFT)
return -EINVAL;
/* already mapped with a different offset */
- if (rb_has_aux(rb) && rb->aux_pgoff != vma->vm_pgoff)
+ if (rb_has_aux(rb) && rb->aux_pgoff != pgoff_start)
return -EINVAL;
if (aux_size != nr_pages * PAGE_SIZE)
@@ -7409,7 +7411,7 @@ static int perf_mmap_aux(struct vm_area_struct *vma, struct perf_event *event,
if (vma->vm_flags & VM_WRITE)
rb_flags |= RING_BUFFER_WRITABLE;
- ret = rb_alloc_aux(rb, event, vma->vm_pgoff, nr_pages,
+ ret = rb_alloc_aux(rb, event, pgoff_start, nr_pages,
event->attr.aux_watermark, rb_flags);
if (ret) {
refcount_dec(&rb->mmap_count);
@@ -7466,7 +7468,7 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
if (event->state <= PERF_EVENT_STATE_REVOKED)
return -ENODEV;
- if (vma->vm_pgoff == 0)
+ if (!vma_start_pgoff(vma))
ret = perf_mmap_rb(vma, event, nr_pages);
else
ret = perf_mmap_aux(vma, event, nr_pages);
@@ -9916,7 +9918,7 @@ static bool perf_addr_filter_vma_adjust(struct perf_addr_filter *filter,
struct perf_addr_filter_range *fr)
{
unsigned long vma_size = vma->vm_end - vma->vm_start;
- unsigned long off = vma->vm_pgoff << PAGE_SHIFT;
+ unsigned long off = vma_start_pgoff(vma) << PAGE_SHIFT;
struct file *file = vma->vm_file;
if (!perf_addr_filter_match(filter, file, off, vma_size))
@@ -10006,7 +10008,7 @@ void perf_event_mmap(struct vm_area_struct *vma)
/* .tid */
.start = vma->vm_start,
.len = vma->vm_end - vma->vm_start,
- .pgoff = (u64)vma->vm_pgoff << PAGE_SHIFT,
+ .pgoff = (u64)vma_start_pgoff(vma) << PAGE_SHIFT,
},
/* .maj (attr_mmap2 only) */
/* .min (attr_mmap2 only) */
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c
index a18529ab2b87..b25531331902 100644
--- a/kernel/events/uprobes.c
+++ b/kernel/events/uprobes.c
@@ -144,12 +144,14 @@ static bool valid_vma(struct vm_area_struct *vma, bool is_register)
static unsigned long offset_to_vaddr(struct vm_area_struct *vma, loff_t offset)
{
- return vma->vm_start + offset - ((loff_t)vma->vm_pgoff << PAGE_SHIFT);
+ return vma->vm_start + offset -
+ ((loff_t)vma_start_pgoff(vma) << PAGE_SHIFT);
}
static loff_t vaddr_to_offset(struct vm_area_struct *vma, unsigned long vaddr)
{
- return ((loff_t)vma->vm_pgoff << PAGE_SHIFT) + (vaddr - vma->vm_start);
+ return ((loff_t)vma_start_pgoff(vma) << PAGE_SHIFT) +
+ (vaddr - vma->vm_start);
}
/**
@@ -1211,7 +1213,7 @@ build_map_info(struct address_space *mapping, loff_t offset, bool is_register)
again:
i_mmap_lock_read(mapping);
- vma_interval_tree_foreach(vma, &mapping->i_mmap, pgoff, pgoff) {
+ mapping_rmap_tree_foreach(vma, mapping, pgoff, pgoff) {
if (!valid_vma(vma, is_register))
continue;
@@ -1483,7 +1485,7 @@ static int unapply_uprobe(struct uprobe *uprobe, struct mm_struct *mm)
file_inode(vma->vm_file) != uprobe->inode)
continue;
- offset = (loff_t)vma->vm_pgoff << PAGE_SHIFT;
+ offset = (loff_t)vma_start_pgoff(vma) << PAGE_SHIFT;
if (uprobe->offset < offset ||
uprobe->offset >= offset + vma->vm_end - vma->vm_start)
continue;
@@ -2448,7 +2450,8 @@ static struct uprobe *find_active_uprobe_speculative(unsigned long bp_vaddr)
if (!vm_file)
return NULL;
- offset = (loff_t)(vma->vm_pgoff << PAGE_SHIFT) + (bp_vaddr - vma->vm_start);
+ offset = (loff_t)(vma_start_pgoff(vma) << PAGE_SHIFT) +
+ (bp_vaddr - vma->vm_start);
uprobe = find_uprobe_rcu(vm_file->f_inode, offset);
if (!uprobe)
return NULL;