• Wang Nan's avatar
    bpf tools: Load a program with different instances using preprocessor · b580563e
    Wang Nan authored
    This patch is a preparation for BPF prologue support which allows
    generating a series of BPF bytecode for fetching kernel data before
    calling program code. With the newly introduced multiple instances
    support, perf is able to create different prologues for different kprobe
    points.
    
    Before this patch, a bpf_program can be loaded into kernel only once,
    and get the only resulting fd. What this patch does is to allow creating
    and loading different variants of one bpf_program, then fetching their
    fds.
    
    Here we describe the basic idea in this patch. The detailed description
    of the newly introduced APIs can be found in comments in the patch body.
    
    The key of this patch is the new mechanism in bpf_program__load().
    Instead of loading BPF program into kernel directly, it calls a
    'pre-processor' to generate program instances which would be finally
    loaded into the kernel based on the original code. To enable the
    generation of multiple instances, libbpf passes an index to the
    pre-processor so it know which instance is being loaded.
    
    Pre-processor should be called from libbpf's user (perf) using
    bpf_program__set_prep(). The number of instances and the relationship
    between indices and the target instance should be clear when calling
    bpf_program__set_prep().
    
    To retrieve a fd for a specific instance of a program,
    bpf_program__nth_fd() is introduced. It returns the resulting fd
    according to index.
    Signed-off-by: default avatarHe Kuang <hekuang@huawei.com>
    Cc: Alexei Starovoitov <ast@kernel.org>
    Cc: He Kuang <hekuang@huawei.com>
    Cc: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>
    Cc: Zefan Li <lizefan@huawei.com>
    Cc: pi3orama@163.com
    Link: http://lkml.kernel.org/r/1447675815-166222-8-git-send-email-wangnan0@huawei.comSigned-off-by: default avatarWang Nan <wangnan0@huawei.com>
    [ Enclosed multi-line if/else blocks with {}, (*func_ptr)() -> func_ptr() ]
    Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
    b580563e
libbpf.c 26.8 KB