• JP Kobryn's avatar
    kprobes: consistent rcu api usage for kretprobe holder · d839a656
    JP Kobryn authored
    It seems that the pointer-to-kretprobe "rp" within the kretprobe_holder is
    RCU-managed, based on the (non-rethook) implementation of get_kretprobe().
    The thought behind this patch is to make use of the RCU API where possible
    when accessing this pointer so that the needed barriers are always in place
    and to self-document the code.
    
    The __rcu annotation to "rp" allows for sparse RCU checking. Plain writes
    done to the "rp" pointer are changed to make use of the RCU macro for
    assignment. For the single read, the implementation of get_kretprobe()
    is simplified by making use of an RCU macro which accomplishes the same,
    but note that the log warning text will be more generic.
    
    I did find that there is a difference in assembly generated between the
    usage of the RCU macros vs without. For example, on arm64, when using
    rcu_assign_pointer(), the corresponding store instruction is a
    store-release (STLR) which has an implicit barrier. When normal assignment
    is done, a regular store (STR) is found. In the macro case, this seems to
    be a result of rcu_assign_pointer() using smp_store_release() when the
    value to write is not NULL.
    
    Link: https://lore.kernel.org/all/20231122132058.3359-1-inwardvessel@gmail.com/
    
    Fixes: d741bf41 ("kprobes: Remove kretprobe hash")
    Cc: stable@vger.kernel.org
    Signed-off-by: default avatarJP Kobryn <inwardvessel@gmail.com>
    Acked-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
    Signed-off-by: default avatarMasami Hiramatsu (Google) <mhiramat@kernel.org>
    d839a656
kprobes.c 73.9 KB