diff options
author | Oleg Nesterov <oleg@redhat.com> | 2012-07-29 20:22:36 +0200 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2012-07-30 11:27:22 +0200 |
commit | 6dab3cc078e3da0d26534410bc9e018a17031d95 (patch) | |
tree | a740adc15cd054401f197182d285e9906747a738 | |
parent | aefd8933d445abf7ff0d4027c624737898827bcd (diff) | |
download | linux-3.10-6dab3cc078e3da0d26534410bc9e018a17031d95.tar.gz linux-3.10-6dab3cc078e3da0d26534410bc9e018a17031d95.tar.bz2 linux-3.10-6dab3cc078e3da0d26534410bc9e018a17031d95.zip |
uprobes: Remove copy_vma()->uprobe_mmap()
Remove copy_vma()->uprobe_mmap(new_vma), it is absolutely wrong.
This new_vma was just initialized to represent the new unmapped
area, [vm_start, vm_end) was returned by get_unmapped_area() in
the caller.
This means that uprobe_mmap()->get_user_pages() will fail for
sure, simply because find_vma() can never succeed. And I
verified that sys_mremap()->mremap_to() indeed always fails with
the wrong ENOMEM code if [addr, addr+old_len] is probed.
And why this uprobe_mmap() was added? I believe the intent was
wrong. Note that the caller is going to do move_page_tables(),
all registered uprobes are already faulted in, we only change
the virtual addresses.
NOTE: However, somehow we need to close the race with
uprobe_register() which relies on map_info->vaddr. This needs
another fix I'll try to do later. Probably we need uprobe_mmap()
in move_vma() but we can not do this right now, this can confuse
uprobes_state.counter (which I still hope we are going to kill).
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Acked-by: Srikar Dronamraju <srikar.vnet.ibm.com>
Cc: Anton Arapov <anton@redhat.com>
Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
Link: http://lkml.kernel.org/r/20120729182236.GA20342@redhat.com
Signed-off-by: Ingo Molnar <mingo@kernel.org>
-rw-r--r-- | mm/mmap.c | 3 |
1 files changed, 0 insertions, 3 deletions
diff --git a/mm/mmap.c b/mm/mmap.c index 3edfcdfa42d..e5a46149d1f 100644 --- a/mm/mmap.c +++ b/mm/mmap.c @@ -2418,9 +2418,6 @@ struct vm_area_struct *copy_vma(struct vm_area_struct **vmap, if (new_vma->vm_file) { get_file(new_vma->vm_file); - if (uprobe_mmap(new_vma)) - goto out_free_mempol; - if (vma->vm_flags & VM_EXECUTABLE) added_exe_file_vma(mm); } |