• Oleg Nesterov's avatar
    uprobes: Teach handle_swbp() to rely on "is_swbp" rather than uprobes_srcu · 56bb4cf6
    Oleg Nesterov authored
    Currently handle_swbp() assumes that it can't race with
    unregister, so it roughly does:
    
    	if (find_uprobe(vaddr))
    		process_uprobe();
    	else
    		send_sig(SIGTRAP);
    
    This relies on the not-really-working uprobes_srcu code we are
    going to remove, see the next patch.
    
    With this patch we rely on the result of
    is_swbp_at_addr(bp_vaddr) if find_uprobe() fails.
    
    If is_swbp == 1, then we hit the normal int3, we should send
    SIGTRAP.
    
    If is_swbp == 0, we raced with uprobe_unregister(), we simply
    restart this insn again.
    
    The "difficult" case is is_swbp == -EFAULT, when we can't read
    this memory. In this case I think we should restart too, and
    this is more correct compared to the current code which sends
    SIGTRAP.
    
    Ignoring ENOMEM/etc from get_user_pages(), this can only happen
    if another thread unmaps this memory before find_active_uprobe()
    takes mmap_sem. It would be better to pretend it was unmapped
    before this insn was executed, restart, and get SIGSEGV.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarSrikar 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/20120529192947.GF8057@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    56bb4cf6
uprobes.c 40.4 KB