• Oleg Nesterov's avatar
    uprobes: Introduce uprobe_apply() · bdf8647c
    Oleg Nesterov authored
    Currently it is not possible to change the filtering constraints after
    uprobe_register(), so a consumer can not, say, start to trace a task/mm
    which was previously filtered out, or remove the no longer needed bp's.
    
    Introduce uprobe_apply() which simply does register_for_each_vma() again
    to consult uprobe_consumer->filter() and install/remove the breakpoints.
    The only complication is that register_for_each_vma() can no longer
    assume that uprobe->consumers should be consulter if is_register == T,
    so we change it to accept "struct uprobe_consumer *new" instead.
    
    Unlike uprobe_register(), uprobe_apply(true) doesn't do "unregister" if
    register_for_each_vma() fails, it is up to caller to handle the error.
    
    Note: we probably need to cleanup the current interface, it is strange
    that uprobe_apply/unregister need inode/offset. We should either change
    uprobe_register() to return "struct uprobe *", or add a private ->uprobe
    member in uprobe_consumer. And in the long term uprobe_apply() should
    take a single argument, uprobe or consumer, even "bool add" should go
    away.
    Signed-off-by: default avatarOleg Nesterov <oleg@redhat.com>
    bdf8647c
uprobes.c 40.1 KB