libbpf: Ignore non function pointer member in struct_ops
[sfrench/cifs-2.6.git] / tools / lib / bpf / libbpf.c
index 2abbc38005684c30ce8c5597cc529bbf249d31b2..d43cc3f29daee987c4dbde5a4ec3c018716d3fc4 100644 (file)
@@ -884,24 +884,24 @@ static int bpf_map__init_kern_struct_ops(struct bpf_map *map,
                if (btf_is_ptr(mtype)) {
                        struct bpf_program *prog;
 
-                       mtype = skip_mods_and_typedefs(btf, mtype->type, &mtype_id);
+                       prog = st_ops->progs[i];
+                       if (!prog)
+                               continue;
+
                        kern_mtype = skip_mods_and_typedefs(kern_btf,
                                                            kern_mtype->type,
                                                            &kern_mtype_id);
-                       if (!btf_is_func_proto(mtype) ||
-                           !btf_is_func_proto(kern_mtype)) {
-                               pr_warn("struct_ops init_kern %s: non func ptr %s is not supported\n",
+
+                       /* mtype->type must be a func_proto which was
+                        * guaranteed in bpf_object__collect_st_ops_relos(),
+                        * so only check kern_mtype for func_proto here.
+                        */
+                       if (!btf_is_func_proto(kern_mtype)) {
+                               pr_warn("struct_ops init_kern %s: kernel member %s is not a func ptr\n",
                                        map->name, mname);
                                return -ENOTSUP;
                        }
 
-                       prog = st_ops->progs[i];
-                       if (!prog) {
-                               pr_debug("struct_ops init_kern %s: func ptr %s is not set\n",
-                                        map->name, mname);
-                               continue;
-                       }
-
                        prog->attach_btf_id = kern_type_id;
                        prog->expected_attach_type = kern_member_idx;