Lines Matching refs:prog
72 static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog);
678 void bpf_program__unload(struct bpf_program *prog) in bpf_program__unload() argument
680 if (!prog) in bpf_program__unload()
683 zclose(prog->fd); in bpf_program__unload()
685 zfree(&prog->func_info); in bpf_program__unload()
686 zfree(&prog->line_info); in bpf_program__unload()
689 static void bpf_program__exit(struct bpf_program *prog) in bpf_program__exit() argument
691 if (!prog) in bpf_program__exit()
694 bpf_program__unload(prog); in bpf_program__exit()
695 zfree(&prog->name); in bpf_program__exit()
696 zfree(&prog->sec_name); in bpf_program__exit()
697 zfree(&prog->insns); in bpf_program__exit()
698 zfree(&prog->reloc_desc); in bpf_program__exit()
700 prog->nr_reloc = 0; in bpf_program__exit()
701 prog->insns_cnt = 0; in bpf_program__exit()
702 prog->sec_idx = -1; in bpf_program__exit()
726 bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog, in bpf_object__init_prog() argument
736 memset(prog, 0, sizeof(*prog)); in bpf_object__init_prog()
737 prog->obj = obj; in bpf_object__init_prog()
739 prog->sec_idx = sec_idx; in bpf_object__init_prog()
740 prog->sec_insn_off = sec_off / BPF_INSN_SZ; in bpf_object__init_prog()
741 prog->sec_insn_cnt = insn_data_sz / BPF_INSN_SZ; in bpf_object__init_prog()
743 prog->insns_cnt = prog->sec_insn_cnt; in bpf_object__init_prog()
745 prog->type = BPF_PROG_TYPE_UNSPEC; in bpf_object__init_prog()
746 prog->fd = -1; in bpf_object__init_prog()
753 prog->autoload = false; in bpf_object__init_prog()
757 prog->autoload = true; in bpf_object__init_prog()
760 prog->autoattach = true; in bpf_object__init_prog()
763 prog->log_level = obj->log_level; in bpf_object__init_prog()
765 prog->sec_name = strdup(sec_name); in bpf_object__init_prog()
766 if (!prog->sec_name) in bpf_object__init_prog()
769 prog->name = strdup(name); in bpf_object__init_prog()
770 if (!prog->name) in bpf_object__init_prog()
773 prog->insns = malloc(insn_data_sz); in bpf_object__init_prog()
774 if (!prog->insns) in bpf_object__init_prog()
776 memcpy(prog->insns, insn_data, insn_data_sz); in bpf_object__init_prog()
781 bpf_program__exit(prog); in bpf_object__init_prog()
790 struct bpf_program *prog, *progs; in bpf_object__add_programs() local
847 prog = &progs[nr_progs]; in bpf_object__add_programs()
849 err = bpf_object__init_prog(obj, prog, name, sec_idx, sec_name, in bpf_object__add_programs()
862 prog->mark_btf_static = true; in bpf_object__add_programs()
1085 struct bpf_program *prog; in bpf_map__init_kern_struct_ops() local
1087 prog = st_ops->progs[i]; in bpf_map__init_kern_struct_ops()
1088 if (!prog) in bpf_map__init_kern_struct_ops()
1105 prog->attach_btf_id = kern_type_id; in bpf_map__init_kern_struct_ops()
1106 prog->expected_attach_type = kern_member_idx; in bpf_map__init_kern_struct_ops()
1111 map->name, mname, prog->name, moff, in bpf_map__init_kern_struct_ops()
2946 static bool prog_needs_vmlinux_btf(struct bpf_program *prog) in prog_needs_vmlinux_btf() argument
2948 if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || in prog_needs_vmlinux_btf()
2949 prog->type == BPF_PROG_TYPE_LSM) in prog_needs_vmlinux_btf()
2955 if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd) in prog_needs_vmlinux_btf()
2963 struct bpf_program *prog; in obj_needs_vmlinux_btf() local
2981 bpf_object__for_each_program(prog, obj) { in obj_needs_vmlinux_btf()
2982 if (!prog->autoload) in obj_needs_vmlinux_btf()
2984 if (prog_needs_vmlinux_btf(prog)) in obj_needs_vmlinux_btf()
3039 struct bpf_program *prog = &obj->programs[i]; in bpf_object__sanitize_and_load_btf() local
3044 if (!prog->mark_btf_static || !prog_is_subprog(obj, prog)) in bpf_object__sanitize_and_load_btf()
3054 if (strcmp(name, prog->name) != 0) in bpf_object__sanitize_and_load_btf()
3887 static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog) in prog_is_subprog() argument
3889 return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1; in prog_is_subprog()
3896 struct bpf_program *prog; in bpf_object__find_program_by_name() local
3898 bpf_object__for_each_program(prog, obj) { in bpf_object__find_program_by_name()
3899 if (prog_is_subprog(obj, prog)) in bpf_object__find_program_by_name()
3901 if (!strcmp(prog->name, name)) in bpf_object__find_program_by_name()
3902 return prog; in bpf_object__find_program_by_name()
3944 static int bpf_program__record_reloc(struct bpf_program *prog, in bpf_program__record_reloc() argument
3949 struct bpf_insn *insn = &prog->insns[insn_idx]; in bpf_program__record_reloc()
3950 size_t map_idx, nr_maps = prog->obj->nr_maps; in bpf_program__record_reloc()
3951 struct bpf_object *obj = prog->obj; in bpf_program__record_reloc()
3959 prog->name, sym_name, insn_idx, insn->code); in bpf_program__record_reloc()
3975 prog->name, sym_name, sym_idx); in bpf_program__record_reloc()
3979 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
3992 pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name); in bpf_program__record_reloc()
3999 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
4004 prog->name, sym_name, (size_t)sym->st_value); in bpf_program__record_reloc()
4015 prog->name, sym_name, shdr_idx); in bpf_program__record_reloc()
4026 prog->name, sym_name, (size_t)sym->st_value, insn->imm); in bpf_program__record_reloc()
4043 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
4053 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
4059 prog->name, sym_sec_name, (size_t)sym->st_value); in bpf_program__record_reloc()
4072 prog->name, sym_sec_name); in bpf_program__record_reloc()
4080 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
4086 prog->name, sym_sec_name); in bpf_program__record_reloc()
4097 static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) in prog_contains_insn() argument
4099 return insn_idx >= prog->sec_insn_off && in prog_contains_insn()
4100 insn_idx < prog->sec_insn_off + prog->sec_insn_cnt; in prog_contains_insn()
4107 struct bpf_program *prog; in find_prog_by_sec_insn() local
4111 prog = &obj->programs[m]; in find_prog_by_sec_insn()
4113 if (prog->sec_idx < sec_idx || in find_prog_by_sec_insn()
4114 (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx)) in find_prog_by_sec_insn()
4122 prog = &obj->programs[l]; in find_prog_by_sec_insn()
4123 if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx)) in find_prog_by_sec_insn()
4124 return prog; in find_prog_by_sec_insn()
4133 struct bpf_program *prog; in bpf_object__collect_prog_relos() local
4201 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__collect_prog_relos()
4202 if (!prog) { in bpf_object__collect_prog_relos()
4208 relos = libbpf_reallocarray(prog->reloc_desc, in bpf_object__collect_prog_relos()
4209 prog->nr_reloc + 1, sizeof(*relos)); in bpf_object__collect_prog_relos()
4212 prog->reloc_desc = relos; in bpf_object__collect_prog_relos()
4215 insn_idx -= prog->sec_insn_off; in bpf_object__collect_prog_relos()
4216 err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc], in bpf_object__collect_prog_relos()
4221 prog->nr_reloc++; in bpf_object__collect_prog_relos()
4649 int ret, map, prog, insn_cnt = ARRAY_SIZE(insns); in probe_prog_bind_map() local
4660 prog = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL); in probe_prog_bind_map()
4661 if (prog < 0) { in probe_prog_bind_map()
4666 ret = bpf_prog_bind_map(prog, map, NULL); in probe_prog_bind_map()
4669 close(prog); in probe_prog_bind_map()
5559 static int record_relo_core(struct bpf_program *prog, in record_relo_core() argument
5564 relos = libbpf_reallocarray(prog->reloc_desc, in record_relo_core()
5565 prog->nr_reloc + 1, sizeof(*relos)); in record_relo_core()
5568 relo = &relos[prog->nr_reloc]; in record_relo_core()
5572 prog->reloc_desc = relos; in record_relo_core()
5573 prog->nr_reloc++; in record_relo_core()
5577 static const struct bpf_core_relo *find_relo_core(struct bpf_program *prog, int insn_idx) in find_relo_core() argument
5582 for (i = 0; i < prog->nr_reloc; i++) { in find_relo_core()
5583 relo = &prog->reloc_desc[i]; in find_relo_core()
5593 static int bpf_core_resolve_relo(struct bpf_program *prog, in bpf_core_resolve_relo() argument
5603 const char *prog_name = prog->name; in bpf_core_resolve_relo()
5619 cands = bpf_core_find_cands(prog->obj, local_btf, local_id); in bpf_core_resolve_relo()
5646 struct bpf_program *prog; in bpf_object__relocate_core() local
5687 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__relocate_core()
5688 if (!prog) { in bpf_object__relocate_core()
5704 if (!prog->autoload) in bpf_object__relocate_core()
5711 insn_idx = insn_idx - prog->sec_insn_off; in bpf_object__relocate_core()
5712 if (insn_idx >= prog->insns_cnt) in bpf_object__relocate_core()
5714 insn = &prog->insns[insn_idx]; in bpf_object__relocate_core()
5716 err = record_relo_core(prog, rec, insn_idx); in bpf_object__relocate_core()
5719 prog->name, i, err); in bpf_object__relocate_core()
5723 if (prog->obj->gen_loader) in bpf_object__relocate_core()
5726 err = bpf_core_resolve_relo(prog, rec, i, obj->btf, cand_cache, &targ_res); in bpf_object__relocate_core()
5729 prog->name, i, err); in bpf_object__relocate_core()
5733 err = bpf_core_patch_insn(prog->name, insn, insn_idx, rec, i, &targ_res); in bpf_object__relocate_core()
5736 prog->name, i, insn_idx, err); in bpf_object__relocate_core()
5760 static void poison_map_ldimm64(struct bpf_program *prog, int relo_idx, in poison_map_ldimm64() argument
5767 prog->name, relo_idx, insn_idx, map_idx, map->name); in poison_map_ldimm64()
5792 bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_data() argument
5796 for (i = 0; i < prog->nr_reloc; i++) { in bpf_object__relocate_data()
5797 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_object__relocate_data()
5798 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate_data()
5812 poison_map_ldimm64(prog, i, relo->insn_idx, insn, in bpf_object__relocate_data()
5826 poison_map_ldimm64(prog, i, relo->insn_idx, insn, in bpf_object__relocate_data()
5866 prog->name, i); in bpf_object__relocate_data()
5879 prog->name, i, relo->type); in bpf_object__relocate_data()
5888 const struct bpf_program *prog, in adjust_prog_btf_ext_info() argument
5903 if (prog->sec_idx != sec_idx) in adjust_prog_btf_ext_info()
5909 if (insn_off < prog->sec_insn_off) in adjust_prog_btf_ext_info()
5911 if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt) in adjust_prog_btf_ext_info()
5940 off_adj = prog->sub_insn_off - prog->sec_insn_off; in adjust_prog_btf_ext_info()
5958 const struct bpf_program *prog) in reloc_prog_func_and_line_info() argument
5971 if (main_prog != prog && !main_prog->func_info) in reloc_prog_func_and_line_info()
5974 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info, in reloc_prog_func_and_line_info()
5981 prog->name, err); in reloc_prog_func_and_line_info()
5989 pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name); in reloc_prog_func_and_line_info()
5994 prog->name); in reloc_prog_func_and_line_info()
5999 if (main_prog != prog && !main_prog->line_info) in reloc_prog_func_and_line_info()
6002 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info, in reloc_prog_func_and_line_info()
6009 prog->name, err); in reloc_prog_func_and_line_info()
6017 pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name); in reloc_prog_func_and_line_info()
6022 prog->name); in reloc_prog_func_and_line_info()
6037 static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) in find_prog_insn_relo() argument
6039 if (!prog->nr_reloc) in find_prog_insn_relo()
6041 return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc, in find_prog_insn_relo()
6042 sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx); in find_prog_insn_relo()
6072 struct bpf_program *prog) in bpf_object__reloc_code() argument
6080 err = reloc_prog_func_and_line_info(obj, main_prog, prog); in bpf_object__reloc_code()
6084 for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) { in bpf_object__reloc_code()
6085 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
6089 relo = find_prog_insn_relo(prog, insn_idx); in bpf_object__reloc_code()
6097 prog->name, insn_idx, relo->type); in bpf_object__reloc_code()
6121 prog->name, insn_idx); in bpf_object__reloc_code()
6130 sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1; in bpf_object__reloc_code()
6137 prog->name); in bpf_object__reloc_code()
6181 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
6187 insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1; in bpf_object__reloc_code()
6190 prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off); in bpf_object__reloc_code()
6278 bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_calls() argument
6294 err = bpf_object__reloc_code(obj, prog, prog); in bpf_object__relocate_calls()
6304 struct bpf_program *prog; in bpf_object__free_relocs() local
6309 prog = &obj->programs[i]; in bpf_object__free_relocs()
6310 zfree(&prog->reloc_desc); in bpf_object__free_relocs()
6311 prog->nr_reloc = 0; in bpf_object__free_relocs()
6347 struct bpf_program *prog; in bpf_object__relocate() local
6369 prog = &obj->programs[i]; in bpf_object__relocate()
6370 for (j = 0; j < prog->nr_reloc; j++) { in bpf_object__relocate()
6371 struct reloc_desc *relo = &prog->reloc_desc[j]; in bpf_object__relocate()
6372 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate()
6388 prog = &obj->programs[i]; in bpf_object__relocate()
6392 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
6394 if (!prog->autoload) in bpf_object__relocate()
6397 err = bpf_object__relocate_calls(obj, prog); in bpf_object__relocate()
6400 prog->name, err); in bpf_object__relocate()
6406 prog = &obj->programs[i]; in bpf_object__relocate()
6407 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
6409 if (!prog->autoload) in bpf_object__relocate()
6411 err = bpf_object__relocate_data(obj, prog); in bpf_object__relocate()
6414 prog->name, err); in bpf_object__relocate()
6611 static int bpf_object__sanitize_prog(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__sanitize_prog() argument
6613 struct bpf_insn *insn = prog->insns; in bpf_object__sanitize_prog()
6620 for (i = 0; i < prog->insns_cnt; i++, insn++) { in bpf_object__sanitize_prog()
6646 static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name,
6650 static int libbpf_prepare_prog_load(struct bpf_program *prog, in libbpf_prepare_prog_load() argument
6656 if ((def & SEC_EXP_ATTACH_OPT) && !kernel_supports(prog->obj, FEAT_EXP_ATTACH_TYPE)) in libbpf_prepare_prog_load()
6662 if (prog->type == BPF_PROG_TYPE_XDP && (def & SEC_XDP_FRAGS)) in libbpf_prepare_prog_load()
6665 if ((def & SEC_ATTACH_BTF) && !prog->attach_btf_id) { in libbpf_prepare_prog_load()
6669 attach_name = strchr(prog->sec_name, '/'); in libbpf_prepare_prog_load()
6681 prog->name); in libbpf_prepare_prog_load()
6686 err = libbpf_find_attach_btf_id(prog, attach_name, &btf_obj_fd, &btf_type_id); in libbpf_prepare_prog_load()
6691 prog->attach_btf_obj_fd = btf_obj_fd; in libbpf_prepare_prog_load()
6692 prog->attach_btf_id = btf_type_id; in libbpf_prepare_prog_load()
6705 static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz);
6707 static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog, in bpf_object_load_prog() argument
6718 __u32 log_level = prog->log_level; in bpf_object_load_prog()
6720 if (prog->type == BPF_PROG_TYPE_UNSPEC) { in bpf_object_load_prog()
6726 prog->name, prog->sec_name); in bpf_object_load_prog()
6733 load_attr.expected_attach_type = prog->expected_attach_type; in bpf_object_load_prog()
6735 prog_name = prog->name; in bpf_object_load_prog()
6736 load_attr.attach_prog_fd = prog->attach_prog_fd; in bpf_object_load_prog()
6737 load_attr.attach_btf_obj_fd = prog->attach_btf_obj_fd; in bpf_object_load_prog()
6738 load_attr.attach_btf_id = prog->attach_btf_id; in bpf_object_load_prog()
6740 load_attr.prog_ifindex = prog->prog_ifindex; in bpf_object_load_prog()
6746 load_attr.func_info = prog->func_info; in bpf_object_load_prog()
6747 load_attr.func_info_rec_size = prog->func_info_rec_size; in bpf_object_load_prog()
6748 load_attr.func_info_cnt = prog->func_info_cnt; in bpf_object_load_prog()
6749 load_attr.line_info = prog->line_info; in bpf_object_load_prog()
6750 load_attr.line_info_rec_size = prog->line_info_rec_size; in bpf_object_load_prog()
6751 load_attr.line_info_cnt = prog->line_info_cnt; in bpf_object_load_prog()
6754 load_attr.prog_flags = prog->prog_flags; in bpf_object_load_prog()
6758 if (prog->sec_def && prog->sec_def->prog_prepare_load_fn) { in bpf_object_load_prog()
6759 err = prog->sec_def->prog_prepare_load_fn(prog, &load_attr, prog->sec_def->cookie); in bpf_object_load_prog()
6762 prog->name, err); in bpf_object_load_prog()
6765 insns = prog->insns; in bpf_object_load_prog()
6766 insns_cnt = prog->insns_cnt; in bpf_object_load_prog()
6770 bpf_gen__prog_load(obj->gen_loader, prog->type, prog->name, in bpf_object_load_prog()
6772 prog - obj->programs); in bpf_object_load_prog()
6784 if (prog->log_buf) { in bpf_object_load_prog()
6785 log_buf = prog->log_buf; in bpf_object_load_prog()
6786 log_buf_size = prog->log_size; in bpf_object_load_prog()
6809 ret = bpf_prog_load(prog->type, prog_name, license, insns, insns_cnt, &load_attr); in bpf_object_load_prog()
6813 prog->name, log_buf); in bpf_object_load_prog()
6821 map = &prog->obj->maps[i]; in bpf_object_load_prog()
6828 prog->name, map->real_name, cp); in bpf_object_load_prog()
6856 fixup_verifier_log(prog, log_buf, log_buf_size); in bpf_object_load_prog()
6859 pr_warn("prog '%s': BPF program load failed: %s\n", prog->name, cp); in bpf_object_load_prog()
6864 prog->name, log_buf); in bpf_object_load_prog()
6924 static void fixup_log_failed_core_relo(struct bpf_program *prog, in fixup_log_failed_core_relo() argument
6946 relo = find_relo_core(prog, insn_idx); in fixup_log_failed_core_relo()
6950 err = bpf_core_parse_spec(prog->name, prog->obj->btf, relo, &spec); in fixup_log_failed_core_relo()
6963 static void fixup_log_missing_map_load(struct bpf_program *prog, in fixup_log_missing_map_load() argument
6975 struct bpf_object *obj = prog->obj; in fixup_log_missing_map_load()
6996 static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz) in fixup_verifier_log() argument
7021 fixup_log_failed_core_relo(prog, buf, buf_sz, log_sz, in fixup_verifier_log()
7029 fixup_log_missing_map_load(prog, buf, buf_sz, log_sz, in fixup_verifier_log()
7036 static int bpf_program_record_relos(struct bpf_program *prog) in bpf_program_record_relos() argument
7038 struct bpf_object *obj = prog->obj; in bpf_program_record_relos()
7041 for (i = 0; i < prog->nr_reloc; i++) { in bpf_program_record_relos()
7042 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_program_record_relos()
7079 struct bpf_program *prog; in bpf_object__load_progs() local
7084 prog = &obj->programs[i]; in bpf_object__load_progs()
7085 err = bpf_object__sanitize_prog(obj, prog); in bpf_object__load_progs()
7091 prog = &obj->programs[i]; in bpf_object__load_progs()
7092 if (prog_is_subprog(obj, prog)) in bpf_object__load_progs()
7094 if (!prog->autoload) { in bpf_object__load_progs()
7095 pr_debug("prog '%s': skipped loading\n", prog->name); in bpf_object__load_progs()
7098 prog->log_level |= log_level; in bpf_object__load_progs()
7101 bpf_program_record_relos(prog); in bpf_object__load_progs()
7103 err = bpf_object_load_prog(obj, prog, prog->insns, prog->insns_cnt, in bpf_object__load_progs()
7104 obj->license, obj->kern_version, &prog->fd); in bpf_object__load_progs()
7106 pr_warn("prog '%s': failed to load: %d\n", prog->name, err); in bpf_object__load_progs()
7119 struct bpf_program *prog; in bpf_object_init_progs() local
7122 bpf_object__for_each_program(prog, obj) { in bpf_object_init_progs()
7123 prog->sec_def = find_sec_def(prog->sec_name); in bpf_object_init_progs()
7124 if (!prog->sec_def) { in bpf_object_init_progs()
7127 prog->name, prog->sec_name); in bpf_object_init_progs()
7131 prog->type = prog->sec_def->prog_type; in bpf_object_init_progs()
7132 prog->expected_attach_type = prog->sec_def->expected_attach_type; in bpf_object_init_progs()
7137 if (prog->sec_def->prog_setup_fn) { in bpf_object_init_progs()
7138 err = prog->sec_def->prog_setup_fn(prog, prog->sec_def->cookie); in bpf_object_init_progs()
7141 prog->name, err); in bpf_object_init_progs()
7776 int bpf_program__pin(struct bpf_program *prog, const char *path) in bpf_program__pin() argument
7781 if (prog->fd < 0) { in bpf_program__pin()
7782 pr_warn("prog '%s': can't pin program that wasn't loaded\n", prog->name); in bpf_program__pin()
7794 if (bpf_obj_pin(prog->fd, path)) { in bpf_program__pin()
7797 pr_warn("prog '%s': failed to pin at '%s': %s\n", prog->name, path, cp); in bpf_program__pin()
7801 pr_debug("prog '%s': pinned at '%s'\n", prog->name, path); in bpf_program__pin()
7805 int bpf_program__unpin(struct bpf_program *prog, const char *path) in bpf_program__unpin() argument
7809 if (prog->fd < 0) { in bpf_program__unpin()
7810 pr_warn("prog '%s': can't unpin program that wasn't loaded\n", prog->name); in bpf_program__unpin()
7822 pr_debug("prog '%s': unpinned from '%s'\n", prog->name, path); in bpf_program__unpin()
8041 struct bpf_program *prog; in bpf_object__pin_programs() local
8053 bpf_object__for_each_program(prog, obj) { in bpf_object__pin_programs()
8054 err = pathname_concat(buf, sizeof(buf), path, prog->name); in bpf_object__pin_programs()
8058 err = bpf_program__pin(prog, buf); in bpf_object__pin_programs()
8066 while ((prog = bpf_object__prev_program(obj, prog))) { in bpf_object__pin_programs()
8067 if (pathname_concat(buf, sizeof(buf), path, prog->name)) in bpf_object__pin_programs()
8070 bpf_program__unpin(prog, buf); in bpf_object__pin_programs()
8078 struct bpf_program *prog; in bpf_object__unpin_programs() local
8084 bpf_object__for_each_program(prog, obj) { in bpf_object__unpin_programs()
8087 err = pathname_concat(buf, sizeof(buf), path, prog->name); in bpf_object__unpin_programs()
8091 err = bpf_program__unpin(prog, buf); in bpf_object__unpin_programs()
8257 struct bpf_program *prog = prev; in bpf_object__next_program() local
8260 prog = __bpf_program__iter(prog, obj, true); in bpf_object__next_program()
8261 } while (prog && prog_is_subprog(obj, prog)); in bpf_object__next_program()
8263 return prog; in bpf_object__next_program()
8269 struct bpf_program *prog = next; in bpf_object__prev_program() local
8272 prog = __bpf_program__iter(prog, obj, false); in bpf_object__prev_program()
8273 } while (prog && prog_is_subprog(obj, prog)); in bpf_object__prev_program()
8275 return prog; in bpf_object__prev_program()
8278 void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) in bpf_program__set_ifindex() argument
8280 prog->prog_ifindex = ifindex; in bpf_program__set_ifindex()
8283 const char *bpf_program__name(const struct bpf_program *prog) in bpf_program__name() argument
8285 return prog->name; in bpf_program__name()
8288 const char *bpf_program__section_name(const struct bpf_program *prog) in bpf_program__section_name() argument
8290 return prog->sec_name; in bpf_program__section_name()
8293 bool bpf_program__autoload(const struct bpf_program *prog) in bpf_program__autoload() argument
8295 return prog->autoload; in bpf_program__autoload()
8298 int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) in bpf_program__set_autoload() argument
8300 if (prog->obj->loaded) in bpf_program__set_autoload()
8303 prog->autoload = autoload; in bpf_program__set_autoload()
8307 bool bpf_program__autoattach(const struct bpf_program *prog) in bpf_program__autoattach() argument
8309 return prog->autoattach; in bpf_program__autoattach()
8312 void bpf_program__set_autoattach(struct bpf_program *prog, bool autoattach) in bpf_program__set_autoattach() argument
8314 prog->autoattach = autoattach; in bpf_program__set_autoattach()
8317 const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog) in bpf_program__insns() argument
8319 return prog->insns; in bpf_program__insns()
8322 size_t bpf_program__insn_cnt(const struct bpf_program *prog) in bpf_program__insn_cnt() argument
8324 return prog->insns_cnt; in bpf_program__insn_cnt()
8327 int bpf_program__set_insns(struct bpf_program *prog, in bpf_program__set_insns() argument
8332 if (prog->obj->loaded) in bpf_program__set_insns()
8335 insns = libbpf_reallocarray(prog->insns, new_insn_cnt, sizeof(*insns)); in bpf_program__set_insns()
8337 pr_warn("prog '%s': failed to realloc prog code\n", prog->name); in bpf_program__set_insns()
8342 prog->insns = insns; in bpf_program__set_insns()
8343 prog->insns_cnt = new_insn_cnt; in bpf_program__set_insns()
8347 int bpf_program__fd(const struct bpf_program *prog) in bpf_program__fd() argument
8349 if (!prog) in bpf_program__fd()
8352 if (prog->fd < 0) in bpf_program__fd()
8355 return prog->fd; in bpf_program__fd()
8359 enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog);
8361 enum bpf_prog_type bpf_program__type(const struct bpf_program *prog) in bpf_program__type() argument
8363 return prog->type; in bpf_program__type()
8366 int bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) in bpf_program__set_type() argument
8368 if (prog->obj->loaded) in bpf_program__set_type()
8371 prog->type = type; in bpf_program__set_type()
8376 enum bpf_attach_type bpf_program__get_expected_attach_type(const struct bpf_program *prog);
8378 enum bpf_attach_type bpf_program__expected_attach_type(const struct bpf_program *prog) in bpf_program__expected_attach_type() argument
8380 return prog->expected_attach_type; in bpf_program__expected_attach_type()
8383 int bpf_program__set_expected_attach_type(struct bpf_program *prog, in bpf_program__set_expected_attach_type() argument
8386 if (prog->obj->loaded) in bpf_program__set_expected_attach_type()
8389 prog->expected_attach_type = type; in bpf_program__set_expected_attach_type()
8393 __u32 bpf_program__flags(const struct bpf_program *prog) in bpf_program__flags() argument
8395 return prog->prog_flags; in bpf_program__flags()
8398 int bpf_program__set_flags(struct bpf_program *prog, __u32 flags) in bpf_program__set_flags() argument
8400 if (prog->obj->loaded) in bpf_program__set_flags()
8403 prog->prog_flags = flags; in bpf_program__set_flags()
8407 __u32 bpf_program__log_level(const struct bpf_program *prog) in bpf_program__log_level() argument
8409 return prog->log_level; in bpf_program__log_level()
8412 int bpf_program__set_log_level(struct bpf_program *prog, __u32 log_level) in bpf_program__set_log_level() argument
8414 if (prog->obj->loaded) in bpf_program__set_log_level()
8417 prog->log_level = log_level; in bpf_program__set_log_level()
8421 const char *bpf_program__log_buf(const struct bpf_program *prog, size_t *log_size) in bpf_program__log_buf() argument
8423 *log_size = prog->log_size; in bpf_program__log_buf()
8424 return prog->log_buf; in bpf_program__log_buf()
8427 int bpf_program__set_log_buf(struct bpf_program *prog, char *log_buf, size_t log_size) in bpf_program__set_log_buf() argument
8431 if (prog->log_size > UINT_MAX) in bpf_program__set_log_buf()
8433 if (prog->obj->loaded) in bpf_program__set_log_buf()
8436 prog->log_buf = log_buf; in bpf_program__set_log_buf()
8437 prog->log_size = log_size; in bpf_program__set_log_buf()
8450 static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8451 static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8452 static int attach_ksyscall(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8453 static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8454 static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8455 static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8456 static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8457 static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8458 static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8459 static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8807 struct bpf_program *prog; in bpf_object__collect_st_ops_relos() local
8879 prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx); in bpf_object__collect_st_ops_relos()
8880 if (!prog) { in bpf_object__collect_st_ops_relos()
8887 if (prog->type != BPF_PROG_TYPE_STRUCT_OPS) { in bpf_object__collect_st_ops_relos()
8889 map->name, prog->name); in bpf_object__collect_st_ops_relos()
8896 if (!prog->attach_btf_id) { in bpf_object__collect_st_ops_relos()
8897 prog->attach_btf_id = st_ops->type_id; in bpf_object__collect_st_ops_relos()
8898 prog->expected_attach_type = member_idx; in bpf_object__collect_st_ops_relos()
8905 if (prog->attach_btf_id != st_ops->type_id || in bpf_object__collect_st_ops_relos()
8906 prog->expected_attach_type != member_idx) { in bpf_object__collect_st_ops_relos()
8908 map->name, prog->name, prog->sec_name, prog->type, in bpf_object__collect_st_ops_relos()
8909 prog->attach_btf_id, prog->expected_attach_type, name); in bpf_object__collect_st_ops_relos()
8913 st_ops->progs[member_idx] = prog; in bpf_object__collect_st_ops_relos()
9068 static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name, in libbpf_find_attach_btf_id() argument
9071 enum bpf_attach_type attach_type = prog->expected_attach_type; in libbpf_find_attach_btf_id()
9072 __u32 attach_prog_fd = prog->attach_prog_fd; in libbpf_find_attach_btf_id()
9076 if (prog->type == BPF_PROG_TYPE_EXT || attach_prog_fd) { in libbpf_find_attach_btf_id()
9078 pr_warn("prog '%s': attach program FD is not set\n", prog->name); in libbpf_find_attach_btf_id()
9084 prog->name, attach_prog_fd, attach_name, err); in libbpf_find_attach_btf_id()
9093 if (prog->obj->gen_loader) { in libbpf_find_attach_btf_id()
9094 bpf_gen__record_attach_target(prog->obj->gen_loader, attach_name, attach_type); in libbpf_find_attach_btf_id()
9098 err = find_kernel_btf_id(prog->obj, attach_name, attach_type, btf_obj_fd, btf_type_id); in libbpf_find_attach_btf_id()
9102 prog->name, attach_name, err); in libbpf_find_attach_btf_id()
9511 int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog) in bpf_link__update_program() argument
9515 ret = bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL); in bpf_link__update_program()
9691 struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd, in bpf_program__attach_perf_event_opts() argument
9703 prog->name, pfd); in bpf_program__attach_perf_event_opts()
9706 prog_fd = bpf_program__fd(prog); in bpf_program__attach_perf_event_opts()
9709 prog->name); in bpf_program__attach_perf_event_opts()
9720 if (kernel_supports(prog->obj, FEAT_PERF_LINK)) { in bpf_program__attach_perf_event_opts()
9728 prog->name, pfd, in bpf_program__attach_perf_event_opts()
9735 pr_warn("prog '%s': user context value is not supported\n", prog->name); in bpf_program__attach_perf_event_opts()
9743 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
9746 prog->name, pfd); in bpf_program__attach_perf_event_opts()
9754 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
9766 struct bpf_link *bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd) in bpf_program__attach_perf_event() argument
9768 return bpf_program__attach_perf_event_opts(prog, pfd, NULL); in bpf_program__attach_perf_event()
10067 bpf_program__attach_kprobe_opts(const struct bpf_program *prog, in bpf_program__attach_kprobe_opts() argument
10107 prog->name, retprobe ? "kretprobe" : "kprobe", in bpf_program__attach_kprobe_opts()
10112 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_kprobe_opts()
10117 prog->name, retprobe ? "kretprobe" : "kprobe", in bpf_program__attach_kprobe_opts()
10140 struct bpf_link *bpf_program__attach_kprobe(const struct bpf_program *prog, in bpf_program__attach_kprobe() argument
10148 return bpf_program__attach_kprobe_opts(prog, func_name, &opts); in bpf_program__attach_kprobe()
10151 struct bpf_link *bpf_program__attach_ksyscall(const struct bpf_program *prog, in bpf_program__attach_ksyscall() argument
10161 if (kernel_supports(prog->obj, FEAT_SYSCALL_WRAPPER)) { in bpf_program__attach_ksyscall()
10176 return bpf_program__attach_kprobe_opts(prog, func_name, &kprobe_opts); in bpf_program__attach_ksyscall()
10233 bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, in bpf_program__attach_kprobe_multi_opts() argument
10294 prog_fd = bpf_program__fd(prog); in bpf_program__attach_kprobe_multi_opts()
10299 prog->name, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_kprobe_multi_opts()
10312 static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_kprobe() argument
10323 if (strcmp(prog->sec_name, "kprobe") == 0 || strcmp(prog->sec_name, "kretprobe") == 0) in attach_kprobe()
10326 opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe/"); in attach_kprobe()
10328 func_name = prog->sec_name + sizeof("kretprobe/") - 1; in attach_kprobe()
10330 func_name = prog->sec_name + sizeof("kprobe/") - 1; in attach_kprobe()
10344 *link = bpf_program__attach_kprobe_opts(prog, func, &opts); in attach_kprobe()
10349 static int attach_ksyscall(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_ksyscall() argument
10357 if (strcmp(prog->sec_name, "ksyscall") == 0 || strcmp(prog->sec_name, "kretsyscall") == 0) in attach_ksyscall()
10360 opts.retprobe = str_has_pfx(prog->sec_name, "kretsyscall/"); in attach_ksyscall()
10362 syscall_name = prog->sec_name + sizeof("kretsyscall/") - 1; in attach_ksyscall()
10364 syscall_name = prog->sec_name + sizeof("ksyscall/") - 1; in attach_ksyscall()
10366 *link = bpf_program__attach_ksyscall(prog, syscall_name, &opts); in attach_ksyscall()
10370 static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_kprobe_multi() argument
10380 if (strcmp(prog->sec_name, "kprobe.multi") == 0 || in attach_kprobe_multi()
10381 strcmp(prog->sec_name, "kretprobe.multi") == 0) in attach_kprobe_multi()
10384 opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe.multi/"); in attach_kprobe_multi()
10386 spec = prog->sec_name + sizeof("kretprobe.multi/") - 1; in attach_kprobe_multi()
10388 spec = prog->sec_name + sizeof("kprobe.multi/") - 1; in attach_kprobe_multi()
10396 *link = bpf_program__attach_kprobe_multi_opts(prog, pattern, &opts); in attach_kprobe_multi()
10734 bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, in bpf_program__attach_uprobe_opts() argument
10762 prog->name, binary_path, err); in bpf_program__attach_uprobe_opts()
10800 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
10806 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_uprobe_opts()
10811 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
10843 static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_uprobe() argument
10852 n = sscanf(prog->sec_name, "%m[^/]/%m[^:]:%m[a-zA-Z0-9_.]+%li", in attach_uprobe()
10861 prog->name, prog->sec_name); in attach_uprobe()
10869 prog->name); in attach_uprobe()
10873 *link = bpf_program__attach_uprobe_opts(prog, -1, binary_path, offset, &opts); in attach_uprobe()
10877 pr_warn("prog '%s': invalid format of section definition '%s'\n", prog->name, in attach_uprobe()
10878 prog->sec_name); in attach_uprobe()
10888 struct bpf_link *bpf_program__attach_uprobe(const struct bpf_program *prog, in bpf_program__attach_uprobe() argument
10895 return bpf_program__attach_uprobe_opts(prog, pid, binary_path, func_offset, &opts); in bpf_program__attach_uprobe()
10898 struct bpf_link *bpf_program__attach_usdt(const struct bpf_program *prog, in bpf_program__attach_usdt() argument
10904 struct bpf_object *obj = prog->obj; in bpf_program__attach_usdt()
10912 if (bpf_program__fd(prog) < 0) { in bpf_program__attach_usdt()
10914 prog->name); in bpf_program__attach_usdt()
10925 prog->name, binary_path, err); in bpf_program__attach_usdt()
10943 link = usdt_manager_attach_usdt(obj->usdt_man, prog, pid, binary_path, in bpf_program__attach_usdt()
10951 static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_usdt() argument
10957 sec_name = bpf_program__section_name(prog); in attach_usdt()
10970 *link = bpf_program__attach_usdt(prog, -1 /* any process */, path, in attach_usdt()
11031 struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, in bpf_program__attach_tracepoint_opts() argument
11049 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
11053 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_tracepoint_opts()
11058 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
11065 struct bpf_link *bpf_program__attach_tracepoint(const struct bpf_program *prog, in bpf_program__attach_tracepoint() argument
11069 return bpf_program__attach_tracepoint_opts(prog, tp_category, tp_name, NULL); in bpf_program__attach_tracepoint()
11072 static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_tp() argument
11079 if (strcmp(prog->sec_name, "tp") == 0 || strcmp(prog->sec_name, "tracepoint") == 0) in attach_tp()
11082 sec_name = strdup(prog->sec_name); in attach_tp()
11087 if (str_has_pfx(prog->sec_name, "tp/")) in attach_tp()
11099 *link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name); in attach_tp()
11104 struct bpf_link *bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, in bpf_program__attach_raw_tracepoint() argument
11111 prog_fd = bpf_program__fd(prog); in bpf_program__attach_raw_tracepoint()
11113 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_raw_tracepoint()
11127 prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_raw_tracepoint()
11134 static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_raw_tp() argument
11150 if (!str_has_pfx(prog->sec_name, prefixes[i])) in attach_raw_tp()
11155 if (prog->sec_name[pfx_len] == '\0') in attach_raw_tp()
11158 if (prog->sec_name[pfx_len] != '/') in attach_raw_tp()
11161 tp_name = prog->sec_name + pfx_len + 1; in attach_raw_tp()
11167 prog->name, prog->sec_name); in attach_raw_tp()
11171 *link = bpf_program__attach_raw_tracepoint(prog, tp_name); in attach_raw_tp()
11176 static struct bpf_link *bpf_program__attach_btf_id(const struct bpf_program *prog, in bpf_program__attach_btf_id() argument
11187 prog_fd = bpf_program__fd(prog); in bpf_program__attach_btf_id()
11189 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_btf_id()
11200 pfd = bpf_link_create(prog_fd, 0, bpf_program__expected_attach_type(prog), &link_opts); in bpf_program__attach_btf_id()
11205 prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_btf_id()
11212 struct bpf_link *bpf_program__attach_trace(const struct bpf_program *prog) in bpf_program__attach_trace() argument
11214 return bpf_program__attach_btf_id(prog, NULL); in bpf_program__attach_trace()
11217 struct bpf_link *bpf_program__attach_trace_opts(const struct bpf_program *prog, in bpf_program__attach_trace_opts() argument
11220 return bpf_program__attach_btf_id(prog, opts); in bpf_program__attach_trace_opts()
11223 struct bpf_link *bpf_program__attach_lsm(const struct bpf_program *prog) in bpf_program__attach_lsm() argument
11225 return bpf_program__attach_btf_id(prog, NULL); in bpf_program__attach_lsm()
11228 static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_trace() argument
11230 *link = bpf_program__attach_trace(prog); in attach_trace()
11234 static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_lsm() argument
11236 *link = bpf_program__attach_lsm(prog); in attach_lsm()
11241 bpf_program__attach_fd(const struct bpf_program *prog, int target_fd, int btf_id, in bpf_program__attach_fd() argument
11251 prog_fd = bpf_program__fd(prog); in bpf_program__attach_fd()
11253 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_fd()
11262 attach_type = bpf_program__expected_attach_type(prog); in bpf_program__attach_fd()
11268 prog->name, target_name, in bpf_program__attach_fd()
11277 bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd) in bpf_program__attach_cgroup() argument
11279 return bpf_program__attach_fd(prog, cgroup_fd, 0, "cgroup"); in bpf_program__attach_cgroup()
11283 bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd) in bpf_program__attach_netns() argument
11285 return bpf_program__attach_fd(prog, netns_fd, 0, "netns"); in bpf_program__attach_netns()
11288 struct bpf_link *bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex) in bpf_program__attach_xdp() argument
11291 return bpf_program__attach_fd(prog, ifindex, 0, "xdp"); in bpf_program__attach_xdp()
11294 struct bpf_link *bpf_program__attach_freplace(const struct bpf_program *prog, in bpf_program__attach_freplace() argument
11302 prog->name); in bpf_program__attach_freplace()
11306 if (prog->type != BPF_PROG_TYPE_EXT) { in bpf_program__attach_freplace()
11308 prog->name); in bpf_program__attach_freplace()
11317 return bpf_program__attach_fd(prog, target_fd, btf_id, "freplace"); in bpf_program__attach_freplace()
11322 return bpf_program__attach_trace(prog); in bpf_program__attach_freplace()
11327 bpf_program__attach_iter(const struct bpf_program *prog, in bpf_program__attach_iter() argument
11342 prog_fd = bpf_program__fd(prog); in bpf_program__attach_iter()
11344 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_iter()
11359 prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); in bpf_program__attach_iter()
11366 static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_iter() argument
11368 *link = bpf_program__attach_iter(prog, NULL); in attach_iter()
11372 struct bpf_link *bpf_program__attach(const struct bpf_program *prog) in bpf_program__attach() argument
11377 if (!prog->sec_def || !prog->sec_def->prog_attach_fn) in bpf_program__attach()
11380 err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, &link); in bpf_program__attach()
11421 struct bpf_program *prog = st_ops->progs[i]; in bpf_map__attach_struct_ops() local
11425 if (!prog) in bpf_map__attach_struct_ops()
11428 prog_fd = bpf_program__fd(prog); in bpf_map__attach_struct_ops()
11999 int bpf_program__set_attach_target(struct bpf_program *prog, in bpf_program__set_attach_target() argument
12005 if (!prog || attach_prog_fd < 0) in bpf_program__set_attach_target()
12008 if (prog->obj->loaded) in bpf_program__set_attach_target()
12015 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
12029 err = bpf_object__load_vmlinux_btf(prog->obj, true); in bpf_program__set_attach_target()
12032 err = find_kernel_btf_id(prog->obj, attach_func_name, in bpf_program__set_attach_target()
12033 prog->expected_attach_type, in bpf_program__set_attach_target()
12039 prog->attach_btf_id = btf_id; in bpf_program__set_attach_target()
12040 prog->attach_btf_obj_fd = btf_obj_fd; in bpf_program__set_attach_target()
12041 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
12179 struct bpf_program **prog = progs[i].prog; in populate_skeleton_progs() local
12182 *prog = bpf_object__find_program_by_name(obj, name); in populate_skeleton_progs()
12183 if (!*prog) { in populate_skeleton_progs()
12364 struct bpf_program *prog = *s->progs[i].prog; in bpf_object__attach_skeleton() local
12367 if (!prog->autoload || !prog->autoattach) in bpf_object__attach_skeleton()
12371 if (!prog->sec_def || !prog->sec_def->prog_attach_fn) in bpf_object__attach_skeleton()
12378 err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, link); in bpf_object__attach_skeleton()
12381 bpf_program__name(prog), err); in bpf_object__attach_skeleton()