lkml.org 
[lkml]   [2021]   [Sep]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH rfc 5/6] libbpf: add support for scheduler bpf programs
    Date
    This patch adds a support for loading and attaching scheduler bpf
    programs.

    Signed-off-by: Roman Gushchin <guro@fb.com>
    ---
    tools/lib/bpf/libbpf.c | 27 +++++++++++++++++++++++++--
    tools/lib/bpf/libbpf.h | 4 ++++
    tools/lib/bpf/libbpf.map | 3 +++
    3 files changed, 32 insertions(+), 2 deletions(-)

    diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
    index 62a43c408d73..8374a8d4aafe 100644
    --- a/tools/lib/bpf/libbpf.c
    +++ b/tools/lib/bpf/libbpf.c
    @@ -2633,7 +2633,8 @@ static int bpf_object__finalize_btf(struct bpf_object *obj)
    static bool prog_needs_vmlinux_btf(struct bpf_program *prog)
    {
    if (prog->type == BPF_PROG_TYPE_STRUCT_OPS ||
    - prog->type == BPF_PROG_TYPE_LSM)
    + prog->type == BPF_PROG_TYPE_LSM ||
    + prog->type == BPF_PROG_TYPE_SCHED)
    return true;

    /* BPF_PROG_TYPE_TRACING programs which do not attach to other programs
    @@ -6280,7 +6281,8 @@ int bpf_program__load(struct bpf_program *prog, char *license, __u32 kern_ver)

    if ((prog->type == BPF_PROG_TYPE_TRACING ||
    prog->type == BPF_PROG_TYPE_LSM ||
    - prog->type == BPF_PROG_TYPE_EXT) && !prog->attach_btf_id) {
    + prog->type == BPF_PROG_TYPE_EXT ||
    + prog->type == BPF_PROG_TYPE_SCHED) && !prog->attach_btf_id) {
    int btf_obj_fd = 0, btf_type_id = 0;

    err = libbpf_find_attach_btf_id(prog, &btf_obj_fd, &btf_type_id);
    @@ -7892,6 +7894,7 @@ BPF_PROG_TYPE_FNS(tracing, BPF_PROG_TYPE_TRACING);
    BPF_PROG_TYPE_FNS(struct_ops, BPF_PROG_TYPE_STRUCT_OPS);
    BPF_PROG_TYPE_FNS(extension, BPF_PROG_TYPE_EXT);
    BPF_PROG_TYPE_FNS(sk_lookup, BPF_PROG_TYPE_SK_LOOKUP);
    +BPF_PROG_TYPE_FNS(sched, BPF_PROG_TYPE_SCHED);

    enum bpf_attach_type
    bpf_program__get_expected_attach_type(const struct bpf_program *prog)
    @@ -7950,6 +7953,7 @@ static struct bpf_link *attach_raw_tp(struct bpf_program *prog);
    static struct bpf_link *attach_trace(struct bpf_program *prog);
    static struct bpf_link *attach_lsm(struct bpf_program *prog);
    static struct bpf_link *attach_iter(struct bpf_program *prog);
    +static struct bpf_link *attach_sched(struct bpf_program *prog);

    static const struct bpf_sec_def section_defs[] = {
    BPF_PROG_SEC("socket", BPF_PROG_TYPE_SOCKET_FILTER),
    @@ -8022,6 +8026,10 @@ static const struct bpf_sec_def section_defs[] = {
    .attach_fn = attach_iter),
    SEC_DEF("syscall", SYSCALL,
    .is_sleepable = true),
    + SEC_DEF("sched/", SCHED,
    + .is_attach_btf = true,
    + .expected_attach_type = BPF_SCHED,
    + .attach_fn = attach_sched),
    BPF_EAPROG_SEC("xdp_devmap/", BPF_PROG_TYPE_XDP,
    BPF_XDP_DEVMAP),
    BPF_EAPROG_SEC("xdp_cpumap/", BPF_PROG_TYPE_XDP,
    @@ -8311,6 +8319,7 @@ static int bpf_object__collect_st_ops_relos(struct bpf_object *obj,
    #define BTF_TRACE_PREFIX "btf_trace_"
    #define BTF_LSM_PREFIX "bpf_lsm_"
    #define BTF_ITER_PREFIX "bpf_iter_"
    +#define BTF_SCHED_PREFIX "bpf_sched_"
    #define BTF_MAX_NAME_SIZE 128

    void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type,
    @@ -8329,6 +8338,10 @@ void btf_get_kernel_prefix_kind(enum bpf_attach_type attach_type,
    *prefix = BTF_ITER_PREFIX;
    *kind = BTF_KIND_FUNC;
    break;
    + case BPF_SCHED:
    + *prefix = BTF_SCHED_PREFIX;
    + *kind = BTF_KIND_FUNC;
    + break;
    default:
    *prefix = "";
    *kind = BTF_KIND_FUNC;
    @@ -9675,6 +9688,11 @@ struct bpf_link *bpf_program__attach_lsm(struct bpf_program *prog)
    return bpf_program__attach_btf_id(prog);
    }

    +struct bpf_link *bpf_program__attach_sched(struct bpf_program *prog)
    +{
    + return bpf_program__attach_btf_id(prog);
    +}
    +
    static struct bpf_link *attach_trace(struct bpf_program *prog)
    {
    return bpf_program__attach_trace(prog);
    @@ -9685,6 +9703,11 @@ static struct bpf_link *attach_lsm(struct bpf_program *prog)
    return bpf_program__attach_lsm(prog);
    }

    +static struct bpf_link *attach_sched(struct bpf_program *prog)
    +{
    + return bpf_program__attach_sched(prog);
    +}
    +
    static struct bpf_link *
    bpf_program__attach_fd(struct bpf_program *prog, int target_fd, int btf_id,
    const char *target_name)
    diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
    index 2f6f0e15d1e7..42a3dfcca778 100644
    --- a/tools/lib/bpf/libbpf.h
    +++ b/tools/lib/bpf/libbpf.h
    @@ -339,6 +339,8 @@ bpf_program__attach_xdp(struct bpf_program *prog, int ifindex);
    LIBBPF_API struct bpf_link *
    bpf_program__attach_freplace(struct bpf_program *prog,
    int target_fd, const char *attach_func_name);
    +LIBBPF_API struct bpf_link *
    +bpf_program__attach_sched(struct bpf_program *prog);

    struct bpf_map;

    @@ -435,6 +437,7 @@ LIBBPF_API int bpf_program__set_tracing(struct bpf_program *prog);
    LIBBPF_API int bpf_program__set_struct_ops(struct bpf_program *prog);
    LIBBPF_API int bpf_program__set_extension(struct bpf_program *prog);
    LIBBPF_API int bpf_program__set_sk_lookup(struct bpf_program *prog);
    +LIBBPF_API int bpf_program__set_sched(struct bpf_program *prog);

    LIBBPF_API enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog);
    LIBBPF_API void bpf_program__set_type(struct bpf_program *prog,
    @@ -463,6 +466,7 @@ LIBBPF_API bool bpf_program__is_tracing(const struct bpf_program *prog);
    LIBBPF_API bool bpf_program__is_struct_ops(const struct bpf_program *prog);
    LIBBPF_API bool bpf_program__is_extension(const struct bpf_program *prog);
    LIBBPF_API bool bpf_program__is_sk_lookup(const struct bpf_program *prog);
    +LIBBPF_API bool bpf_program__is_sched(const struct bpf_program *prog);

    /*
    * No need for __attribute__((packed)), all members of 'bpf_map_def'
    diff --git a/tools/lib/bpf/libbpf.map b/tools/lib/bpf/libbpf.map
    index 9e649cf9e771..02f149aced5a 100644
    --- a/tools/lib/bpf/libbpf.map
    +++ b/tools/lib/bpf/libbpf.map
    @@ -390,4 +390,7 @@ LIBBPF_0.5.0 {
    LIBBPF_0.6.0 {
    global:
    btf__add_tag;
    + bpf_program__attach_sched;
    + bpf_program__is_sched;
    + bpf_program__set_sched;
    } LIBBPF_0.5.0;
    --
    2.31.1
    \
     
     \ /
      Last update: 2021-09-16 18:37    [W:4.234 / U:0.332 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site