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()
3539 const struct bpf_program *prog) in prog_is_subprog() argument
3553 return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1; in prog_is_subprog()
3560 struct bpf_program *prog; in bpf_object__find_program_by_name() local
3562 bpf_object__for_each_program(prog, obj) { in bpf_object__find_program_by_name()
3563 if (prog_is_subprog(obj, prog)) in bpf_object__find_program_by_name()
3565 if (!strcmp(prog->name, name)) in bpf_object__find_program_by_name()
3566 return prog; in bpf_object__find_program_by_name()
3601 static int bpf_program__record_reloc(struct bpf_program *prog, in bpf_program__record_reloc() argument
3606 struct bpf_insn *insn = &prog->insns[insn_idx]; in bpf_program__record_reloc()
3607 size_t map_idx, nr_maps = prog->obj->nr_maps; in bpf_program__record_reloc()
3608 struct bpf_object *obj = prog->obj; in bpf_program__record_reloc()
3616 prog->name, sym_name, insn_idx, insn->code); in bpf_program__record_reloc()
3632 prog->name, sym_name, sym_idx); in bpf_program__record_reloc()
3636 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
3649 pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name); in bpf_program__record_reloc()
3656 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3661 prog->name, sym_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3672 prog->name, sym_name, shdr_idx); in bpf_program__record_reloc()
3683 prog->name, sym_name, (size_t)sym->st_value, insn->imm); in bpf_program__record_reloc()
3700 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3710 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3716 prog->name, sym_sec_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3729 prog->name, sym_sec_name); in bpf_program__record_reloc()
3737 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3743 prog->name, sym_sec_name); in bpf_program__record_reloc()
3754 static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) in prog_contains_insn() argument
3756 return insn_idx >= prog->sec_insn_off && in prog_contains_insn()
3757 insn_idx < prog->sec_insn_off + prog->sec_insn_cnt; in prog_contains_insn()
3764 struct bpf_program *prog; in find_prog_by_sec_insn() local
3771 prog = &obj->programs[m]; in find_prog_by_sec_insn()
3773 if (prog->sec_idx < sec_idx || in find_prog_by_sec_insn()
3774 (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx)) in find_prog_by_sec_insn()
3782 prog = &obj->programs[l]; in find_prog_by_sec_insn()
3783 if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx)) in find_prog_by_sec_insn()
3784 return prog; in find_prog_by_sec_insn()
3794 struct bpf_program *prog; in bpf_object__collect_prog_relos() local
3851 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__collect_prog_relos()
3852 if (!prog) { in bpf_object__collect_prog_relos()
3858 relos = libbpf_reallocarray(prog->reloc_desc, in bpf_object__collect_prog_relos()
3859 prog->nr_reloc + 1, sizeof(*relos)); in bpf_object__collect_prog_relos()
3862 prog->reloc_desc = relos; in bpf_object__collect_prog_relos()
3865 insn_idx -= prog->sec_insn_off; in bpf_object__collect_prog_relos()
3866 err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc], in bpf_object__collect_prog_relos()
3871 prog->nr_reloc++; in bpf_object__collect_prog_relos()
4292 int ret, map, prog; in probe_prog_bind_map() local
4315 prog = bpf_load_program_xattr(&prg_attr, NULL, 0); in probe_prog_bind_map()
4316 if (prog < 0) { in probe_prog_bind_map()
4321 ret = bpf_prog_bind_map(prog, map, NULL); in probe_prog_bind_map()
4324 close(prog); in probe_prog_bind_map()
5128 static int bpf_core_apply_relo(struct bpf_program *prog, in bpf_core_apply_relo() argument
5136 const char *prog_name = prog->name; in bpf_core_apply_relo()
5150 insn_idx = insn_idx - prog->sec_insn_off; in bpf_core_apply_relo()
5151 if (insn_idx >= prog->insns_cnt) in bpf_core_apply_relo()
5153 insn = &prog->insns[insn_idx]; in bpf_core_apply_relo()
5163 if (prog->obj->gen_loader) { in bpf_core_apply_relo()
5165 prog - prog->obj->programs, relo->insn_off / 8, in bpf_core_apply_relo()
5172 cands = bpf_core_find_cands(prog->obj, local_btf, local_id); in bpf_core_apply_relo()
5197 struct bpf_program *prog; in bpf_object__relocate_core() local
5232 prog = NULL; in bpf_object__relocate_core()
5235 prog = &obj->programs[i]; in bpf_object__relocate_core()
5239 if (!prog) { in bpf_object__relocate_core()
5243 sec_idx = prog->sec_idx; in bpf_object__relocate_core()
5250 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__relocate_core()
5251 if (!prog) { in bpf_object__relocate_core()
5267 if (!prog->load) in bpf_object__relocate_core()
5270 err = bpf_core_apply_relo(prog, rec, i, obj->btf, cand_cache); in bpf_object__relocate_core()
5273 prog->name, i, err); in bpf_object__relocate_core()
5299 bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_data() argument
5303 for (i = 0; i < prog->nr_reloc; i++) { in bpf_object__relocate_data()
5304 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_object__relocate_data()
5305 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate_data()
5358 prog->name, i); in bpf_object__relocate_data()
5368 prog->name, i, relo->type); in bpf_object__relocate_data()
5377 const struct bpf_program *prog, in adjust_prog_btf_ext_info() argument
5393 if (strcmp(sec_name, prog->sec_name) != 0) in adjust_prog_btf_ext_info()
5399 if (insn_off < prog->sec_insn_off) in adjust_prog_btf_ext_info()
5401 if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt) in adjust_prog_btf_ext_info()
5430 off_adj = prog->sub_insn_off - prog->sec_insn_off; in adjust_prog_btf_ext_info()
5448 const struct bpf_program *prog) in reloc_prog_func_and_line_info() argument
5461 if (main_prog != prog && !main_prog->func_info) in reloc_prog_func_and_line_info()
5464 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info, in reloc_prog_func_and_line_info()
5471 prog->name, err); in reloc_prog_func_and_line_info()
5479 pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name); in reloc_prog_func_and_line_info()
5484 prog->name); in reloc_prog_func_and_line_info()
5489 if (main_prog != prog && !main_prog->line_info) in reloc_prog_func_and_line_info()
5492 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info, in reloc_prog_func_and_line_info()
5499 prog->name, err); in reloc_prog_func_and_line_info()
5507 pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name); in reloc_prog_func_and_line_info()
5512 prog->name); in reloc_prog_func_and_line_info()
5527 static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) in find_prog_insn_relo() argument
5529 return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc, in find_prog_insn_relo()
5530 sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx); in find_prog_insn_relo()
5559 struct bpf_program *prog) in bpf_object__reloc_code() argument
5567 err = reloc_prog_func_and_line_info(obj, main_prog, prog); in bpf_object__reloc_code()
5571 for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) { in bpf_object__reloc_code()
5572 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
5576 relo = find_prog_insn_relo(prog, insn_idx); in bpf_object__reloc_code()
5584 prog->name, insn_idx, relo->type); in bpf_object__reloc_code()
5608 prog->name, insn_idx); in bpf_object__reloc_code()
5617 sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1; in bpf_object__reloc_code()
5624 prog->name); in bpf_object__reloc_code()
5668 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
5674 insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1; in bpf_object__reloc_code()
5677 prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off); in bpf_object__reloc_code()
5765 bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_calls() argument
5781 err = bpf_object__reloc_code(obj, prog, prog); in bpf_object__relocate_calls()
5792 struct bpf_program *prog; in bpf_object__free_relocs() local
5797 prog = &obj->programs[i]; in bpf_object__free_relocs()
5798 zfree(&prog->reloc_desc); in bpf_object__free_relocs()
5799 prog->nr_reloc = 0; in bpf_object__free_relocs()
5806 struct bpf_program *prog; in bpf_object__relocate() local
5827 prog = &obj->programs[i]; in bpf_object__relocate()
5828 for (j = 0; j < prog->nr_reloc; j++) { in bpf_object__relocate()
5829 struct reloc_desc *relo = &prog->reloc_desc[j]; in bpf_object__relocate()
5830 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate()
5846 prog = &obj->programs[i]; in bpf_object__relocate()
5850 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
5853 err = bpf_object__relocate_calls(obj, prog); in bpf_object__relocate()
5856 prog->name, err); in bpf_object__relocate()
5862 prog = &obj->programs[i]; in bpf_object__relocate()
5863 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
5865 err = bpf_object__relocate_data(obj, prog); in bpf_object__relocate()
5868 prog->name, err); in bpf_object__relocate()
6056 static int bpf_object__sanitize_prog(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__sanitize_prog() argument
6058 struct bpf_insn *insn = prog->insns; in bpf_object__sanitize_prog()
6065 for (i = 0; i < prog->insns_cnt; i++, insn++) { in bpf_object__sanitize_prog()
6092 load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt, in load_program() argument
6101 if (prog->type == BPF_PROG_TYPE_UNSPEC) { in load_program()
6107 prog->name, prog->sec_name); in load_program()
6114 load_attr.prog_type = prog->type; in load_program()
6116 if (!kernel_supports(prog->obj, FEAT_EXP_ATTACH_TYPE) && prog->sec_def && in load_program()
6117 prog->sec_def->is_exp_attach_type_optional) in load_program()
6120 load_attr.expected_attach_type = prog->expected_attach_type; in load_program()
6121 if (kernel_supports(prog->obj, FEAT_PROG_NAME)) in load_program()
6122 load_attr.name = prog->name; in load_program()
6126 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6127 if (prog->attach_prog_fd) in load_program()
6128 load_attr.attach_prog_fd = prog->attach_prog_fd; in load_program()
6130 load_attr.attach_btf_obj_fd = prog->attach_btf_obj_fd; in load_program()
6131 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6133 load_attr.prog_ifindex = prog->prog_ifindex; in load_program()
6136 btf_fd = bpf_object__btf_fd(prog->obj); in load_program()
6137 if (btf_fd >= 0 && kernel_supports(prog->obj, FEAT_BTF_FUNC)) { in load_program()
6139 load_attr.func_info = prog->func_info; in load_program()
6140 load_attr.func_info_rec_size = prog->func_info_rec_size; in load_program()
6141 load_attr.func_info_cnt = prog->func_info_cnt; in load_program()
6142 load_attr.line_info = prog->line_info; in load_program()
6143 load_attr.line_info_rec_size = prog->line_info_rec_size; in load_program()
6144 load_attr.line_info_cnt = prog->line_info_cnt; in load_program()
6146 load_attr.log_level = prog->log_level; in load_program()
6147 load_attr.prog_flags = prog->prog_flags; in load_program()
6149 if (prog->obj->gen_loader) { in load_program()
6150 bpf_gen__prog_load(prog->obj->gen_loader, &load_attr, in load_program()
6151 prog - prog->obj->programs); in load_program()
6172 if (prog->obj->rodata_map_idx >= 0 && in load_program()
6173 kernel_supports(prog->obj, FEAT_PROG_BIND_MAP)) { in load_program()
6175 &prog->obj->maps[prog->obj->rodata_map_idx]; in load_program()
6180 prog->name, cp); in load_program()
6232 static int bpf_program__record_externs(struct bpf_program *prog) in bpf_program__record_externs() argument
6234 struct bpf_object *obj = prog->obj; in bpf_program__record_externs()
6237 for (i = 0; i < prog->nr_reloc; i++) { in bpf_program__record_externs()
6238 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_program__record_externs()
6264 static int libbpf_find_attach_btf_id(struct bpf_program *prog, int *btf_obj_fd, int *btf_type_id);
6266 int bpf_program__load(struct bpf_program *prog, char *license, __u32 kern_ver) in bpf_program__load() argument
6270 if (prog->obj->loaded) { in bpf_program__load()
6271 pr_warn("prog '%s': can't load after object was loaded\n", prog->name); in bpf_program__load()
6275 if ((prog->type == BPF_PROG_TYPE_TRACING || in bpf_program__load()
6276 prog->type == BPF_PROG_TYPE_LSM || in bpf_program__load()
6277 prog->type == BPF_PROG_TYPE_EXT) && !prog->attach_btf_id) { in bpf_program__load()
6280 err = libbpf_find_attach_btf_id(prog, &btf_obj_fd, &btf_type_id); in bpf_program__load()
6284 prog->attach_btf_obj_fd = btf_obj_fd; in bpf_program__load()
6285 prog->attach_btf_id = btf_type_id; in bpf_program__load()
6288 if (prog->instances.nr < 0 || !prog->instances.fds) { in bpf_program__load()
6289 if (prog->preprocessor) { in bpf_program__load()
6291 prog->name); in bpf_program__load()
6295 prog->instances.fds = malloc(sizeof(int)); in bpf_program__load()
6296 if (!prog->instances.fds) { in bpf_program__load()
6300 prog->instances.nr = 1; in bpf_program__load()
6301 prog->instances.fds[0] = -1; in bpf_program__load()
6304 if (!prog->preprocessor) { in bpf_program__load()
6305 if (prog->instances.nr != 1) { in bpf_program__load()
6307 prog->name, prog->instances.nr); in bpf_program__load()
6309 if (prog->obj->gen_loader) in bpf_program__load()
6310 bpf_program__record_externs(prog); in bpf_program__load()
6311 err = load_program(prog, prog->insns, prog->insns_cnt, in bpf_program__load()
6314 prog->instances.fds[0] = fd; in bpf_program__load()
6318 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__load()
6320 bpf_program_prep_t preprocessor = prog->preprocessor; in bpf_program__load()
6323 err = preprocessor(prog, i, prog->insns, in bpf_program__load()
6324 prog->insns_cnt, &result); in bpf_program__load()
6327 i, prog->name); in bpf_program__load()
6333 i, prog->name); in bpf_program__load()
6334 prog->instances.fds[i] = -1; in bpf_program__load()
6340 err = load_program(prog, result.new_insn_ptr, in bpf_program__load()
6344 i, prog->name); in bpf_program__load()
6350 prog->instances.fds[i] = fd; in bpf_program__load()
6354 pr_warn("failed to load program '%s'\n", prog->name); in bpf_program__load()
6355 zfree(&prog->insns); in bpf_program__load()
6356 prog->insns_cnt = 0; in bpf_program__load()
6363 struct bpf_program *prog; in bpf_object__load_progs() local
6368 prog = &obj->programs[i]; in bpf_object__load_progs()
6369 err = bpf_object__sanitize_prog(obj, prog); in bpf_object__load_progs()
6375 prog = &obj->programs[i]; in bpf_object__load_progs()
6376 if (prog_is_subprog(obj, prog)) in bpf_object__load_progs()
6378 if (!prog->load) { in bpf_object__load_progs()
6379 pr_debug("prog '%s': skipped loading\n", prog->name); in bpf_object__load_progs()
6382 prog->log_level |= log_level; in bpf_object__load_progs()
6383 err = bpf_program__load(prog, obj->license, obj->kern_version); in bpf_object__load_progs()
6399 struct bpf_program *prog; in __bpf_object__open() local
6462 bpf_object__for_each_program(prog, obj) { in __bpf_object__open()
6463 prog->sec_def = find_sec_def(prog->sec_name); in __bpf_object__open()
6464 if (!prog->sec_def) { in __bpf_object__open()
6467 prog->name, prog->sec_name); in __bpf_object__open()
6471 if (prog->sec_def->is_sleepable) in __bpf_object__open()
6472 prog->prog_flags |= BPF_F_SLEEPABLE; in __bpf_object__open()
6473 bpf_program__set_type(prog, prog->sec_def->prog_type); in __bpf_object__open()
6474 bpf_program__set_expected_attach_type(prog, in __bpf_object__open()
6475 prog->sec_def->expected_attach_type); in __bpf_object__open()
6477 if (prog->sec_def->prog_type == BPF_PROG_TYPE_TRACING || in __bpf_object__open()
6478 prog->sec_def->prog_type == BPF_PROG_TYPE_EXT) in __bpf_object__open()
6479 prog->attach_prog_fd = OPTS_GET(opts, attach_prog_fd, 0); in __bpf_object__open()
7019 int bpf_program__pin_instance(struct bpf_program *prog, const char *path, in bpf_program__pin_instance() argument
7033 if (prog == NULL) { in bpf_program__pin_instance()
7038 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program__pin_instance()
7040 instance, prog->name, prog->instances.nr); in bpf_program__pin_instance()
7044 if (bpf_obj_pin(prog->instances.fds[instance], path)) { in bpf_program__pin_instance()
7055 int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, in bpf_program__unpin_instance() argument
7064 if (prog == NULL) { in bpf_program__unpin_instance()
7069 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program__unpin_instance()
7071 instance, prog->name, prog->instances.nr); in bpf_program__unpin_instance()
7084 int bpf_program__pin(struct bpf_program *prog, const char *path) in bpf_program__pin() argument
7096 if (prog == NULL) { in bpf_program__pin()
7101 if (prog->instances.nr <= 0) { in bpf_program__pin()
7102 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__pin()
7106 if (prog->instances.nr == 1) { in bpf_program__pin()
7108 return bpf_program__pin_instance(prog, path, 0); in bpf_program__pin()
7111 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__pin()
7124 err = bpf_program__pin_instance(prog, buf, i); in bpf_program__pin()
7142 bpf_program__unpin_instance(prog, buf, i); in bpf_program__pin()
7150 int bpf_program__unpin(struct bpf_program *prog, const char *path) in bpf_program__unpin() argument
7158 if (prog == NULL) { in bpf_program__unpin()
7163 if (prog->instances.nr <= 0) { in bpf_program__unpin()
7164 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__unpin()
7168 if (prog->instances.nr == 1) { in bpf_program__unpin()
7170 return bpf_program__unpin_instance(prog, path, 0); in bpf_program__unpin()
7173 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__unpin()
7183 err = bpf_program__unpin_instance(prog, buf, i); in bpf_program__unpin()
7422 struct bpf_program *prog; in bpf_object__pin_programs() local
7433 bpf_object__for_each_program(prog, obj) { in bpf_object__pin_programs()
7438 prog->pin_name); in bpf_object__pin_programs()
7447 err = bpf_program__pin(prog, buf); in bpf_object__pin_programs()
7455 while ((prog = bpf_program__prev(prog, obj))) { in bpf_object__pin_programs()
7460 prog->pin_name); in bpf_object__pin_programs()
7466 bpf_program__unpin(prog, buf); in bpf_object__pin_programs()
7474 struct bpf_program *prog; in bpf_object__unpin_programs() local
7480 bpf_object__for_each_program(prog, obj) { in bpf_object__unpin_programs()
7485 prog->pin_name); in bpf_object__unpin_programs()
7491 err = bpf_program__unpin(prog, buf); in bpf_object__unpin_programs()
7697 struct bpf_program *prog = prev; in bpf_program__next() local
7700 prog = __bpf_program__iter(prog, obj, true); in bpf_program__next()
7701 } while (prog && prog_is_subprog(obj, prog)); in bpf_program__next()
7703 return prog; in bpf_program__next()
7709 struct bpf_program *prog = next; in bpf_program__prev() local
7712 prog = __bpf_program__iter(prog, obj, false); in bpf_program__prev()
7713 } while (prog && prog_is_subprog(obj, prog)); in bpf_program__prev()
7715 return prog; in bpf_program__prev()
7718 int bpf_program__set_priv(struct bpf_program *prog, void *priv, in bpf_program__set_priv() argument
7721 if (prog->priv && prog->clear_priv) in bpf_program__set_priv()
7722 prog->clear_priv(prog, prog->priv); in bpf_program__set_priv()
7724 prog->priv = priv; in bpf_program__set_priv()
7725 prog->clear_priv = clear_priv; in bpf_program__set_priv()
7729 void *bpf_program__priv(const struct bpf_program *prog) in bpf_program__priv() argument
7731 return prog ? prog->priv : libbpf_err_ptr(-EINVAL); in bpf_program__priv()
7734 void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) in bpf_program__set_ifindex() argument
7736 prog->prog_ifindex = ifindex; in bpf_program__set_ifindex()
7739 const char *bpf_program__name(const struct bpf_program *prog) in bpf_program__name() argument
7741 return prog->name; in bpf_program__name()
7744 const char *bpf_program__section_name(const struct bpf_program *prog) in bpf_program__section_name() argument
7746 return prog->sec_name; in bpf_program__section_name()
7749 const char *bpf_program__title(const struct bpf_program *prog, bool needs_copy) in bpf_program__title() argument
7753 title = prog->sec_name; in bpf_program__title()
7765 bool bpf_program__autoload(const struct bpf_program *prog) in bpf_program__autoload() argument
7767 return prog->load; in bpf_program__autoload()
7770 int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) in bpf_program__set_autoload() argument
7772 if (prog->obj->loaded) in bpf_program__set_autoload()
7775 prog->load = autoload; in bpf_program__set_autoload()
7779 int bpf_program__fd(const struct bpf_program *prog) in bpf_program__fd() argument
7781 return bpf_program__nth_fd(prog, 0); in bpf_program__fd()
7784 size_t bpf_program__size(const struct bpf_program *prog) in bpf_program__size() argument
7786 return prog->insns_cnt * BPF_INSN_SZ; in bpf_program__size()
7789 int bpf_program__set_prep(struct bpf_program *prog, int nr_instances, in bpf_program__set_prep() argument
7797 if (prog->instances.nr > 0 || prog->instances.fds) { in bpf_program__set_prep()
7811 prog->instances.nr = nr_instances; in bpf_program__set_prep()
7812 prog->instances.fds = instances_fds; in bpf_program__set_prep()
7813 prog->preprocessor = prep; in bpf_program__set_prep()
7817 int bpf_program__nth_fd(const struct bpf_program *prog, int n) in bpf_program__nth_fd() argument
7821 if (!prog) in bpf_program__nth_fd()
7824 if (n >= prog->instances.nr || n < 0) { in bpf_program__nth_fd()
7826 n, prog->name, prog->instances.nr); in bpf_program__nth_fd()
7830 fd = prog->instances.fds[n]; in bpf_program__nth_fd()
7833 n, prog->name); in bpf_program__nth_fd()
7840 enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog) in bpf_program__get_type() argument
7842 return prog->type; in bpf_program__get_type()
7845 void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) in bpf_program__set_type() argument
7847 prog->type = type; in bpf_program__set_type()
7850 static bool bpf_program__is_type(const struct bpf_program *prog, in bpf_program__is_type() argument
7853 return prog ? (prog->type == type) : false; in bpf_program__is_type()
7857 int bpf_program__set_##NAME(struct bpf_program *prog) \
7859 if (!prog) \
7861 bpf_program__set_type(prog, TYPE); \
7865 bool bpf_program__is_##NAME(const struct bpf_program *prog) \
7867 return bpf_program__is_type(prog, TYPE); \
7885 bpf_program__get_expected_attach_type(const struct bpf_program *prog) in bpf_program__get_expected_attach_type() argument
7887 return prog->expected_attach_type; in bpf_program__get_expected_attach_type()
7890 void bpf_program__set_expected_attach_type(struct bpf_program *prog, in bpf_program__set_expected_attach_type() argument
7893 prog->expected_attach_type = type; in bpf_program__set_expected_attach_type()
7936 struct bpf_program *prog);
7938 struct bpf_program *prog);
7940 struct bpf_program *prog);
7942 struct bpf_program *prog);
7944 struct bpf_program *prog);
7946 struct bpf_program *prog);
8193 struct bpf_program *prog; in bpf_object__collect_st_ops_relos() local
8265 prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx); in bpf_object__collect_st_ops_relos()
8266 if (!prog) { in bpf_object__collect_st_ops_relos()
8272 if (prog->type == BPF_PROG_TYPE_UNSPEC) { in bpf_object__collect_st_ops_relos()
8275 sec_def = find_sec_def(prog->sec_name); in bpf_object__collect_st_ops_relos()
8279 prog->type = sec_def->prog_type; in bpf_object__collect_st_ops_relos()
8283 prog->type = BPF_PROG_TYPE_STRUCT_OPS; in bpf_object__collect_st_ops_relos()
8284 prog->attach_btf_id = st_ops->type_id; in bpf_object__collect_st_ops_relos()
8285 prog->expected_attach_type = member_idx; in bpf_object__collect_st_ops_relos()
8286 } else if (prog->type != BPF_PROG_TYPE_STRUCT_OPS || in bpf_object__collect_st_ops_relos()
8287 prog->attach_btf_id != st_ops->type_id || in bpf_object__collect_st_ops_relos()
8288 prog->expected_attach_type != member_idx) { in bpf_object__collect_st_ops_relos()
8291 st_ops->progs[member_idx] = prog; in bpf_object__collect_st_ops_relos()
8298 map->name, prog->name, prog->sec_name, prog->type, in bpf_object__collect_st_ops_relos()
8299 prog->attach_btf_id, prog->expected_attach_type, name); in bpf_object__collect_st_ops_relos()
8452 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
8454 enum bpf_attach_type attach_type = prog->expected_attach_type; in libbpf_find_attach_btf_id()
8455 __u32 attach_prog_fd = prog->attach_prog_fd; in libbpf_find_attach_btf_id()
8456 const char *name = prog->sec_name, *attach_name; in libbpf_find_attach_btf_id()
8493 if (prog->obj->gen_loader) { in libbpf_find_attach_btf_id()
8494 bpf_gen__record_attach_target(prog->obj->gen_loader, attach_name, attach_type); in libbpf_find_attach_btf_id()
8498 err = find_kernel_btf_id(prog->obj, attach_name, attach_type, btf_obj_fd, btf_type_id); in libbpf_find_attach_btf_id()
8807 struct bpf_program *prog, *first_prog = NULL; in bpf_prog_load_xattr() local
8825 bpf_object__for_each_program(prog, obj) { in bpf_prog_load_xattr()
8833 bpf_program__set_type(prog, attr->prog_type); in bpf_prog_load_xattr()
8834 bpf_program__set_expected_attach_type(prog, in bpf_prog_load_xattr()
8837 if (bpf_program__get_type(prog) == BPF_PROG_TYPE_UNSPEC) { in bpf_prog_load_xattr()
8846 prog->prog_ifindex = attr->ifindex; in bpf_prog_load_xattr()
8847 prog->log_level = attr->log_level; in bpf_prog_load_xattr()
8848 prog->prog_flags |= attr->prog_flags; in bpf_prog_load_xattr()
8850 first_prog = prog; in bpf_prog_load_xattr()
8884 int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog) in bpf_link__update_program() argument
8888 ret = bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL); in bpf_link__update_program()
9045 struct bpf_link *bpf_program__attach_perf_event_opts(struct bpf_program *prog, int pfd, in bpf_program__attach_perf_event_opts() argument
9057 prog->name, pfd); in bpf_program__attach_perf_event_opts()
9060 prog_fd = bpf_program__fd(prog); in bpf_program__attach_perf_event_opts()
9063 prog->name); in bpf_program__attach_perf_event_opts()
9074 if (kernel_supports(prog->obj, FEAT_PERF_LINK)) { in bpf_program__attach_perf_event_opts()
9082 prog->name, pfd, in bpf_program__attach_perf_event_opts()
9089 pr_warn("prog '%s': user context value is not supported\n", prog->name); in bpf_program__attach_perf_event_opts()
9097 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
9100 prog->name, pfd); in bpf_program__attach_perf_event_opts()
9108 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
9120 struct bpf_link *bpf_program__attach_perf_event(struct bpf_program *prog, int pfd) in bpf_program__attach_perf_event() argument
9122 return bpf_program__attach_perf_event_opts(prog, pfd, NULL); in bpf_program__attach_perf_event()
9238 bpf_program__attach_kprobe_opts(struct bpf_program *prog, in bpf_program__attach_kprobe_opts() argument
9260 prog->name, retprobe ? "kretprobe" : "kprobe", func_name, in bpf_program__attach_kprobe_opts()
9264 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_kprobe_opts()
9269 prog->name, retprobe ? "kretprobe" : "kprobe", func_name, in bpf_program__attach_kprobe_opts()
9276 struct bpf_link *bpf_program__attach_kprobe(struct bpf_program *prog, in bpf_program__attach_kprobe() argument
9284 return bpf_program__attach_kprobe_opts(prog, func_name, &opts); in bpf_program__attach_kprobe()
9288 struct bpf_program *prog) in attach_kprobe() argument
9297 func_name = prog->sec_name + sec->len; in attach_kprobe()
9314 link = bpf_program__attach_kprobe_opts(prog, func, &opts); in attach_kprobe()
9320 bpf_program__attach_uprobe_opts(struct bpf_program *prog, pid_t pid, in bpf_program__attach_uprobe_opts() argument
9342 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
9347 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_uprobe_opts()
9352 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
9360 struct bpf_link *bpf_program__attach_uprobe(struct bpf_program *prog, in bpf_program__attach_uprobe() argument
9367 return bpf_program__attach_uprobe_opts(prog, pid, binary_path, func_offset, &opts); in bpf_program__attach_uprobe()
9420 struct bpf_link *bpf_program__attach_tracepoint_opts(struct bpf_program *prog, in bpf_program__attach_tracepoint_opts() argument
9438 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
9442 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_tracepoint_opts()
9447 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
9454 struct bpf_link *bpf_program__attach_tracepoint(struct bpf_program *prog, in bpf_program__attach_tracepoint() argument
9458 return bpf_program__attach_tracepoint_opts(prog, tp_category, tp_name, NULL); in bpf_program__attach_tracepoint()
9462 struct bpf_program *prog) in attach_tp() argument
9467 sec_name = strdup(prog->sec_name); in attach_tp()
9481 link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name); in attach_tp()
9486 struct bpf_link *bpf_program__attach_raw_tracepoint(struct bpf_program *prog, in bpf_program__attach_raw_tracepoint() argument
9493 prog_fd = bpf_program__fd(prog); in bpf_program__attach_raw_tracepoint()
9495 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_raw_tracepoint()
9509 prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_raw_tracepoint()
9517 struct bpf_program *prog) in attach_raw_tp() argument
9519 const char *tp_name = prog->sec_name + sec->len; in attach_raw_tp()
9521 return bpf_program__attach_raw_tracepoint(prog, tp_name); in attach_raw_tp()
9525 static struct bpf_link *bpf_program__attach_btf_id(struct bpf_program *prog) in bpf_program__attach_btf_id() argument
9531 prog_fd = bpf_program__fd(prog); in bpf_program__attach_btf_id()
9533 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_btf_id()
9547 prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_btf_id()
9554 struct bpf_link *bpf_program__attach_trace(struct bpf_program *prog) in bpf_program__attach_trace() argument
9556 return bpf_program__attach_btf_id(prog); in bpf_program__attach_trace()
9559 struct bpf_link *bpf_program__attach_lsm(struct bpf_program *prog) in bpf_program__attach_lsm() argument
9561 return bpf_program__attach_btf_id(prog); in bpf_program__attach_lsm()
9565 struct bpf_program *prog) in attach_trace() argument
9567 return bpf_program__attach_trace(prog); in attach_trace()
9571 struct bpf_program *prog) in attach_lsm() argument
9573 return bpf_program__attach_lsm(prog); in attach_lsm()
9577 bpf_program__attach_fd(struct bpf_program *prog, int target_fd, int btf_id, in bpf_program__attach_fd() argument
9587 prog_fd = bpf_program__fd(prog); in bpf_program__attach_fd()
9589 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_fd()
9598 attach_type = bpf_program__get_expected_attach_type(prog); in bpf_program__attach_fd()
9604 prog->name, target_name, in bpf_program__attach_fd()
9613 bpf_program__attach_cgroup(struct bpf_program *prog, int cgroup_fd) in bpf_program__attach_cgroup() argument
9615 return bpf_program__attach_fd(prog, cgroup_fd, 0, "cgroup"); in bpf_program__attach_cgroup()
9619 bpf_program__attach_netns(struct bpf_program *prog, int netns_fd) in bpf_program__attach_netns() argument
9621 return bpf_program__attach_fd(prog, netns_fd, 0, "netns"); in bpf_program__attach_netns()
9624 struct bpf_link *bpf_program__attach_xdp(struct bpf_program *prog, int ifindex) in bpf_program__attach_xdp() argument
9627 return bpf_program__attach_fd(prog, ifindex, 0, "xdp"); in bpf_program__attach_xdp()
9630 struct bpf_link *bpf_program__attach_freplace(struct bpf_program *prog, in bpf_program__attach_freplace() argument
9638 prog->name); in bpf_program__attach_freplace()
9642 if (prog->type != BPF_PROG_TYPE_EXT) { in bpf_program__attach_freplace()
9644 prog->name); in bpf_program__attach_freplace()
9653 return bpf_program__attach_fd(prog, target_fd, btf_id, "freplace"); in bpf_program__attach_freplace()
9658 return bpf_program__attach_trace(prog); in bpf_program__attach_freplace()
9663 bpf_program__attach_iter(struct bpf_program *prog, in bpf_program__attach_iter() argument
9678 prog_fd = bpf_program__fd(prog); in bpf_program__attach_iter()
9680 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_iter()
9695 prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); in bpf_program__attach_iter()
9703 struct bpf_program *prog) in attach_iter() argument
9705 return bpf_program__attach_iter(prog, NULL); in attach_iter()
9708 struct bpf_link *bpf_program__attach(struct bpf_program *prog) in bpf_program__attach() argument
9712 sec_def = find_sec_def(prog->sec_name); in bpf_program__attach()
9716 return sec_def->attach_fn(sec_def, prog); in bpf_program__attach()
9745 struct bpf_program *prog = st_ops->progs[i]; in bpf_map__attach_struct_ops() local
9749 if (!prog) in bpf_map__attach_struct_ops()
9752 prog_fd = bpf_program__fd(prog); in bpf_map__attach_struct_ops()
10536 int bpf_program__set_attach_target(struct bpf_program *prog, in bpf_program__set_attach_target() argument
10542 if (!prog || attach_prog_fd < 0 || !attach_func_name) in bpf_program__set_attach_target()
10545 if (prog->obj->loaded) in bpf_program__set_attach_target()
10555 err = bpf_object__load_vmlinux_btf(prog->obj, true); in bpf_program__set_attach_target()
10558 err = find_kernel_btf_id(prog->obj, attach_func_name, in bpf_program__set_attach_target()
10559 prog->expected_attach_type, in bpf_program__set_attach_target()
10565 prog->attach_btf_id = btf_id; in bpf_program__set_attach_target()
10566 prog->attach_btf_obj_fd = btf_obj_fd; in bpf_program__set_attach_target()
10567 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
10722 struct bpf_program **prog = s->progs[i].prog; in bpf_object__open_skeleton() local
10725 *prog = bpf_object__find_program_by_name(obj, name); in bpf_object__open_skeleton()
10726 if (!*prog) { in bpf_object__open_skeleton()
10793 struct bpf_program *prog = *s->progs[i].prog; in bpf_object__attach_skeleton() local
10797 if (!prog->load) in bpf_object__attach_skeleton()
10800 sec_def = find_sec_def(prog->sec_name); in bpf_object__attach_skeleton()
10804 *link = sec_def->attach_fn(sec_def, prog); in bpf_object__attach_skeleton()
10808 bpf_program__name(prog), err); in bpf_object__attach_skeleton()