• Dave Marchevsky's avatar
    libbpf: Support triple-underscore flavors for kfunc relocation · 5964a223
    Dave Marchevsky authored
    
    
    The function signature of kfuncs can change at any time due to their
    intentional lack of stability guarantees. As kfuncs become more widely
    used, BPF program writers will need facilities to support calling
    different versions of a kfunc from a single BPF object. Consider this
    simplified example based on a real scenario we ran into at Meta:
    
      /* initial kfunc signature */
      int some_kfunc(void *ptr)
    
      /* Oops, we need to add some flag to modify behavior. No problem,
        change the kfunc. flags = 0 retains original behavior */
      int some_kfunc(void *ptr, long flags)
    
    If the initial version of the kfunc is deployed on some portion of the
    fleet and the new version on the rest, a fleetwide service that uses
    some_kfunc will currently need to load different BPF programs depending
    on which some_kfunc is available.
    
    Luckily CO-RE provides a facility to solve a very similar problem,
    struct definition changes, by allowing program writers to declare
    my_struct___old and my_struct___new, with ___suffix being considered a
    'flavor' of the non-suffixed name and being ignored by
    bpf_core_type_exists and similar calls.
    
    This patch extends the 'flavor' facility to the kfunc extern
    relocation process. BPF program writers can now declare
    
      extern int some_kfunc___old(void *ptr)
      extern int some_kfunc___new(void *ptr, int flags)
    
    then test which version of the kfunc exists with bpf_ksym_exists.
    Relocation and verifier's dead code elimination will work in concert as
    expected, allowing this pattern:
    
      if (bpf_ksym_exists(some_kfunc___old))
        some_kfunc___old(ptr);
      else
        some_kfunc___new(ptr, 0);
    Signed-off-by: default avatarDave Marchevsky <davemarchevsky@fb.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Acked-by: default avatarDavid Vernet <void@manifault.com>
    Acked-by: default avatarJiri Olsa <jolsa@kernel.org>
    Link: https://lore.kernel.org/bpf/20230817225353.2570845-1-davemarchevsky@fb.com
    5964a223
libbpf.c 349 KB