diff options
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/events/uprobes.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/kernel/events/uprobes.c b/kernel/events/uprobes.c index 2ef123306183..b03256cced52 100644 --- a/kernel/events/uprobes.c +++ b/kernel/events/uprobes.c | |||
@@ -122,6 +122,11 @@ static loff_t vma_address(struct vm_area_struct *vma, loff_t offset) | |||
122 | return vaddr; | 122 | return vaddr; |
123 | } | 123 | } |
124 | 124 | ||
125 | static loff_t vaddr_to_offset(struct vm_area_struct *vma, unsigned long vaddr) | ||
126 | { | ||
127 | return ((loff_t)vma->vm_pgoff << PAGE_SHIFT) + (vaddr - vma->vm_start); | ||
128 | } | ||
129 | |||
125 | /** | 130 | /** |
126 | * __replace_page - replace page in vma by new page. | 131 | * __replace_page - replace page in vma by new page. |
127 | * based on replace_page in mm/ksm.c | 132 | * based on replace_page in mm/ksm.c |
@@ -978,7 +983,7 @@ static void build_probe_list(struct inode *inode, | |||
978 | struct uprobe *u; | 983 | struct uprobe *u; |
979 | 984 | ||
980 | INIT_LIST_HEAD(head); | 985 | INIT_LIST_HEAD(head); |
981 | min = ((loff_t)vma->vm_pgoff << PAGE_SHIFT) + start - vma->vm_start; | 986 | min = vaddr_to_offset(vma, start); |
982 | max = min + (end - start) - 1; | 987 | max = min + (end - start) - 1; |
983 | 988 | ||
984 | spin_lock_irqsave(&uprobes_treelock, flags); | 989 | spin_lock_irqsave(&uprobes_treelock, flags); |
@@ -1442,12 +1447,9 @@ static struct uprobe *find_active_uprobe(unsigned long bp_vaddr, int *is_swbp) | |||
1442 | vma = find_vma(mm, bp_vaddr); | 1447 | vma = find_vma(mm, bp_vaddr); |
1443 | if (vma && vma->vm_start <= bp_vaddr) { | 1448 | if (vma && vma->vm_start <= bp_vaddr) { |
1444 | if (valid_vma(vma, false)) { | 1449 | if (valid_vma(vma, false)) { |
1445 | struct inode *inode; | 1450 | struct inode *inode = vma->vm_file->f_mapping->host; |
1446 | loff_t offset; | 1451 | loff_t offset = vaddr_to_offset(vma, bp_vaddr); |
1447 | 1452 | ||
1448 | inode = vma->vm_file->f_mapping->host; | ||
1449 | offset = bp_vaddr - vma->vm_start; | ||
1450 | offset += (loff_t)vma->vm_pgoff << PAGE_SHIFT; | ||
1451 | uprobe = find_uprobe(inode, offset); | 1453 | uprobe = find_uprobe(inode, offset); |
1452 | } | 1454 | } |
1453 | 1455 | ||