• Masami Hiramatsu's avatar
    fprobe: Introduce FPROBE_FL_KPROBE_SHARED flag for fprobe · ab51e15d
    Masami Hiramatsu authored
    Introduce FPROBE_FL_KPROBE_SHARED flag for sharing fprobe callback with
    kprobes safely from the viewpoint of recursion.
    
    Since the recursion safety of the fprobe (and ftrace) is a bit different
    from the kprobes, this may cause an issue if user wants to run the same
    code from the fprobe and the kprobes.
    
    The kprobes has per-cpu 'current_kprobe' variable which protects the
    kprobe handler from recursion in any case. On the other hand, the fprobe
    uses only ftrace_test_recursion_trylock(), which will allow interrupt
    context calls another (or same) fprobe during the fprobe user handler is
    running.
    
    This is not a matter in cases if the common callback shared among the
    kprobes and the fprobe has its own recursion detection, or it can handle
    the recursion in the different contexts (normal/interrupt/NMI.)
    But if it relies on the 'current_kprobe' recursion lock, it has to check
    kprobe_running() and use kprobe_busy_*() APIs.
    
    Fprobe has FPROBE_FL_KPROBE_SHARED flag to do this. If your common callback
    code will be shared with kprobes, please set FPROBE_FL_KPROBE_SHARED
    *before* registering the fprobe, like;
    
     fprobe.flags = FPROBE_FL_KPROBE_SHARED;
    
     register_fprobe(&fprobe, "func*", NULL);
    
    This will protect your common callback from the nested call.
    Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
    Signed-off-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    Tested-by: default avatarSteven Rostedt (Google) <rostedt@goodmis.org>
    Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
    Link: https://lore.kernel.org/bpf/164735293127.1084943.15687374237275817599.stgit@devnote2
    ab51e15d
fprobe.c 7.58 KB