On 12/20/19 10:26 PM, Martin KaFai Lau wrote: > This patch allows the kernel's struct ops (i.e. func ptr) to be > implemented in BPF. The first use case in this series is the > "struct tcp_congestion_ops" which will be introduced in a > latter patch. > > This patch introduces a new prog type BPF_PROG_TYPE_STRUCT_OPS. > The BPF_PROG_TYPE_STRUCT_OPS prog is verified against a particular > func ptr of a kernel struct. The attr->attach_btf_id is the btf id > of a kernel struct. The attr->expected_attach_type is the member > "index" of that kernel struct. The first member of a struct starts > with member index 0. That will avoid ambiguity when a kernel struct > has multiple func ptrs with the same func signature. > > For example, a BPF_PROG_TYPE_STRUCT_OPS prog is written > to implement the "init" func ptr of the "struct tcp_congestion_ops". > The attr->attach_btf_id is the btf id of the "struct tcp_congestion_ops" > of the _running_ kernel. The attr->expected_attach_type is 3. > > The ctx of BPF_PROG_TYPE_STRUCT_OPS is an array of u64 args saved > by arch_prepare_bpf_trampoline that will be done in the next > patch when introducing BPF_MAP_TYPE_STRUCT_OPS. > > "struct bpf_struct_ops" is introduced as a common interface for the kernel > struct that supports BPF_PROG_TYPE_STRUCT_OPS prog. The supporting kernel > struct will need to implement an instance of the "struct bpf_struct_ops". > > The supporting kernel struct also needs to implement a bpf_verifier_ops. > During BPF_PROG_LOAD, bpf_struct_ops_find() will find the right > bpf_verifier_ops by searching the attr->attach_btf_id. > > A new "btf_struct_access" is also added to the bpf_verifier_ops such > that the supporting kernel struct can optionally provide its own specific > check on accessing the func arg (e.g. provide limited write access). > > After btf_vmlinux is parsed, the new bpf_struct_ops_init() is called > to initialize some values (e.g. the btf id of the supporting kernel > struct) and it can only be done once the btf_vmlinux is available. > > The R0 checks at BPF_EXIT is excluded for the BPF_PROG_TYPE_STRUCT_OPS prog > if the return type of the prog->aux->attach_func_proto is "void". > > Signed-off-by: Martin KaFai Lau <kafai@xxxxxx> Acked-by: Yonghong Song <yhs@xxxxxx>