bpf: Simplify reg0 marking for the list kfuncs that return a bpf_list_node pointer
authorMartin KaFai Lau <martin.lau@kernel.org>
Tue, 6 May 2025 01:58:53 +0000 (18:58 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Tue, 6 May 2025 17:21:05 +0000 (10:21 -0700)
The next patch will add bpf_list_{front,back} kfuncs to peek the head
and tail of a list. Both of them will return a 'struct bpf_list_node *'.

Follow the earlier change for rbtree, this patch checks the
return btf type is a 'struct bpf_list_node' pointer instead
of checking each kfuncs individually to decide if
mark_reg_graph_node should be called. This will make
the bpf_list_{front,back} kfunc addition easier in
the later patch.

Acked-by: Kumar Kartikeya Dwivedi <memxor@gmail.com>
Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
Link: https://lore.kernel.org/r/20250506015857.817950-7-martin.lau@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
kernel/bpf/verifier.c

index 9093a351b0b3819378a77c62c42c76336be1d9ae..acb2f44316cccb510b0e841e2e46ddd20a311fa1 100644 (file)
@@ -11992,6 +11992,11 @@ static bool is_rbtree_node_type(const struct btf_type *t)
        return t == btf_type_by_id(btf_vmlinux, kf_arg_btf_ids[KF_ARG_RB_NODE_ID]);
 }
 
+static bool is_list_node_type(const struct btf_type *t)
+{
+       return t == btf_type_by_id(btf_vmlinux, kf_arg_btf_ids[KF_ARG_LIST_NODE_ID]);
+}
+
 static bool is_kfunc_arg_callback(struct bpf_verifier_env *env, const struct btf *btf,
                                  const struct btf_param *arg)
 {
@@ -13764,8 +13769,7 @@ static int check_kfunc_call(struct bpf_verifier_env *env, struct bpf_insn *insn,
                                insn_aux->kptr_struct_meta =
                                        btf_find_struct_meta(meta.arg_btf,
                                                             meta.arg_btf_id);
-                       } else if (meta.func_id == special_kfunc_list[KF_bpf_list_pop_front] ||
-                                  meta.func_id == special_kfunc_list[KF_bpf_list_pop_back]) {
+                       } else if (is_list_node_type(ptr_type)) {
                                struct btf_field *field = meta.arg_list_head.field;
 
                                mark_reg_graph_node(regs, BPF_REG_0, &field->graph_root);