• Oleg Nesterov's avatar
    uprobes: Teach handler_chain() to filter out the probed task · da1816b1
    Oleg Nesterov authored
    Currrently the are 2 problems with pre-filtering:
    
    1. It is not possible to add/remove a task (mm) after uprobe_register()
    
    2. A forked child inherits all breakpoints and uprobe_consumer can not
       control this.
    
    This patch does the first step to improve the filtering. handler_chain()
    removes the breakpoints installed by this uprobe from current->mm if all
    handlers return UPROBE_HANDLER_REMOVE.
    
    Note that handler_chain() relies on ->register_rwsem to avoid the race
    with uprobe_register/unregister which can add/del a consumer, or even
    remove and then insert the new uprobe at the same address.
    
    Perhaps we will add uprobe_apply_mm(uprobe, mm, is_register) and teach
    copy_mm() to do filter(UPROBE_FILTER_FORK), but I think this change makes
    sense anyway.
    
    Note: instead of checking the retcode from uc->handler, we could add
    uc->filter(UPROBE_FILTER_BPHIT). But I think this is not optimal to
    call 2 hooks in a row. This buys nothing, and if handler/filter do
    something nontrivial they will probably do the same work twice.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    Acked-by: default avatarSrikar Dronamraju <srikar@linux.vnet.ibm.com>
    da1816b1
uprobes.c 39.4 KB