• O
    uprobes: Change register_for_each_vma() to take mm->mmap_sem for writing · 77fc4af1
    Oleg Nesterov 提交于
    Change register_for_each_vma() to take mm->mmap_sem for writing.
    This is a bit unfortunate but hopefully not too bad, this is the
    slow path anyway.
    
    This is needed to ensure that find_active_uprobe() can not race
    with uprobe_register() which adds the new bp at the same
    bp_vaddr, after find_uprobe() fails and before
    is_swbp_at_addr_fast() checks the memory.
    
    IOW, this is needed to ensure that if find_active_uprobe()
    returns NULL but is_swbp == true, we can safely assume that it
    was the "normal" int3 and we should send SIGTRAP.
    
    There is another reason for this change. We are going to replace
    uprobes_state->count with MMF_ flags set by register/unregister
    and cleared by find_active_uprobe(), and set/clear shouldn't
    race with each other.
    Signed-off-by: NOleg Nesterov <oleg@redhat.com>
    Acked-by: NSrikar Dronamraju <srikar@linux.vnet.ibm.com>
    Cc: Ananth N Mavinakayanahalli <ananth@in.ibm.com>
    Cc: Anton Arapov <anton@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/20120529192928.GE8057@redhat.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
    77fc4af1
uprobes.c 39.9 KB