• Oleg Nesterov's avatar
    uprobes: __replace_page() should not use page_address_in_vma() · c517ee74
    Oleg Nesterov authored
    page_address_in_vma(old_page) in __replace_page() is ugly and
    wrong. The caller already knows the correct virtual address,
    this page was found by get_user_pages(vaddr).
    
    However, page_address_in_vma() can actually fail if
    page->mapping was cleared by __delete_from_page_cache() after
    get_user_pages() returns. But this means the race with page
    reclaim, write_opcode() should not fail, it should retry and
    read this page again. Probably the race with remove_mapping() is
    not possible due to page_freeze_refs() logic, but afaics at
    least shmem_writepage()->shmem_delete_from_page_cache() can
    clear ->mapping.
    
    We could change __replace_page() to return -EAGAIN in this case,
    but it would be better to simply use the caller's vaddr and rely
    on page_check_address().
    Signed-off-by: default avatarOleg 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/20120729182216.GA20311@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    c517ee74
uprobes.c 38.8 KB