mirror of
https://github.com/torvalds/linux.git
synced 2024-12-04 10:01:41 +00:00
590a008882
This patch adds BPF STRUCT_OPS support to libbpf. The only sec_name convention is SEC(".struct_ops") to identify the struct_ops implemented in BPF, e.g. To implement a tcp_congestion_ops: SEC(".struct_ops") struct tcp_congestion_ops dctcp = { .init = (void *)dctcp_init, /* <-- a bpf_prog */ /* ... some more func prts ... */ .name = "bpf_dctcp", }; Each struct_ops is defined as a global variable under SEC(".struct_ops") as above. libbpf creates a map for each variable and the variable name is the map's name. Multiple struct_ops is supported under SEC(".struct_ops"). In the bpf_object__open phase, libbpf will look for the SEC(".struct_ops") section and find out what is the btf-type the struct_ops is implementing. Note that the btf-type here is referring to a type in the bpf_prog.o's btf. A "struct bpf_map" is added by bpf_object__add_map() as other maps do. It will then collect (through SHT_REL) where are the bpf progs that the func ptrs are referring to. No btf_vmlinux is needed in the open phase. In the bpf_object__load phase, the map-fields, which depend on the btf_vmlinux, are initialized (in bpf_map__init_kern_struct_ops()). It will also set the prog->type, prog->attach_btf_id, and prog->expected_attach_type. Thus, the prog's properties do not rely on its section name. [ Currently, the bpf_prog's btf-type ==> btf_vmlinux's btf-type matching process is as simple as: member-name match + btf-kind match + size match. If these matching conditions fail, libbpf will reject. The current targeting support is "struct tcp_congestion_ops" which most of its members are function pointers. The member ordering of the bpf_prog's btf-type can be different from the btf_vmlinux's btf-type. ] Then, all obj->maps are created as usual (in bpf_object__create_maps()). Once the maps are created and prog's properties are all set, the libbpf will proceed to load all the progs. bpf_map__attach_struct_ops() is added to register a struct_ops map to a kernel subsystem. Signed-off-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Alexei Starovoitov <ast@kernel.org> Link: https://lore.kernel.org/bpf/20200109003514.3856730-1-kafai@fb.com
231 lines
5.1 KiB
Plaintext
231 lines
5.1 KiB
Plaintext
LIBBPF_0.0.1 {
|
|
global:
|
|
bpf_btf_get_fd_by_id;
|
|
bpf_create_map;
|
|
bpf_create_map_in_map;
|
|
bpf_create_map_in_map_node;
|
|
bpf_create_map_name;
|
|
bpf_create_map_node;
|
|
bpf_create_map_xattr;
|
|
bpf_load_btf;
|
|
bpf_load_program;
|
|
bpf_load_program_xattr;
|
|
bpf_map__btf_key_type_id;
|
|
bpf_map__btf_value_type_id;
|
|
bpf_map__def;
|
|
bpf_map__fd;
|
|
bpf_map__is_offload_neutral;
|
|
bpf_map__name;
|
|
bpf_map__next;
|
|
bpf_map__pin;
|
|
bpf_map__prev;
|
|
bpf_map__priv;
|
|
bpf_map__reuse_fd;
|
|
bpf_map__set_ifindex;
|
|
bpf_map__set_inner_map_fd;
|
|
bpf_map__set_priv;
|
|
bpf_map__unpin;
|
|
bpf_map_delete_elem;
|
|
bpf_map_get_fd_by_id;
|
|
bpf_map_get_next_id;
|
|
bpf_map_get_next_key;
|
|
bpf_map_lookup_and_delete_elem;
|
|
bpf_map_lookup_elem;
|
|
bpf_map_update_elem;
|
|
bpf_obj_get;
|
|
bpf_obj_get_info_by_fd;
|
|
bpf_obj_pin;
|
|
bpf_object__btf_fd;
|
|
bpf_object__close;
|
|
bpf_object__find_map_by_name;
|
|
bpf_object__find_map_by_offset;
|
|
bpf_object__find_program_by_title;
|
|
bpf_object__kversion;
|
|
bpf_object__load;
|
|
bpf_object__name;
|
|
bpf_object__next;
|
|
bpf_object__open;
|
|
bpf_object__open_buffer;
|
|
bpf_object__open_xattr;
|
|
bpf_object__pin;
|
|
bpf_object__pin_maps;
|
|
bpf_object__pin_programs;
|
|
bpf_object__priv;
|
|
bpf_object__set_priv;
|
|
bpf_object__unload;
|
|
bpf_object__unpin_maps;
|
|
bpf_object__unpin_programs;
|
|
bpf_perf_event_read_simple;
|
|
bpf_prog_attach;
|
|
bpf_prog_detach;
|
|
bpf_prog_detach2;
|
|
bpf_prog_get_fd_by_id;
|
|
bpf_prog_get_next_id;
|
|
bpf_prog_load;
|
|
bpf_prog_load_xattr;
|
|
bpf_prog_query;
|
|
bpf_prog_test_run;
|
|
bpf_prog_test_run_xattr;
|
|
bpf_program__fd;
|
|
bpf_program__is_kprobe;
|
|
bpf_program__is_perf_event;
|
|
bpf_program__is_raw_tracepoint;
|
|
bpf_program__is_sched_act;
|
|
bpf_program__is_sched_cls;
|
|
bpf_program__is_socket_filter;
|
|
bpf_program__is_tracepoint;
|
|
bpf_program__is_xdp;
|
|
bpf_program__load;
|
|
bpf_program__next;
|
|
bpf_program__nth_fd;
|
|
bpf_program__pin;
|
|
bpf_program__pin_instance;
|
|
bpf_program__prev;
|
|
bpf_program__priv;
|
|
bpf_program__set_expected_attach_type;
|
|
bpf_program__set_ifindex;
|
|
bpf_program__set_kprobe;
|
|
bpf_program__set_perf_event;
|
|
bpf_program__set_prep;
|
|
bpf_program__set_priv;
|
|
bpf_program__set_raw_tracepoint;
|
|
bpf_program__set_sched_act;
|
|
bpf_program__set_sched_cls;
|
|
bpf_program__set_socket_filter;
|
|
bpf_program__set_tracepoint;
|
|
bpf_program__set_type;
|
|
bpf_program__set_xdp;
|
|
bpf_program__title;
|
|
bpf_program__unload;
|
|
bpf_program__unpin;
|
|
bpf_program__unpin_instance;
|
|
bpf_prog_linfo__free;
|
|
bpf_prog_linfo__new;
|
|
bpf_prog_linfo__lfind_addr_func;
|
|
bpf_prog_linfo__lfind;
|
|
bpf_raw_tracepoint_open;
|
|
bpf_set_link_xdp_fd;
|
|
bpf_task_fd_query;
|
|
bpf_verify_program;
|
|
btf__fd;
|
|
btf__find_by_name;
|
|
btf__free;
|
|
btf__get_from_id;
|
|
btf__name_by_offset;
|
|
btf__new;
|
|
btf__resolve_size;
|
|
btf__resolve_type;
|
|
btf__type_by_id;
|
|
libbpf_attach_type_by_name;
|
|
libbpf_get_error;
|
|
libbpf_prog_type_by_name;
|
|
libbpf_set_print;
|
|
libbpf_strerror;
|
|
local:
|
|
*;
|
|
};
|
|
|
|
LIBBPF_0.0.2 {
|
|
global:
|
|
bpf_probe_helper;
|
|
bpf_probe_map_type;
|
|
bpf_probe_prog_type;
|
|
bpf_map__resize;
|
|
bpf_map_lookup_elem_flags;
|
|
bpf_object__btf;
|
|
bpf_object__find_map_fd_by_name;
|
|
bpf_get_link_xdp_id;
|
|
btf__dedup;
|
|
btf__get_map_kv_tids;
|
|
btf__get_nr_types;
|
|
btf__get_raw_data;
|
|
btf__load;
|
|
btf_ext__free;
|
|
btf_ext__func_info_rec_size;
|
|
btf_ext__get_raw_data;
|
|
btf_ext__line_info_rec_size;
|
|
btf_ext__new;
|
|
btf_ext__reloc_func_info;
|
|
btf_ext__reloc_line_info;
|
|
xsk_umem__create;
|
|
xsk_socket__create;
|
|
xsk_umem__delete;
|
|
xsk_socket__delete;
|
|
xsk_umem__fd;
|
|
xsk_socket__fd;
|
|
bpf_program__get_prog_info_linear;
|
|
bpf_program__bpil_addr_to_offs;
|
|
bpf_program__bpil_offs_to_addr;
|
|
} LIBBPF_0.0.1;
|
|
|
|
LIBBPF_0.0.3 {
|
|
global:
|
|
bpf_map__is_internal;
|
|
bpf_map_freeze;
|
|
btf__finalize_data;
|
|
} LIBBPF_0.0.2;
|
|
|
|
LIBBPF_0.0.4 {
|
|
global:
|
|
bpf_link__destroy;
|
|
bpf_object__load_xattr;
|
|
bpf_program__attach_kprobe;
|
|
bpf_program__attach_perf_event;
|
|
bpf_program__attach_raw_tracepoint;
|
|
bpf_program__attach_tracepoint;
|
|
bpf_program__attach_uprobe;
|
|
btf_dump__dump_type;
|
|
btf_dump__free;
|
|
btf_dump__new;
|
|
btf__parse_elf;
|
|
libbpf_num_possible_cpus;
|
|
perf_buffer__free;
|
|
perf_buffer__new;
|
|
perf_buffer__new_raw;
|
|
perf_buffer__poll;
|
|
xsk_umem__create;
|
|
} LIBBPF_0.0.3;
|
|
|
|
LIBBPF_0.0.5 {
|
|
global:
|
|
bpf_btf_get_next_id;
|
|
} LIBBPF_0.0.4;
|
|
|
|
LIBBPF_0.0.6 {
|
|
global:
|
|
bpf_get_link_xdp_info;
|
|
bpf_map__get_pin_path;
|
|
bpf_map__is_pinned;
|
|
bpf_map__set_pin_path;
|
|
bpf_object__open_file;
|
|
bpf_object__open_mem;
|
|
bpf_program__attach_trace;
|
|
bpf_program__get_expected_attach_type;
|
|
bpf_program__get_type;
|
|
bpf_program__is_tracing;
|
|
bpf_program__set_tracing;
|
|
bpf_program__size;
|
|
btf__find_by_name_kind;
|
|
libbpf_find_vmlinux_btf_id;
|
|
} LIBBPF_0.0.5;
|
|
|
|
LIBBPF_0.0.7 {
|
|
global:
|
|
btf_dump__emit_type_decl;
|
|
bpf_link__disconnect;
|
|
bpf_map__attach_struct_ops;
|
|
bpf_object__find_program_by_name;
|
|
bpf_object__attach_skeleton;
|
|
bpf_object__destroy_skeleton;
|
|
bpf_object__detach_skeleton;
|
|
bpf_object__load_skeleton;
|
|
bpf_object__open_skeleton;
|
|
bpf_probe_large_insn_limit;
|
|
bpf_prog_attach_xattr;
|
|
bpf_program__attach;
|
|
bpf_program__name;
|
|
bpf_program__is_struct_ops;
|
|
bpf_program__set_struct_ops;
|
|
btf__align_of;
|
|
} LIBBPF_0.0.6;
|