Lines Matching refs:prog

73 static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog);
222 struct bpf_program *prog);
530 void bpf_program__unload(struct bpf_program *prog) in bpf_program__unload() argument
534 if (!prog) in bpf_program__unload()
541 if (prog->instances.nr > 0) { in bpf_program__unload()
542 for (i = 0; i < prog->instances.nr; i++) in bpf_program__unload()
543 zclose(prog->instances.fds[i]); in bpf_program__unload()
544 } else if (prog->instances.nr != -1) { in bpf_program__unload()
546 prog->instances.nr); in bpf_program__unload()
549 prog->instances.nr = -1; in bpf_program__unload()
550 zfree(&prog->instances.fds); in bpf_program__unload()
552 zfree(&prog->func_info); in bpf_program__unload()
553 zfree(&prog->line_info); in bpf_program__unload()
556 static void bpf_program__exit(struct bpf_program *prog) in bpf_program__exit() argument
558 if (!prog) in bpf_program__exit()
561 if (prog->clear_priv) in bpf_program__exit()
562 prog->clear_priv(prog, prog->priv); in bpf_program__exit()
564 prog->priv = NULL; in bpf_program__exit()
565 prog->clear_priv = NULL; in bpf_program__exit()
567 bpf_program__unload(prog); in bpf_program__exit()
568 zfree(&prog->name); in bpf_program__exit()
569 zfree(&prog->sec_name); in bpf_program__exit()
570 zfree(&prog->pin_name); in bpf_program__exit()
571 zfree(&prog->insns); in bpf_program__exit()
572 zfree(&prog->reloc_desc); in bpf_program__exit()
574 prog->nr_reloc = 0; in bpf_program__exit()
575 prog->insns_cnt = 0; in bpf_program__exit()
576 prog->sec_idx = -1; in bpf_program__exit()
579 static char *__bpf_program__pin_name(struct bpf_program *prog) in __bpf_program__pin_name() argument
583 name = p = strdup(prog->sec_name); in __bpf_program__pin_name()
611 bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog, in bpf_object__init_prog() argument
621 memset(prog, 0, sizeof(*prog)); in bpf_object__init_prog()
622 prog->obj = obj; in bpf_object__init_prog()
624 prog->sec_idx = sec_idx; in bpf_object__init_prog()
625 prog->sec_insn_off = sec_off / BPF_INSN_SZ; in bpf_object__init_prog()
626 prog->sec_insn_cnt = insn_data_sz / BPF_INSN_SZ; in bpf_object__init_prog()
628 prog->insns_cnt = prog->sec_insn_cnt; in bpf_object__init_prog()
630 prog->type = BPF_PROG_TYPE_UNSPEC; in bpf_object__init_prog()
631 prog->load = true; in bpf_object__init_prog()
633 prog->instances.fds = NULL; in bpf_object__init_prog()
634 prog->instances.nr = -1; in bpf_object__init_prog()
636 prog->sec_name = strdup(sec_name); in bpf_object__init_prog()
637 if (!prog->sec_name) in bpf_object__init_prog()
640 prog->name = strdup(name); in bpf_object__init_prog()
641 if (!prog->name) in bpf_object__init_prog()
644 prog->pin_name = __bpf_program__pin_name(prog); in bpf_object__init_prog()
645 if (!prog->pin_name) in bpf_object__init_prog()
648 prog->insns = malloc(insn_data_sz); in bpf_object__init_prog()
649 if (!prog->insns) in bpf_object__init_prog()
651 memcpy(prog->insns, insn_data, insn_data_sz); in bpf_object__init_prog()
656 bpf_program__exit(prog); in bpf_object__init_prog()
665 struct bpf_program *prog, *progs; in bpf_object__add_programs() local
722 prog = &progs[nr_progs]; in bpf_object__add_programs()
724 err = bpf_object__init_prog(obj, prog, name, sec_idx, sec_name, in bpf_object__add_programs()
737 prog->mark_btf_static = true; in bpf_object__add_programs()
935 struct bpf_program *prog; in bpf_map__init_kern_struct_ops() local
937 prog = st_ops->progs[i]; in bpf_map__init_kern_struct_ops()
938 if (!prog) in bpf_map__init_kern_struct_ops()
955 prog->attach_btf_id = kern_type_id; in bpf_map__init_kern_struct_ops()
956 prog->expected_attach_type = kern_member_idx; in bpf_map__init_kern_struct_ops()
961 map->name, mname, prog->name, moff, in bpf_map__init_kern_struct_ops()
2629 static bool prog_needs_vmlinux_btf(struct bpf_program *prog) in prog_needs_vmlinux_btf() argument
2631 if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || in prog_needs_vmlinux_btf()
2632 prog->type == BPF_PROG_TYPE_LSM) in prog_needs_vmlinux_btf()
2638 if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd) in prog_needs_vmlinux_btf()
2646 struct bpf_program *prog; in obj_needs_vmlinux_btf() local
2664 bpf_object__for_each_program(prog, obj) { in obj_needs_vmlinux_btf()
2665 if (!prog->load) in obj_needs_vmlinux_btf()
2667 if (prog_needs_vmlinux_btf(prog)) in obj_needs_vmlinux_btf()
2722 struct bpf_program *prog = &obj->programs[i]; in bpf_object__sanitize_and_load_btf() local
2727 if (!prog->mark_btf_static || !prog_is_subprog(obj, prog)) in bpf_object__sanitize_and_load_btf()
2737 if (strcmp(name, prog->name) != 0) in bpf_object__sanitize_and_load_btf()
3533 const struct bpf_program *prog) in prog_is_subprog() argument
3547 return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1; in prog_is_subprog()
3554 struct bpf_program *prog; in bpf_object__find_program_by_name() local
3556 bpf_object__for_each_program(prog, obj) { in bpf_object__find_program_by_name()
3557 if (prog_is_subprog(obj, prog)) in bpf_object__find_program_by_name()
3559 if (!strcmp(prog->name, name)) in bpf_object__find_program_by_name()
3560 return prog; in bpf_object__find_program_by_name()
3595 static int bpf_program__record_reloc(struct bpf_program *prog, in bpf_program__record_reloc() argument
3600 struct bpf_insn *insn = &prog->insns[insn_idx]; in bpf_program__record_reloc()
3601 size_t map_idx, nr_maps = prog->obj->nr_maps; in bpf_program__record_reloc()
3602 struct bpf_object *obj = prog->obj; in bpf_program__record_reloc()
3610 prog->name, sym_name, insn_idx, insn->code); in bpf_program__record_reloc()
3626 prog->name, sym_name, sym_idx); in bpf_program__record_reloc()
3630 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
3643 pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name); in bpf_program__record_reloc()
3650 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3655 prog->name, sym_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3666 prog->name, sym_name, shdr_idx); in bpf_program__record_reloc()
3677 prog->name, sym_name, (size_t)sym->st_value, insn->imm); in bpf_program__record_reloc()
3694 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3704 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3710 prog->name, sym_sec_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3723 prog->name, sym_sec_name); in bpf_program__record_reloc()
3731 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3737 prog->name, sym_sec_name); in bpf_program__record_reloc()
3748 static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) in prog_contains_insn() argument
3750 return insn_idx >= prog->sec_insn_off && in prog_contains_insn()
3751 insn_idx < prog->sec_insn_off + prog->sec_insn_cnt; in prog_contains_insn()
3758 struct bpf_program *prog; in find_prog_by_sec_insn() local
3762 prog = &obj->programs[m]; in find_prog_by_sec_insn()
3764 if (prog->sec_idx < sec_idx || in find_prog_by_sec_insn()
3765 (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx)) in find_prog_by_sec_insn()
3773 prog = &obj->programs[l]; in find_prog_by_sec_insn()
3774 if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx)) in find_prog_by_sec_insn()
3775 return prog; in find_prog_by_sec_insn()
3785 struct bpf_program *prog; in bpf_object__collect_prog_relos() local
3840 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__collect_prog_relos()
3841 if (!prog) { in bpf_object__collect_prog_relos()
3847 relos = libbpf_reallocarray(prog->reloc_desc, in bpf_object__collect_prog_relos()
3848 prog->nr_reloc + 1, sizeof(*relos)); in bpf_object__collect_prog_relos()
3851 prog->reloc_desc = relos; in bpf_object__collect_prog_relos()
3854 insn_idx -= prog->sec_insn_off; in bpf_object__collect_prog_relos()
3855 err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc], in bpf_object__collect_prog_relos()
3860 prog->nr_reloc++; in bpf_object__collect_prog_relos()
4276 int ret, map, prog; in probe_prog_bind_map() local
4299 prog = bpf_load_program_xattr(&prg_attr, NULL, 0); in probe_prog_bind_map()
4300 if (prog < 0) { in probe_prog_bind_map()
4305 ret = bpf_prog_bind_map(prog, map, NULL); in probe_prog_bind_map()
4308 close(prog); in probe_prog_bind_map()
5112 static int bpf_core_apply_relo(struct bpf_program *prog, in bpf_core_apply_relo() argument
5120 const char *prog_name = prog->name; in bpf_core_apply_relo()
5134 insn_idx = insn_idx - prog->sec_insn_off; in bpf_core_apply_relo()
5135 if (insn_idx > prog->insns_cnt) in bpf_core_apply_relo()
5137 insn = &prog->insns[insn_idx]; in bpf_core_apply_relo()
5147 if (prog->obj->gen_loader) { in bpf_core_apply_relo()
5149 prog - prog->obj->programs, relo->insn_off / 8, in bpf_core_apply_relo()
5156 cands = bpf_core_find_cands(prog->obj, local_btf, local_id); in bpf_core_apply_relo()
5181 struct bpf_program *prog; in bpf_object__relocate_core() local
5216 prog = NULL; in bpf_object__relocate_core()
5218 prog = &obj->programs[i]; in bpf_object__relocate_core()
5219 if (strcmp(prog->sec_name, sec_name) == 0) in bpf_object__relocate_core()
5222 if (!prog) { in bpf_object__relocate_core()
5226 sec_idx = prog->sec_idx; in bpf_object__relocate_core()
5233 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__relocate_core()
5234 if (!prog) { in bpf_object__relocate_core()
5243 if (!prog->load) in bpf_object__relocate_core()
5246 err = bpf_core_apply_relo(prog, rec, i, obj->btf, cand_cache); in bpf_object__relocate_core()
5249 prog->name, i, err); in bpf_object__relocate_core()
5275 bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_data() argument
5279 for (i = 0; i < prog->nr_reloc; i++) { in bpf_object__relocate_data()
5280 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_object__relocate_data()
5281 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate_data()
5334 prog->name, i); in bpf_object__relocate_data()
5344 prog->name, i, relo->type); in bpf_object__relocate_data()
5353 const struct bpf_program *prog, in adjust_prog_btf_ext_info() argument
5369 if (strcmp(sec_name, prog->sec_name) != 0) in adjust_prog_btf_ext_info()
5375 if (insn_off < prog->sec_insn_off) in adjust_prog_btf_ext_info()
5377 if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt) in adjust_prog_btf_ext_info()
5406 off_adj = prog->sub_insn_off - prog->sec_insn_off; in adjust_prog_btf_ext_info()
5424 const struct bpf_program *prog) in reloc_prog_func_and_line_info() argument
5437 if (main_prog != prog && !main_prog->func_info) in reloc_prog_func_and_line_info()
5440 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info, in reloc_prog_func_and_line_info()
5447 prog->name, err); in reloc_prog_func_and_line_info()
5455 pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name); in reloc_prog_func_and_line_info()
5460 prog->name); in reloc_prog_func_and_line_info()
5465 if (main_prog != prog && !main_prog->line_info) in reloc_prog_func_and_line_info()
5468 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info, in reloc_prog_func_and_line_info()
5475 prog->name, err); in reloc_prog_func_and_line_info()
5483 pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name); in reloc_prog_func_and_line_info()
5488 prog->name); in reloc_prog_func_and_line_info()
5503 static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) in find_prog_insn_relo() argument
5505 return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc, in find_prog_insn_relo()
5506 sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx); in find_prog_insn_relo()
5535 struct bpf_program *prog) in bpf_object__reloc_code() argument
5543 err = reloc_prog_func_and_line_info(obj, main_prog, prog); in bpf_object__reloc_code()
5547 for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) { in bpf_object__reloc_code()
5548 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
5552 relo = find_prog_insn_relo(prog, insn_idx); in bpf_object__reloc_code()
5560 prog->name, insn_idx, relo->type); in bpf_object__reloc_code()
5584 prog->name, insn_idx); in bpf_object__reloc_code()
5593 sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1; in bpf_object__reloc_code()
5600 prog->name); in bpf_object__reloc_code()
5644 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
5650 insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1; in bpf_object__reloc_code()
5653 prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off); in bpf_object__reloc_code()
5741 bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_calls() argument
5757 err = bpf_object__reloc_code(obj, prog, prog); in bpf_object__relocate_calls()
5768 struct bpf_program *prog; in bpf_object__free_relocs() local
5773 prog = &obj->programs[i]; in bpf_object__free_relocs()
5774 zfree(&prog->reloc_desc); in bpf_object__free_relocs()
5775 prog->nr_reloc = 0; in bpf_object__free_relocs()
5782 struct bpf_program *prog; in bpf_object__relocate() local
5803 prog = &obj->programs[i]; in bpf_object__relocate()
5804 for (j = 0; j < prog->nr_reloc; j++) { in bpf_object__relocate()
5805 struct reloc_desc *relo = &prog->reloc_desc[j]; in bpf_object__relocate()
5806 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate()
5822 prog = &obj->programs[i]; in bpf_object__relocate()
5826 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
5829 err = bpf_object__relocate_calls(obj, prog); in bpf_object__relocate()
5832 prog->name, err); in bpf_object__relocate()
5838 prog = &obj->programs[i]; in bpf_object__relocate()
5839 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
5841 err = bpf_object__relocate_data(obj, prog); in bpf_object__relocate()
5844 prog->name, err); in bpf_object__relocate()
6032 static int bpf_object__sanitize_prog(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__sanitize_prog() argument
6034 struct bpf_insn *insn = prog->insns; in bpf_object__sanitize_prog()
6041 for (i = 0; i < prog->insns_cnt; i++, insn++) { in bpf_object__sanitize_prog()
6068 load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt, in load_program() argument
6077 if (prog->type == BPF_PROG_TYPE_UNSPEC) { in load_program()
6083 prog->name, prog->sec_name); in load_program()
6090 load_attr.prog_type = prog->type; in load_program()
6092 if (!kernel_supports(prog->obj, FEAT_EXP_ATTACH_TYPE) && prog->sec_def && in load_program()
6093 prog->sec_def->is_exp_attach_type_optional) in load_program()
6096 load_attr.expected_attach_type = prog->expected_attach_type; in load_program()
6097 if (kernel_supports(prog->obj, FEAT_PROG_NAME)) in load_program()
6098 load_attr.name = prog->name; in load_program()
6102 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6103 if (prog->attach_prog_fd) in load_program()
6104 load_attr.attach_prog_fd = prog->attach_prog_fd; in load_program()
6106 load_attr.attach_btf_obj_fd = prog->attach_btf_obj_fd; in load_program()
6107 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6109 load_attr.prog_ifindex = prog->prog_ifindex; in load_program()
6112 btf_fd = bpf_object__btf_fd(prog->obj); in load_program()
6113 if (btf_fd >= 0 && kernel_supports(prog->obj, FEAT_BTF_FUNC)) { in load_program()
6115 load_attr.func_info = prog->func_info; in load_program()
6116 load_attr.func_info_rec_size = prog->func_info_rec_size; in load_program()
6117 load_attr.func_info_cnt = prog->func_info_cnt; in load_program()
6118 load_attr.line_info = prog->line_info; in load_program()
6119 load_attr.line_info_rec_size = prog->line_info_rec_size; in load_program()
6120 load_attr.line_info_cnt = prog->line_info_cnt; in load_program()
6122 load_attr.log_level = prog->log_level; in load_program()
6123 load_attr.prog_flags = prog->prog_flags; in load_program()
6125 if (prog->obj->gen_loader) { in load_program()
6126 bpf_gen__prog_load(prog->obj->gen_loader, &load_attr, in load_program()
6127 prog - prog->obj->programs); in load_program()
6148 if (prog->obj->rodata_map_idx >= 0 && in load_program()
6149 kernel_supports(prog->obj, FEAT_PROG_BIND_MAP)) { in load_program()
6151 &prog->obj->maps[prog->obj->rodata_map_idx]; in load_program()
6156 prog->name, cp); in load_program()
6208 static int bpf_program__record_externs(struct bpf_program *prog) in bpf_program__record_externs() argument
6210 struct bpf_object *obj = prog->obj; in bpf_program__record_externs()
6213 for (i = 0; i < prog->nr_reloc; i++) { in bpf_program__record_externs()
6214 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_program__record_externs()
6240 static int libbpf_find_attach_btf_id(struct bpf_program *prog, int *btf_obj_fd, int *btf_type_id);
6242 int bpf_program__load(struct bpf_program *prog, char *license, __u32 kern_ver) in bpf_program__load() argument
6246 if (prog->obj->loaded) { in bpf_program__load()
6247 pr_warn("prog '%s': can't load after object was loaded\n", prog->name); in bpf_program__load()
6251 if ((prog->type == BPF_PROG_TYPE_TRACING || in bpf_program__load()
6252 prog->type == BPF_PROG_TYPE_LSM || in bpf_program__load()
6253 prog->type == BPF_PROG_TYPE_EXT) && !prog->attach_btf_id) { in bpf_program__load()
6256 err = libbpf_find_attach_btf_id(prog, &btf_obj_fd, &btf_type_id); in bpf_program__load()
6260 prog->attach_btf_obj_fd = btf_obj_fd; in bpf_program__load()
6261 prog->attach_btf_id = btf_type_id; in bpf_program__load()
6264 if (prog->instances.nr < 0 || !prog->instances.fds) { in bpf_program__load()
6265 if (prog->preprocessor) { in bpf_program__load()
6267 prog->name); in bpf_program__load()
6271 prog->instances.fds = malloc(sizeof(int)); in bpf_program__load()
6272 if (!prog->instances.fds) { in bpf_program__load()
6276 prog->instances.nr = 1; in bpf_program__load()
6277 prog->instances.fds[0] = -1; in bpf_program__load()
6280 if (!prog->preprocessor) { in bpf_program__load()
6281 if (prog->instances.nr != 1) { in bpf_program__load()
6283 prog->name, prog->instances.nr); in bpf_program__load()
6285 if (prog->obj->gen_loader) in bpf_program__load()
6286 bpf_program__record_externs(prog); in bpf_program__load()
6287 err = load_program(prog, prog->insns, prog->insns_cnt, in bpf_program__load()
6290 prog->instances.fds[0] = fd; in bpf_program__load()
6294 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__load()
6296 bpf_program_prep_t preprocessor = prog->preprocessor; in bpf_program__load()
6299 err = preprocessor(prog, i, prog->insns, in bpf_program__load()
6300 prog->insns_cnt, &result); in bpf_program__load()
6303 i, prog->name); in bpf_program__load()
6309 i, prog->name); in bpf_program__load()
6310 prog->instances.fds[i] = -1; in bpf_program__load()
6316 err = load_program(prog, result.new_insn_ptr, in bpf_program__load()
6320 i, prog->name); in bpf_program__load()
6326 prog->instances.fds[i] = fd; in bpf_program__load()
6330 pr_warn("failed to load program '%s'\n", prog->name); in bpf_program__load()
6331 zfree(&prog->insns); in bpf_program__load()
6332 prog->insns_cnt = 0; in bpf_program__load()
6339 struct bpf_program *prog; in bpf_object__load_progs() local
6344 prog = &obj->programs[i]; in bpf_object__load_progs()
6345 err = bpf_object__sanitize_prog(obj, prog); in bpf_object__load_progs()
6351 prog = &obj->programs[i]; in bpf_object__load_progs()
6352 if (prog_is_subprog(obj, prog)) in bpf_object__load_progs()
6354 if (!prog->load) { in bpf_object__load_progs()
6355 pr_debug("prog '%s': skipped loading\n", prog->name); in bpf_object__load_progs()
6358 prog->log_level |= log_level; in bpf_object__load_progs()
6359 err = bpf_program__load(prog, obj->license, obj->kern_version); in bpf_object__load_progs()
6375 struct bpf_program *prog; in __bpf_object__open() local
6438 bpf_object__for_each_program(prog, obj) { in __bpf_object__open()
6439 prog->sec_def = find_sec_def(prog->sec_name); in __bpf_object__open()
6440 if (!prog->sec_def) { in __bpf_object__open()
6443 prog->name, prog->sec_name); in __bpf_object__open()
6447 if (prog->sec_def->is_sleepable) in __bpf_object__open()
6448 prog->prog_flags |= BPF_F_SLEEPABLE; in __bpf_object__open()
6449 bpf_program__set_type(prog, prog->sec_def->prog_type); in __bpf_object__open()
6450 bpf_program__set_expected_attach_type(prog, in __bpf_object__open()
6451 prog->sec_def->expected_attach_type); in __bpf_object__open()
6453 if (prog->sec_def->prog_type == BPF_PROG_TYPE_TRACING || in __bpf_object__open()
6454 prog->sec_def->prog_type == BPF_PROG_TYPE_EXT) in __bpf_object__open()
6455 prog->attach_prog_fd = OPTS_GET(opts, attach_prog_fd, 0); in __bpf_object__open()
6995 int bpf_program__pin_instance(struct bpf_program *prog, const char *path, in bpf_program__pin_instance() argument
7009 if (prog == NULL) { in bpf_program__pin_instance()
7014 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program__pin_instance()
7016 instance, prog->name, prog->instances.nr); in bpf_program__pin_instance()
7020 if (bpf_obj_pin(prog->instances.fds[instance], path)) { in bpf_program__pin_instance()
7031 int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, in bpf_program__unpin_instance() argument
7040 if (prog == NULL) { in bpf_program__unpin_instance()
7045 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program__unpin_instance()
7047 instance, prog->name, prog->instances.nr); in bpf_program__unpin_instance()
7060 int bpf_program__pin(struct bpf_program *prog, const char *path) in bpf_program__pin() argument
7072 if (prog == NULL) { in bpf_program__pin()
7077 if (prog->instances.nr <= 0) { in bpf_program__pin()
7078 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__pin()
7082 if (prog->instances.nr == 1) { in bpf_program__pin()
7084 return bpf_program__pin_instance(prog, path, 0); in bpf_program__pin()
7087 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__pin()
7100 err = bpf_program__pin_instance(prog, buf, i); in bpf_program__pin()
7118 bpf_program__unpin_instance(prog, buf, i); in bpf_program__pin()
7126 int bpf_program__unpin(struct bpf_program *prog, const char *path) in bpf_program__unpin() argument
7134 if (prog == NULL) { in bpf_program__unpin()
7139 if (prog->instances.nr <= 0) { in bpf_program__unpin()
7140 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__unpin()
7144 if (prog->instances.nr == 1) { in bpf_program__unpin()
7146 return bpf_program__unpin_instance(prog, path, 0); in bpf_program__unpin()
7149 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__unpin()
7159 err = bpf_program__unpin_instance(prog, buf, i); in bpf_program__unpin()
7398 struct bpf_program *prog; in bpf_object__pin_programs() local
7409 bpf_object__for_each_program(prog, obj) { in bpf_object__pin_programs()
7414 prog->pin_name); in bpf_object__pin_programs()
7423 err = bpf_program__pin(prog, buf); in bpf_object__pin_programs()
7431 while ((prog = bpf_program__prev(prog, obj))) { in bpf_object__pin_programs()
7436 prog->pin_name); in bpf_object__pin_programs()
7442 bpf_program__unpin(prog, buf); in bpf_object__pin_programs()
7450 struct bpf_program *prog; in bpf_object__unpin_programs() local
7456 bpf_object__for_each_program(prog, obj) { in bpf_object__unpin_programs()
7461 prog->pin_name); in bpf_object__unpin_programs()
7467 err = bpf_program__unpin(prog, buf); in bpf_object__unpin_programs()
7673 struct bpf_program *prog = prev; in bpf_program__next() local
7676 prog = __bpf_program__iter(prog, obj, true); in bpf_program__next()
7677 } while (prog && prog_is_subprog(obj, prog)); in bpf_program__next()
7679 return prog; in bpf_program__next()
7685 struct bpf_program *prog = next; in bpf_program__prev() local
7688 prog = __bpf_program__iter(prog, obj, false); in bpf_program__prev()
7689 } while (prog && prog_is_subprog(obj, prog)); in bpf_program__prev()
7691 return prog; in bpf_program__prev()
7694 int bpf_program__set_priv(struct bpf_program *prog, void *priv, in bpf_program__set_priv() argument
7697 if (prog->priv && prog->clear_priv) in bpf_program__set_priv()
7698 prog->clear_priv(prog, prog->priv); in bpf_program__set_priv()
7700 prog->priv = priv; in bpf_program__set_priv()
7701 prog->clear_priv = clear_priv; in bpf_program__set_priv()
7705 void *bpf_program__priv(const struct bpf_program *prog) in bpf_program__priv() argument
7707 return prog ? prog->priv : libbpf_err_ptr(-EINVAL); in bpf_program__priv()
7710 void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) in bpf_program__set_ifindex() argument
7712 prog->prog_ifindex = ifindex; in bpf_program__set_ifindex()
7715 const char *bpf_program__name(const struct bpf_program *prog) in bpf_program__name() argument
7717 return prog->name; in bpf_program__name()
7720 const char *bpf_program__section_name(const struct bpf_program *prog) in bpf_program__section_name() argument
7722 return prog->sec_name; in bpf_program__section_name()
7725 const char *bpf_program__title(const struct bpf_program *prog, bool needs_copy) in bpf_program__title() argument
7729 title = prog->sec_name; in bpf_program__title()
7741 bool bpf_program__autoload(const struct bpf_program *prog) in bpf_program__autoload() argument
7743 return prog->load; in bpf_program__autoload()
7746 int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) in bpf_program__set_autoload() argument
7748 if (prog->obj->loaded) in bpf_program__set_autoload()
7751 prog->load = autoload; in bpf_program__set_autoload()
7755 int bpf_program__fd(const struct bpf_program *prog) in bpf_program__fd() argument
7757 return bpf_program__nth_fd(prog, 0); in bpf_program__fd()
7760 size_t bpf_program__size(const struct bpf_program *prog) in bpf_program__size() argument
7762 return prog->insns_cnt * BPF_INSN_SZ; in bpf_program__size()
7765 int bpf_program__set_prep(struct bpf_program *prog, int nr_instances, in bpf_program__set_prep() argument
7773 if (prog->instances.nr > 0 || prog->instances.fds) { in bpf_program__set_prep()
7787 prog->instances.nr = nr_instances; in bpf_program__set_prep()
7788 prog->instances.fds = instances_fds; in bpf_program__set_prep()
7789 prog->preprocessor = prep; in bpf_program__set_prep()
7793 int bpf_program__nth_fd(const struct bpf_program *prog, int n) in bpf_program__nth_fd() argument
7797 if (!prog) in bpf_program__nth_fd()
7800 if (n >= prog->instances.nr || n < 0) { in bpf_program__nth_fd()
7802 n, prog->name, prog->instances.nr); in bpf_program__nth_fd()
7806 fd = prog->instances.fds[n]; in bpf_program__nth_fd()
7809 n, prog->name); in bpf_program__nth_fd()
7816 enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog) in bpf_program__get_type() argument
7818 return prog->type; in bpf_program__get_type()
7821 void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) in bpf_program__set_type() argument
7823 prog->type = type; in bpf_program__set_type()
7826 static bool bpf_program__is_type(const struct bpf_program *prog, in bpf_program__is_type() argument
7829 return prog ? (prog->type == type) : false; in bpf_program__is_type()
7833 int bpf_program__set_##NAME(struct bpf_program *prog) \
7835 if (!prog) \
7837 bpf_program__set_type(prog, TYPE); \
7841 bool bpf_program__is_##NAME(const struct bpf_program *prog) \
7843 return bpf_program__is_type(prog, TYPE); \
7861 bpf_program__get_expected_attach_type(const struct bpf_program *prog) in bpf_program__get_expected_attach_type() argument
7863 return prog->expected_attach_type; in bpf_program__get_expected_attach_type()
7866 void bpf_program__set_expected_attach_type(struct bpf_program *prog, in bpf_program__set_expected_attach_type() argument
7869 prog->expected_attach_type = type; in bpf_program__set_expected_attach_type()
7912 struct bpf_program *prog);
7914 struct bpf_program *prog);
7916 struct bpf_program *prog);
7918 struct bpf_program *prog);
7920 struct bpf_program *prog);
7922 struct bpf_program *prog);
8169 struct bpf_program *prog; in bpf_object__collect_st_ops_relos() local
8241 prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx); in bpf_object__collect_st_ops_relos()
8242 if (!prog) { in bpf_object__collect_st_ops_relos()
8248 if (prog->type == BPF_PROG_TYPE_UNSPEC) { in bpf_object__collect_st_ops_relos()
8251 sec_def = find_sec_def(prog->sec_name); in bpf_object__collect_st_ops_relos()
8255 prog->type = sec_def->prog_type; in bpf_object__collect_st_ops_relos()
8259 prog->type = BPF_PROG_TYPE_STRUCT_OPS; in bpf_object__collect_st_ops_relos()
8260 prog->attach_btf_id = st_ops->type_id; in bpf_object__collect_st_ops_relos()
8261 prog->expected_attach_type = member_idx; in bpf_object__collect_st_ops_relos()
8262 } else if (prog->type != BPF_PROG_TYPE_STRUCT_OPS || in bpf_object__collect_st_ops_relos()
8263 prog->attach_btf_id != st_ops->type_id || in bpf_object__collect_st_ops_relos()
8264 prog->expected_attach_type != member_idx) { in bpf_object__collect_st_ops_relos()
8267 st_ops->progs[member_idx] = prog; in bpf_object__collect_st_ops_relos()
8274 map->name, prog->name, prog->sec_name, prog->type, in bpf_object__collect_st_ops_relos()
8275 prog->attach_btf_id, prog->expected_attach_type, name); in bpf_object__collect_st_ops_relos()
8428 static int libbpf_find_attach_btf_id(struct bpf_program *prog, int *btf_obj_fd, int *btf_type_id) in libbpf_find_attach_btf_id() argument
8430 enum bpf_attach_type attach_type = prog->expected_attach_type; in libbpf_find_attach_btf_id()
8431 __u32 attach_prog_fd = prog->attach_prog_fd; in libbpf_find_attach_btf_id()
8432 const char *name = prog->sec_name, *attach_name; in libbpf_find_attach_btf_id()
8469 if (prog->obj->gen_loader) { in libbpf_find_attach_btf_id()
8470 bpf_gen__record_attach_target(prog->obj->gen_loader, attach_name, attach_type); in libbpf_find_attach_btf_id()
8474 err = find_kernel_btf_id(prog->obj, attach_name, attach_type, btf_obj_fd, btf_type_id); in libbpf_find_attach_btf_id()
8780 struct bpf_program *prog, *first_prog = NULL; in bpf_prog_load_xattr() local
8798 bpf_object__for_each_program(prog, obj) { in bpf_prog_load_xattr()
8806 bpf_program__set_type(prog, attr->prog_type); in bpf_prog_load_xattr()
8807 bpf_program__set_expected_attach_type(prog, in bpf_prog_load_xattr()
8810 if (bpf_program__get_type(prog) == BPF_PROG_TYPE_UNSPEC) { in bpf_prog_load_xattr()
8819 prog->prog_ifindex = attr->ifindex; in bpf_prog_load_xattr()
8820 prog->log_level = attr->log_level; in bpf_prog_load_xattr()
8821 prog->prog_flags |= attr->prog_flags; in bpf_prog_load_xattr()
8823 first_prog = prog; in bpf_prog_load_xattr()
8857 int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog) in bpf_link__update_program() argument
8861 ret = bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL); in bpf_link__update_program()
9018 struct bpf_link *bpf_program__attach_perf_event_opts(struct bpf_program *prog, int pfd, in bpf_program__attach_perf_event_opts() argument
9030 prog->name, pfd); in bpf_program__attach_perf_event_opts()
9033 prog_fd = bpf_program__fd(prog); in bpf_program__attach_perf_event_opts()
9036 prog->name); in bpf_program__attach_perf_event_opts()
9047 if (kernel_supports(prog->obj, FEAT_PERF_LINK)) { in bpf_program__attach_perf_event_opts()
9055 prog->name, pfd, in bpf_program__attach_perf_event_opts()
9062 pr_warn("prog '%s': user context value is not supported\n", prog->name); in bpf_program__attach_perf_event_opts()
9070 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
9073 prog->name, pfd); in bpf_program__attach_perf_event_opts()
9081 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
9093 struct bpf_link *bpf_program__attach_perf_event(struct bpf_program *prog, int pfd) in bpf_program__attach_perf_event() argument
9095 return bpf_program__attach_perf_event_opts(prog, pfd, NULL); in bpf_program__attach_perf_event()
9211 bpf_program__attach_kprobe_opts(struct bpf_program *prog, in bpf_program__attach_kprobe_opts() argument
9233 prog->name, retprobe ? "kretprobe" : "kprobe", func_name, in bpf_program__attach_kprobe_opts()
9237 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_kprobe_opts()
9242 prog->name, retprobe ? "kretprobe" : "kprobe", func_name, in bpf_program__attach_kprobe_opts()
9249 struct bpf_link *bpf_program__attach_kprobe(struct bpf_program *prog, in bpf_program__attach_kprobe() argument
9257 return bpf_program__attach_kprobe_opts(prog, func_name, &opts); in bpf_program__attach_kprobe()
9261 struct bpf_program *prog) in attach_kprobe() argument
9270 func_name = prog->sec_name + sec->len; in attach_kprobe()
9287 link = bpf_program__attach_kprobe_opts(prog, func, &opts); in attach_kprobe()
9293 bpf_program__attach_uprobe_opts(struct bpf_program *prog, pid_t pid, in bpf_program__attach_uprobe_opts() argument
9315 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
9320 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_uprobe_opts()
9325 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
9333 struct bpf_link *bpf_program__attach_uprobe(struct bpf_program *prog, in bpf_program__attach_uprobe() argument
9340 return bpf_program__attach_uprobe_opts(prog, pid, binary_path, func_offset, &opts); in bpf_program__attach_uprobe()
9393 struct bpf_link *bpf_program__attach_tracepoint_opts(struct bpf_program *prog, in bpf_program__attach_tracepoint_opts() argument
9411 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
9415 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_tracepoint_opts()
9420 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
9427 struct bpf_link *bpf_program__attach_tracepoint(struct bpf_program *prog, in bpf_program__attach_tracepoint() argument
9431 return bpf_program__attach_tracepoint_opts(prog, tp_category, tp_name, NULL); in bpf_program__attach_tracepoint()
9435 struct bpf_program *prog) in attach_tp() argument
9440 sec_name = strdup(prog->sec_name); in attach_tp()
9454 link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name); in attach_tp()
9459 struct bpf_link *bpf_program__attach_raw_tracepoint(struct bpf_program *prog, in bpf_program__attach_raw_tracepoint() argument
9466 prog_fd = bpf_program__fd(prog); in bpf_program__attach_raw_tracepoint()
9468 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_raw_tracepoint()
9482 prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_raw_tracepoint()
9490 struct bpf_program *prog) in attach_raw_tp() argument
9492 const char *tp_name = prog->sec_name + sec->len; in attach_raw_tp()
9494 return bpf_program__attach_raw_tracepoint(prog, tp_name); in attach_raw_tp()
9498 static struct bpf_link *bpf_program__attach_btf_id(struct bpf_program *prog) in bpf_program__attach_btf_id() argument
9504 prog_fd = bpf_program__fd(prog); in bpf_program__attach_btf_id()
9506 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_btf_id()
9520 prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_btf_id()
9527 struct bpf_link *bpf_program__attach_trace(struct bpf_program *prog) in bpf_program__attach_trace() argument
9529 return bpf_program__attach_btf_id(prog); in bpf_program__attach_trace()
9532 struct bpf_link *bpf_program__attach_lsm(struct bpf_program *prog) in bpf_program__attach_lsm() argument
9534 return bpf_program__attach_btf_id(prog); in bpf_program__attach_lsm()
9538 struct bpf_program *prog) in attach_trace() argument
9540 return bpf_program__attach_trace(prog); in attach_trace()
9544 struct bpf_program *prog) in attach_lsm() argument
9546 return bpf_program__attach_lsm(prog); in attach_lsm()
9550 bpf_program__attach_fd(struct bpf_program *prog, int target_fd, int btf_id, in bpf_program__attach_fd() argument
9560 prog_fd = bpf_program__fd(prog); in bpf_program__attach_fd()
9562 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_fd()
9571 attach_type = bpf_program__get_expected_attach_type(prog); in bpf_program__attach_fd()
9577 prog->name, target_name, in bpf_program__attach_fd()
9586 bpf_program__attach_cgroup(struct bpf_program *prog, int cgroup_fd) in bpf_program__attach_cgroup() argument
9588 return bpf_program__attach_fd(prog, cgroup_fd, 0, "cgroup"); in bpf_program__attach_cgroup()
9592 bpf_program__attach_netns(struct bpf_program *prog, int netns_fd) in bpf_program__attach_netns() argument
9594 return bpf_program__attach_fd(prog, netns_fd, 0, "netns"); in bpf_program__attach_netns()
9597 struct bpf_link *bpf_program__attach_xdp(struct bpf_program *prog, int ifindex) in bpf_program__attach_xdp() argument
9600 return bpf_program__attach_fd(prog, ifindex, 0, "xdp"); in bpf_program__attach_xdp()
9603 struct bpf_link *bpf_program__attach_freplace(struct bpf_program *prog, in bpf_program__attach_freplace() argument
9611 prog->name); in bpf_program__attach_freplace()
9615 if (prog->type != BPF_PROG_TYPE_EXT) { in bpf_program__attach_freplace()
9617 prog->name); in bpf_program__attach_freplace()
9626 return bpf_program__attach_fd(prog, target_fd, btf_id, "freplace"); in bpf_program__attach_freplace()
9631 return bpf_program__attach_trace(prog); in bpf_program__attach_freplace()
9636 bpf_program__attach_iter(struct bpf_program *prog, in bpf_program__attach_iter() argument
9651 prog_fd = bpf_program__fd(prog); in bpf_program__attach_iter()
9653 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_iter()
9668 prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); in bpf_program__attach_iter()
9676 struct bpf_program *prog) in attach_iter() argument
9678 return bpf_program__attach_iter(prog, NULL); in attach_iter()
9681 struct bpf_link *bpf_program__attach(struct bpf_program *prog) in bpf_program__attach() argument
9685 sec_def = find_sec_def(prog->sec_name); in bpf_program__attach()
9689 return sec_def->attach_fn(sec_def, prog); in bpf_program__attach()
9718 struct bpf_program *prog = st_ops->progs[i]; in bpf_map__attach_struct_ops() local
9722 if (!prog) in bpf_map__attach_struct_ops()
9725 prog_fd = bpf_program__fd(prog); in bpf_map__attach_struct_ops()
10509 int bpf_program__set_attach_target(struct bpf_program *prog, in bpf_program__set_attach_target() argument
10515 if (!prog || attach_prog_fd < 0 || !attach_func_name) in bpf_program__set_attach_target()
10518 if (prog->obj->loaded) in bpf_program__set_attach_target()
10528 err = bpf_object__load_vmlinux_btf(prog->obj, true); in bpf_program__set_attach_target()
10531 err = find_kernel_btf_id(prog->obj, attach_func_name, in bpf_program__set_attach_target()
10532 prog->expected_attach_type, in bpf_program__set_attach_target()
10538 prog->attach_btf_id = btf_id; in bpf_program__set_attach_target()
10539 prog->attach_btf_obj_fd = btf_obj_fd; in bpf_program__set_attach_target()
10540 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
10695 struct bpf_program **prog = s->progs[i].prog; in bpf_object__open_skeleton() local
10698 *prog = bpf_object__find_program_by_name(obj, name); in bpf_object__open_skeleton()
10699 if (!*prog) { in bpf_object__open_skeleton()
10766 struct bpf_program *prog = *s->progs[i].prog; in bpf_object__attach_skeleton() local
10770 if (!prog->load) in bpf_object__attach_skeleton()
10773 sec_def = find_sec_def(prog->sec_name); in bpf_object__attach_skeleton()
10777 *link = sec_def->attach_fn(sec_def, prog); in bpf_object__attach_skeleton()
10781 bpf_program__name(prog), err); in bpf_object__attach_skeleton()