Lines Matching refs:prog

72 static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog);
699 void bpf_program__unload(struct bpf_program *prog) in bpf_program__unload() argument
701 if (!prog) in bpf_program__unload()
704 zclose(prog->fd); in bpf_program__unload()
706 zfree(&prog->func_info); in bpf_program__unload()
707 zfree(&prog->line_info); in bpf_program__unload()
710 static void bpf_program__exit(struct bpf_program *prog) in bpf_program__exit() argument
712 if (!prog) in bpf_program__exit()
715 bpf_program__unload(prog); in bpf_program__exit()
716 zfree(&prog->name); in bpf_program__exit()
717 zfree(&prog->sec_name); in bpf_program__exit()
718 zfree(&prog->insns); in bpf_program__exit()
719 zfree(&prog->reloc_desc); in bpf_program__exit()
721 prog->nr_reloc = 0; in bpf_program__exit()
722 prog->insns_cnt = 0; in bpf_program__exit()
723 prog->sec_idx = -1; in bpf_program__exit()
747 bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog, in bpf_object__init_prog() argument
757 memset(prog, 0, sizeof(*prog)); in bpf_object__init_prog()
758 prog->obj = obj; in bpf_object__init_prog()
760 prog->sec_idx = sec_idx; in bpf_object__init_prog()
761 prog->sec_insn_off = sec_off / BPF_INSN_SZ; in bpf_object__init_prog()
762 prog->sec_insn_cnt = insn_data_sz / BPF_INSN_SZ; in bpf_object__init_prog()
764 prog->insns_cnt = prog->sec_insn_cnt; in bpf_object__init_prog()
766 prog->type = BPF_PROG_TYPE_UNSPEC; in bpf_object__init_prog()
767 prog->fd = -1; in bpf_object__init_prog()
774 prog->autoload = false; in bpf_object__init_prog()
778 prog->autoload = true; in bpf_object__init_prog()
781 prog->autoattach = true; in bpf_object__init_prog()
784 prog->log_level = obj->log_level; in bpf_object__init_prog()
786 prog->sec_name = strdup(sec_name); in bpf_object__init_prog()
787 if (!prog->sec_name) in bpf_object__init_prog()
790 prog->name = strdup(name); in bpf_object__init_prog()
791 if (!prog->name) in bpf_object__init_prog()
794 prog->insns = malloc(insn_data_sz); in bpf_object__init_prog()
795 if (!prog->insns) in bpf_object__init_prog()
797 memcpy(prog->insns, insn_data, insn_data_sz); in bpf_object__init_prog()
802 bpf_program__exit(prog); in bpf_object__init_prog()
811 struct bpf_program *prog, *progs; in bpf_object__add_programs() local
867 prog = &progs[nr_progs]; in bpf_object__add_programs()
869 err = bpf_object__init_prog(obj, prog, name, sec_idx, sec_name, in bpf_object__add_programs()
882 prog->mark_btf_static = true; in bpf_object__add_programs()
1069 struct bpf_program *prog; in bpf_map__init_kern_struct_ops() local
1071 prog = st_ops->progs[i]; in bpf_map__init_kern_struct_ops()
1072 if (!prog) in bpf_map__init_kern_struct_ops()
1089 prog->attach_btf_id = kern_type_id; in bpf_map__init_kern_struct_ops()
1090 prog->expected_attach_type = kern_member_idx; in bpf_map__init_kern_struct_ops()
1095 map->name, mname, prog->name, moff, in bpf_map__init_kern_struct_ops()
3029 static bool prog_needs_vmlinux_btf(struct bpf_program *prog) in prog_needs_vmlinux_btf() argument
3031 if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || in prog_needs_vmlinux_btf()
3032 prog->type == BPF_PROG_TYPE_LSM) in prog_needs_vmlinux_btf()
3038 if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd) in prog_needs_vmlinux_btf()
3046 struct bpf_program *prog; in obj_needs_vmlinux_btf() local
3064 bpf_object__for_each_program(prog, obj) { in obj_needs_vmlinux_btf()
3065 if (!prog->autoload) in obj_needs_vmlinux_btf()
3067 if (prog_needs_vmlinux_btf(prog)) in obj_needs_vmlinux_btf()
3122 struct bpf_program *prog = &obj->programs[i]; in bpf_object__sanitize_and_load_btf() local
3127 if (!prog->mark_btf_static || !prog_is_subprog(obj, prog)) in bpf_object__sanitize_and_load_btf()
3137 if (strcmp(name, prog->name) != 0) in bpf_object__sanitize_and_load_btf()
3990 static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog) in prog_is_subprog() argument
3992 return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1; in prog_is_subprog()
3999 struct bpf_program *prog; in bpf_object__find_program_by_name() local
4001 bpf_object__for_each_program(prog, obj) { in bpf_object__find_program_by_name()
4002 if (prog_is_subprog(obj, prog)) in bpf_object__find_program_by_name()
4004 if (!strcmp(prog->name, name)) in bpf_object__find_program_by_name()
4005 return prog; in bpf_object__find_program_by_name()
4047 static int bpf_program__record_reloc(struct bpf_program *prog, in bpf_program__record_reloc() argument
4052 struct bpf_insn *insn = &prog->insns[insn_idx]; in bpf_program__record_reloc()
4053 size_t map_idx, nr_maps = prog->obj->nr_maps; in bpf_program__record_reloc()
4054 struct bpf_object *obj = prog->obj; in bpf_program__record_reloc()
4062 prog->name, sym_name, insn_idx, insn->code); in bpf_program__record_reloc()
4078 prog->name, sym_name, sym_idx); in bpf_program__record_reloc()
4082 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
4095 pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name); in bpf_program__record_reloc()
4102 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
4107 prog->name, sym_name, (size_t)sym->st_value); in bpf_program__record_reloc()
4118 prog->name, sym_name, shdr_idx); in bpf_program__record_reloc()
4129 prog->name, sym_name, (size_t)sym->st_value, insn->imm); in bpf_program__record_reloc()
4146 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
4156 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
4162 prog->name, sym_sec_name, (size_t)sym->st_value); in bpf_program__record_reloc()
4175 prog->name, sym_sec_name); in bpf_program__record_reloc()
4183 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
4189 prog->name, sym_sec_name); in bpf_program__record_reloc()
4200 static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) in prog_contains_insn() argument
4202 return insn_idx >= prog->sec_insn_off && in prog_contains_insn()
4203 insn_idx < prog->sec_insn_off + prog->sec_insn_cnt; in prog_contains_insn()
4210 struct bpf_program *prog; in find_prog_by_sec_insn() local
4217 prog = &obj->programs[m]; in find_prog_by_sec_insn()
4219 if (prog->sec_idx < sec_idx || in find_prog_by_sec_insn()
4220 (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx)) in find_prog_by_sec_insn()
4228 prog = &obj->programs[l]; in find_prog_by_sec_insn()
4229 if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx)) in find_prog_by_sec_insn()
4230 return prog; in find_prog_by_sec_insn()
4239 struct bpf_program *prog; in bpf_object__collect_prog_relos() local
4307 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__collect_prog_relos()
4308 if (!prog) { in bpf_object__collect_prog_relos()
4314 relos = libbpf_reallocarray(prog->reloc_desc, in bpf_object__collect_prog_relos()
4315 prog->nr_reloc + 1, sizeof(*relos)); in bpf_object__collect_prog_relos()
4318 prog->reloc_desc = relos; in bpf_object__collect_prog_relos()
4321 insn_idx -= prog->sec_insn_off; in bpf_object__collect_prog_relos()
4322 err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc], in bpf_object__collect_prog_relos()
4327 prog->nr_reloc++; in bpf_object__collect_prog_relos()
4754 int ret, map, prog, insn_cnt = ARRAY_SIZE(insns); in probe_prog_bind_map() local
4765 prog = bpf_prog_load(BPF_PROG_TYPE_SOCKET_FILTER, NULL, "GPL", insns, insn_cnt, NULL); in probe_prog_bind_map()
4766 if (prog < 0) { in probe_prog_bind_map()
4771 ret = bpf_prog_bind_map(prog, map, NULL); in probe_prog_bind_map()
4774 close(prog); in probe_prog_bind_map()
5699 static int record_relo_core(struct bpf_program *prog, in record_relo_core() argument
5704 relos = libbpf_reallocarray(prog->reloc_desc, in record_relo_core()
5705 prog->nr_reloc + 1, sizeof(*relos)); in record_relo_core()
5708 relo = &relos[prog->nr_reloc]; in record_relo_core()
5712 prog->reloc_desc = relos; in record_relo_core()
5713 prog->nr_reloc++; in record_relo_core()
5717 static const struct bpf_core_relo *find_relo_core(struct bpf_program *prog, int insn_idx) in find_relo_core() argument
5722 for (i = 0; i < prog->nr_reloc; i++) { in find_relo_core()
5723 relo = &prog->reloc_desc[i]; in find_relo_core()
5733 static int bpf_core_resolve_relo(struct bpf_program *prog, in bpf_core_resolve_relo() argument
5742 const char *prog_name = prog->name; in bpf_core_resolve_relo()
5758 cands = bpf_core_find_cands(prog->obj, local_btf, local_id); in bpf_core_resolve_relo()
5785 struct bpf_program *prog; in bpf_object__relocate_core() local
5826 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__relocate_core()
5827 if (!prog) { in bpf_object__relocate_core()
5843 if (!prog->autoload) in bpf_object__relocate_core()
5850 insn_idx = insn_idx - prog->sec_insn_off; in bpf_object__relocate_core()
5851 if (insn_idx >= prog->insns_cnt) in bpf_object__relocate_core()
5853 insn = &prog->insns[insn_idx]; in bpf_object__relocate_core()
5855 err = record_relo_core(prog, rec, insn_idx); in bpf_object__relocate_core()
5858 prog->name, i, err); in bpf_object__relocate_core()
5862 if (prog->obj->gen_loader) in bpf_object__relocate_core()
5865 err = bpf_core_resolve_relo(prog, rec, i, obj->btf, cand_cache, &targ_res); in bpf_object__relocate_core()
5868 prog->name, i, err); in bpf_object__relocate_core()
5872 err = bpf_core_patch_insn(prog->name, insn, insn_idx, rec, i, &targ_res); in bpf_object__relocate_core()
5875 prog->name, i, insn_idx, err); in bpf_object__relocate_core()
5899 static void poison_map_ldimm64(struct bpf_program *prog, int relo_idx, in poison_map_ldimm64() argument
5906 prog->name, relo_idx, insn_idx, map_idx, map->name); in poison_map_ldimm64()
5929 static void poison_kfunc_call(struct bpf_program *prog, int relo_idx, in poison_kfunc_call() argument
5934 prog->name, relo_idx, insn_idx, ext->name); in poison_kfunc_call()
5955 bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_data() argument
5959 for (i = 0; i < prog->nr_reloc; i++) { in bpf_object__relocate_data()
5960 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_object__relocate_data()
5961 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate_data()
5975 poison_map_ldimm64(prog, i, relo->insn_idx, insn, in bpf_object__relocate_data()
5989 poison_map_ldimm64(prog, i, relo->insn_idx, insn, in bpf_object__relocate_data()
6022 poison_kfunc_call(prog, i, relo->insn_idx, insn, in bpf_object__relocate_data()
6029 prog->name, i); in bpf_object__relocate_data()
6042 prog->name, i, relo->type); in bpf_object__relocate_data()
6051 const struct bpf_program *prog, in adjust_prog_btf_ext_info() argument
6066 if (prog->sec_idx != sec_idx) in adjust_prog_btf_ext_info()
6072 if (insn_off < prog->sec_insn_off) in adjust_prog_btf_ext_info()
6074 if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt) in adjust_prog_btf_ext_info()
6103 off_adj = prog->sub_insn_off - prog->sec_insn_off; in adjust_prog_btf_ext_info()
6121 const struct bpf_program *prog) in reloc_prog_func_and_line_info() argument
6134 if (main_prog != prog && !main_prog->func_info) in reloc_prog_func_and_line_info()
6137 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info, in reloc_prog_func_and_line_info()
6144 prog->name, err); in reloc_prog_func_and_line_info()
6152 pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name); in reloc_prog_func_and_line_info()
6157 prog->name); in reloc_prog_func_and_line_info()
6162 if (main_prog != prog && !main_prog->line_info) in reloc_prog_func_and_line_info()
6165 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info, in reloc_prog_func_and_line_info()
6172 prog->name, err); in reloc_prog_func_and_line_info()
6180 pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name); in reloc_prog_func_and_line_info()
6185 prog->name); in reloc_prog_func_and_line_info()
6200 static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) in find_prog_insn_relo() argument
6202 if (!prog->nr_reloc) in find_prog_insn_relo()
6204 return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc, in find_prog_insn_relo()
6205 sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx); in find_prog_insn_relo()
6239 struct bpf_program *prog) in bpf_object__reloc_code() argument
6247 err = reloc_prog_func_and_line_info(obj, main_prog, prog); in bpf_object__reloc_code()
6251 for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) { in bpf_object__reloc_code()
6252 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
6256 relo = find_prog_insn_relo(prog, insn_idx); in bpf_object__reloc_code()
6264 prog->name, insn_idx, relo->type); in bpf_object__reloc_code()
6288 prog->name, insn_idx); in bpf_object__reloc_code()
6297 sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1; in bpf_object__reloc_code()
6304 prog->name); in bpf_object__reloc_code()
6348 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
6355 insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1; in bpf_object__reloc_code()
6358 prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off); in bpf_object__reloc_code()
6446 bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_calls() argument
6462 err = bpf_object__reloc_code(obj, prog, prog); in bpf_object__relocate_calls()
6472 struct bpf_program *prog; in bpf_object__free_relocs() local
6477 prog = &obj->programs[i]; in bpf_object__free_relocs()
6478 zfree(&prog->reloc_desc); in bpf_object__free_relocs()
6479 prog->nr_reloc = 0; in bpf_object__free_relocs()
6515 struct bpf_program *prog; in bpf_object__relocate() local
6537 prog = &obj->programs[i]; in bpf_object__relocate()
6538 for (j = 0; j < prog->nr_reloc; j++) { in bpf_object__relocate()
6539 struct reloc_desc *relo = &prog->reloc_desc[j]; in bpf_object__relocate()
6540 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate()
6556 prog = &obj->programs[i]; in bpf_object__relocate()
6560 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
6562 if (!prog->autoload) in bpf_object__relocate()
6565 err = bpf_object__relocate_calls(obj, prog); in bpf_object__relocate()
6568 prog->name, err); in bpf_object__relocate()
6574 prog = &obj->programs[i]; in bpf_object__relocate()
6575 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
6577 if (!prog->autoload) in bpf_object__relocate()
6579 err = bpf_object__relocate_data(obj, prog); in bpf_object__relocate()
6582 prog->name, err); in bpf_object__relocate()
6779 static int bpf_object__sanitize_prog(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__sanitize_prog() argument
6781 struct bpf_insn *insn = prog->insns; in bpf_object__sanitize_prog()
6788 for (i = 0; i < prog->insns_cnt; i++, insn++) { in bpf_object__sanitize_prog()
6814 static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name,
6818 static int libbpf_prepare_prog_load(struct bpf_program *prog, in libbpf_prepare_prog_load() argument
6824 if ((def & SEC_EXP_ATTACH_OPT) && !kernel_supports(prog->obj, FEAT_EXP_ATTACH_TYPE)) in libbpf_prepare_prog_load()
6830 if (prog->type == BPF_PROG_TYPE_XDP && (def & SEC_XDP_FRAGS)) in libbpf_prepare_prog_load()
6834 if ((def & SEC_USDT) && kernel_supports(prog->obj, FEAT_UPROBE_MULTI_LINK)) in libbpf_prepare_prog_load()
6835 prog->expected_attach_type = BPF_TRACE_UPROBE_MULTI; in libbpf_prepare_prog_load()
6837 if ((def & SEC_ATTACH_BTF) && !prog->attach_btf_id) { in libbpf_prepare_prog_load()
6841 attach_name = strchr(prog->sec_name, '/'); in libbpf_prepare_prog_load()
6853 prog->name); in libbpf_prepare_prog_load()
6858 err = libbpf_find_attach_btf_id(prog, attach_name, &btf_obj_fd, &btf_type_id); in libbpf_prepare_prog_load()
6863 prog->attach_btf_obj_fd = btf_obj_fd; in libbpf_prepare_prog_load()
6864 prog->attach_btf_id = btf_type_id; in libbpf_prepare_prog_load()
6877 static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz);
6879 static int bpf_object_load_prog(struct bpf_object *obj, struct bpf_program *prog, in bpf_object_load_prog() argument
6890 __u32 log_level = prog->log_level; in bpf_object_load_prog()
6892 if (prog->type == BPF_PROG_TYPE_UNSPEC) { in bpf_object_load_prog()
6898 prog->name, prog->sec_name); in bpf_object_load_prog()
6906 prog_name = prog->name; in bpf_object_load_prog()
6907 load_attr.attach_prog_fd = prog->attach_prog_fd; in bpf_object_load_prog()
6908 load_attr.attach_btf_obj_fd = prog->attach_btf_obj_fd; in bpf_object_load_prog()
6909 load_attr.attach_btf_id = prog->attach_btf_id; in bpf_object_load_prog()
6911 load_attr.prog_ifindex = prog->prog_ifindex; in bpf_object_load_prog()
6917 load_attr.func_info = prog->func_info; in bpf_object_load_prog()
6918 load_attr.func_info_rec_size = prog->func_info_rec_size; in bpf_object_load_prog()
6919 load_attr.func_info_cnt = prog->func_info_cnt; in bpf_object_load_prog()
6920 load_attr.line_info = prog->line_info; in bpf_object_load_prog()
6921 load_attr.line_info_rec_size = prog->line_info_rec_size; in bpf_object_load_prog()
6922 load_attr.line_info_cnt = prog->line_info_cnt; in bpf_object_load_prog()
6925 load_attr.prog_flags = prog->prog_flags; in bpf_object_load_prog()
6929 if (prog->sec_def && prog->sec_def->prog_prepare_load_fn) { in bpf_object_load_prog()
6930 err = prog->sec_def->prog_prepare_load_fn(prog, &load_attr, prog->sec_def->cookie); in bpf_object_load_prog()
6933 prog->name, err); in bpf_object_load_prog()
6936 insns = prog->insns; in bpf_object_load_prog()
6937 insns_cnt = prog->insns_cnt; in bpf_object_load_prog()
6941 load_attr.expected_attach_type = prog->expected_attach_type; in bpf_object_load_prog()
6944 bpf_gen__prog_load(obj->gen_loader, prog->type, prog->name, in bpf_object_load_prog()
6946 prog - obj->programs); in bpf_object_load_prog()
6958 if (prog->log_buf) { in bpf_object_load_prog()
6959 log_buf = prog->log_buf; in bpf_object_load_prog()
6960 log_buf_size = prog->log_size; in bpf_object_load_prog()
6983 ret = bpf_prog_load(prog->type, prog_name, license, insns, insns_cnt, &load_attr); in bpf_object_load_prog()
6987 prog->name, log_buf); in bpf_object_load_prog()
6995 map = &prog->obj->maps[i]; in bpf_object_load_prog()
7002 prog->name, map->real_name, cp); in bpf_object_load_prog()
7030 fixup_verifier_log(prog, log_buf, log_buf_size); in bpf_object_load_prog()
7033 pr_warn("prog '%s': BPF program load failed: %s\n", prog->name, cp); in bpf_object_load_prog()
7038 prog->name, log_buf); in bpf_object_load_prog()
7098 static void fixup_log_failed_core_relo(struct bpf_program *prog, in fixup_log_failed_core_relo() argument
7120 relo = find_relo_core(prog, insn_idx); in fixup_log_failed_core_relo()
7124 err = bpf_core_parse_spec(prog->name, prog->obj->btf, relo, &spec); in fixup_log_failed_core_relo()
7137 static void fixup_log_missing_map_load(struct bpf_program *prog, in fixup_log_missing_map_load() argument
7149 struct bpf_object *obj = prog->obj; in fixup_log_missing_map_load()
7170 static void fixup_log_missing_kfunc_call(struct bpf_program *prog, in fixup_log_missing_kfunc_call() argument
7182 struct bpf_object *obj = prog->obj; in fixup_log_missing_kfunc_call()
7203 static void fixup_verifier_log(struct bpf_program *prog, char *buf, size_t buf_sz) in fixup_verifier_log() argument
7228 fixup_log_failed_core_relo(prog, buf, buf_sz, log_sz, in fixup_verifier_log()
7237 fixup_log_missing_map_load(prog, buf, buf_sz, log_sz, in fixup_verifier_log()
7246 fixup_log_missing_kfunc_call(prog, buf, buf_sz, log_sz, in fixup_verifier_log()
7253 static int bpf_program_record_relos(struct bpf_program *prog) in bpf_program_record_relos() argument
7255 struct bpf_object *obj = prog->obj; in bpf_program_record_relos()
7258 for (i = 0; i < prog->nr_reloc; i++) { in bpf_program_record_relos()
7259 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_program_record_relos()
7299 struct bpf_program *prog; in bpf_object__load_progs() local
7304 prog = &obj->programs[i]; in bpf_object__load_progs()
7305 err = bpf_object__sanitize_prog(obj, prog); in bpf_object__load_progs()
7311 prog = &obj->programs[i]; in bpf_object__load_progs()
7312 if (prog_is_subprog(obj, prog)) in bpf_object__load_progs()
7314 if (!prog->autoload) { in bpf_object__load_progs()
7315 pr_debug("prog '%s': skipped loading\n", prog->name); in bpf_object__load_progs()
7318 prog->log_level |= log_level; in bpf_object__load_progs()
7321 bpf_program_record_relos(prog); in bpf_object__load_progs()
7323 err = bpf_object_load_prog(obj, prog, prog->insns, prog->insns_cnt, in bpf_object__load_progs()
7324 obj->license, obj->kern_version, &prog->fd); in bpf_object__load_progs()
7326 pr_warn("prog '%s': failed to load: %d\n", prog->name, err); in bpf_object__load_progs()
7339 struct bpf_program *prog; in bpf_object_init_progs() local
7342 bpf_object__for_each_program(prog, obj) { in bpf_object_init_progs()
7343 prog->sec_def = find_sec_def(prog->sec_name); in bpf_object_init_progs()
7344 if (!prog->sec_def) { in bpf_object_init_progs()
7347 prog->name, prog->sec_name); in bpf_object_init_progs()
7351 prog->type = prog->sec_def->prog_type; in bpf_object_init_progs()
7352 prog->expected_attach_type = prog->sec_def->expected_attach_type; in bpf_object_init_progs()
7357 if (prog->sec_def->prog_setup_fn) { in bpf_object_init_progs()
7358 err = prog->sec_def->prog_setup_fn(prog, prog->sec_def->cookie); in bpf_object_init_progs()
7361 prog->name, err); in bpf_object_init_progs()
7889 struct bpf_program *prog = st_ops->progs[i]; in bpf_map_prepare_vdata() local
7893 if (!prog) in bpf_map_prepare_vdata()
7896 prog_fd = bpf_program__fd(prog); in bpf_map_prepare_vdata()
8039 int bpf_program__pin(struct bpf_program *prog, const char *path) in bpf_program__pin() argument
8044 if (prog->fd < 0) { in bpf_program__pin()
8045 pr_warn("prog '%s': can't pin program that wasn't loaded\n", prog->name); in bpf_program__pin()
8057 if (bpf_obj_pin(prog->fd, path)) { in bpf_program__pin()
8060 pr_warn("prog '%s': failed to pin at '%s': %s\n", prog->name, path, cp); in bpf_program__pin()
8064 pr_debug("prog '%s': pinned at '%s'\n", prog->name, path); in bpf_program__pin()
8068 int bpf_program__unpin(struct bpf_program *prog, const char *path) in bpf_program__unpin() argument
8072 if (prog->fd < 0) { in bpf_program__unpin()
8073 pr_warn("prog '%s': can't unpin program that wasn't loaded\n", prog->name); in bpf_program__unpin()
8085 pr_debug("prog '%s': unpinned from '%s'\n", prog->name, path); in bpf_program__unpin()
8304 struct bpf_program *prog; in bpf_object__pin_programs() local
8316 bpf_object__for_each_program(prog, obj) { in bpf_object__pin_programs()
8317 err = pathname_concat(buf, sizeof(buf), path, prog->name); in bpf_object__pin_programs()
8321 err = bpf_program__pin(prog, buf); in bpf_object__pin_programs()
8329 while ((prog = bpf_object__prev_program(obj, prog))) { in bpf_object__pin_programs()
8330 if (pathname_concat(buf, sizeof(buf), path, prog->name)) in bpf_object__pin_programs()
8333 bpf_program__unpin(prog, buf); in bpf_object__pin_programs()
8341 struct bpf_program *prog; in bpf_object__unpin_programs() local
8347 bpf_object__for_each_program(prog, obj) { in bpf_object__unpin_programs()
8350 err = pathname_concat(buf, sizeof(buf), path, prog->name); in bpf_object__unpin_programs()
8354 err = bpf_program__unpin(prog, buf); in bpf_object__unpin_programs()
8543 struct bpf_program *prog = prev; in bpf_object__next_program() local
8546 prog = __bpf_program__iter(prog, obj, true); in bpf_object__next_program()
8547 } while (prog && prog_is_subprog(obj, prog)); in bpf_object__next_program()
8549 return prog; in bpf_object__next_program()
8555 struct bpf_program *prog = next; in bpf_object__prev_program() local
8558 prog = __bpf_program__iter(prog, obj, false); in bpf_object__prev_program()
8559 } while (prog && prog_is_subprog(obj, prog)); in bpf_object__prev_program()
8561 return prog; in bpf_object__prev_program()
8564 void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) in bpf_program__set_ifindex() argument
8566 prog->prog_ifindex = ifindex; in bpf_program__set_ifindex()
8569 const char *bpf_program__name(const struct bpf_program *prog) in bpf_program__name() argument
8571 return prog->name; in bpf_program__name()
8574 const char *bpf_program__section_name(const struct bpf_program *prog) in bpf_program__section_name() argument
8576 return prog->sec_name; in bpf_program__section_name()
8579 bool bpf_program__autoload(const struct bpf_program *prog) in bpf_program__autoload() argument
8581 return prog->autoload; in bpf_program__autoload()
8584 int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) in bpf_program__set_autoload() argument
8586 if (prog->obj->loaded) in bpf_program__set_autoload()
8589 prog->autoload = autoload; in bpf_program__set_autoload()
8593 bool bpf_program__autoattach(const struct bpf_program *prog) in bpf_program__autoattach() argument
8595 return prog->autoattach; in bpf_program__autoattach()
8598 void bpf_program__set_autoattach(struct bpf_program *prog, bool autoattach) in bpf_program__set_autoattach() argument
8600 prog->autoattach = autoattach; in bpf_program__set_autoattach()
8603 const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog) in bpf_program__insns() argument
8605 return prog->insns; in bpf_program__insns()
8608 size_t bpf_program__insn_cnt(const struct bpf_program *prog) in bpf_program__insn_cnt() argument
8610 return prog->insns_cnt; in bpf_program__insn_cnt()
8613 int bpf_program__set_insns(struct bpf_program *prog, in bpf_program__set_insns() argument
8618 if (prog->obj->loaded) in bpf_program__set_insns()
8621 insns = libbpf_reallocarray(prog->insns, new_insn_cnt, sizeof(*insns)); in bpf_program__set_insns()
8624 pr_warn("prog '%s': failed to realloc prog code\n", prog->name); in bpf_program__set_insns()
8629 prog->insns = insns; in bpf_program__set_insns()
8630 prog->insns_cnt = new_insn_cnt; in bpf_program__set_insns()
8634 int bpf_program__fd(const struct bpf_program *prog) in bpf_program__fd() argument
8636 if (!prog) in bpf_program__fd()
8639 if (prog->fd < 0) in bpf_program__fd()
8642 return prog->fd; in bpf_program__fd()
8646 enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog);
8648 enum bpf_prog_type bpf_program__type(const struct bpf_program *prog) in bpf_program__type() argument
8650 return prog->type; in bpf_program__type()
8659 int bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) in bpf_program__set_type() argument
8661 if (prog->obj->loaded) in bpf_program__set_type()
8665 if (prog->type == type) in bpf_program__set_type()
8668 prog->type = type; in bpf_program__set_type()
8676 if (prog->sec_def != &custom_fallback_def) in bpf_program__set_type()
8677 prog->sec_def = NULL; in bpf_program__set_type()
8682 enum bpf_attach_type bpf_program__get_expected_attach_type(const struct bpf_program *prog);
8684 enum bpf_attach_type bpf_program__expected_attach_type(const struct bpf_program *prog) in bpf_program__expected_attach_type() argument
8686 return prog->expected_attach_type; in bpf_program__expected_attach_type()
8689 int bpf_program__set_expected_attach_type(struct bpf_program *prog, in bpf_program__set_expected_attach_type() argument
8692 if (prog->obj->loaded) in bpf_program__set_expected_attach_type()
8695 prog->expected_attach_type = type; in bpf_program__set_expected_attach_type()
8699 __u32 bpf_program__flags(const struct bpf_program *prog) in bpf_program__flags() argument
8701 return prog->prog_flags; in bpf_program__flags()
8704 int bpf_program__set_flags(struct bpf_program *prog, __u32 flags) in bpf_program__set_flags() argument
8706 if (prog->obj->loaded) in bpf_program__set_flags()
8709 prog->prog_flags = flags; in bpf_program__set_flags()
8713 __u32 bpf_program__log_level(const struct bpf_program *prog) in bpf_program__log_level() argument
8715 return prog->log_level; in bpf_program__log_level()
8718 int bpf_program__set_log_level(struct bpf_program *prog, __u32 log_level) in bpf_program__set_log_level() argument
8720 if (prog->obj->loaded) in bpf_program__set_log_level()
8723 prog->log_level = log_level; in bpf_program__set_log_level()
8727 const char *bpf_program__log_buf(const struct bpf_program *prog, size_t *log_size) in bpf_program__log_buf() argument
8729 *log_size = prog->log_size; in bpf_program__log_buf()
8730 return prog->log_buf; in bpf_program__log_buf()
8733 int bpf_program__set_log_buf(struct bpf_program *prog, char *log_buf, size_t log_size) in bpf_program__set_log_buf() argument
8737 if (prog->log_size > UINT_MAX) in bpf_program__set_log_buf()
8739 if (prog->obj->loaded) in bpf_program__set_log_buf()
8742 prog->log_buf = log_buf; in bpf_program__set_log_buf()
8743 prog->log_size = log_size; in bpf_program__set_log_buf()
8756 static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8757 static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8758 static int attach_ksyscall(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8759 static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8760 static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8761 static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8762 static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8763 static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8764 static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8765 static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link);
8766 static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link);
9124 struct bpf_program *prog; in bpf_object__collect_st_ops_relos() local
9196 prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx); in bpf_object__collect_st_ops_relos()
9197 if (!prog) { in bpf_object__collect_st_ops_relos()
9204 if (prog->type != BPF_PROG_TYPE_STRUCT_OPS) { in bpf_object__collect_st_ops_relos()
9206 map->name, prog->name); in bpf_object__collect_st_ops_relos()
9213 if (!prog->attach_btf_id) { in bpf_object__collect_st_ops_relos()
9214 prog->attach_btf_id = st_ops->type_id; in bpf_object__collect_st_ops_relos()
9215 prog->expected_attach_type = member_idx; in bpf_object__collect_st_ops_relos()
9223 if (prog->attach_btf_id != st_ops->type_id || in bpf_object__collect_st_ops_relos()
9224 prog->expected_attach_type != member_idx) { in bpf_object__collect_st_ops_relos()
9226 map->name, prog->name, prog->sec_name, prog->type, in bpf_object__collect_st_ops_relos()
9227 prog->attach_btf_id, prog->expected_attach_type, name); in bpf_object__collect_st_ops_relos()
9231 st_ops->progs[member_idx] = prog; in bpf_object__collect_st_ops_relos()
9386 static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name, in libbpf_find_attach_btf_id() argument
9389 enum bpf_attach_type attach_type = prog->expected_attach_type; in libbpf_find_attach_btf_id()
9390 __u32 attach_prog_fd = prog->attach_prog_fd; in libbpf_find_attach_btf_id()
9394 if (prog->type == BPF_PROG_TYPE_EXT || attach_prog_fd) { in libbpf_find_attach_btf_id()
9396 pr_warn("prog '%s': attach program FD is not set\n", prog->name); in libbpf_find_attach_btf_id()
9402 prog->name, attach_prog_fd, attach_name, err); in libbpf_find_attach_btf_id()
9411 if (prog->obj->gen_loader) { in libbpf_find_attach_btf_id()
9412 bpf_gen__record_attach_target(prog->obj->gen_loader, attach_name, attach_type); in libbpf_find_attach_btf_id()
9416 err = find_kernel_btf_id(prog->obj, attach_name, attach_type, btf_obj_fd, btf_type_id); in libbpf_find_attach_btf_id()
9420 prog->name, attach_name, err); in libbpf_find_attach_btf_id()
9922 int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog) in bpf_link__update_program() argument
9926 ret = bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL); in bpf_link__update_program()
10102 struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd, in bpf_program__attach_perf_event_opts() argument
10115 prog->name, pfd); in bpf_program__attach_perf_event_opts()
10118 prog_fd = bpf_program__fd(prog); in bpf_program__attach_perf_event_opts()
10121 prog->name); in bpf_program__attach_perf_event_opts()
10133 if (kernel_supports(prog->obj, FEAT_PERF_LINK) && !force_ioctl_attach) { in bpf_program__attach_perf_event_opts()
10141 prog->name, pfd, in bpf_program__attach_perf_event_opts()
10148 pr_warn("prog '%s': user context value is not supported\n", prog->name); in bpf_program__attach_perf_event_opts()
10156 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
10159 prog->name, pfd); in bpf_program__attach_perf_event_opts()
10167 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
10179 struct bpf_link *bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd) in bpf_program__attach_perf_event() argument
10181 return bpf_program__attach_perf_event_opts(prog, pfd, NULL); in bpf_program__attach_perf_event()
10503 bpf_program__attach_kprobe_opts(const struct bpf_program *prog, in bpf_program__attach_kprobe_opts() argument
10536 if (legacy || !kernel_supports(prog->obj, FEAT_PERF_LINK)) in bpf_program__attach_kprobe_opts()
10565 prog->name, retprobe ? "kretprobe" : "kprobe", in bpf_program__attach_kprobe_opts()
10570 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_kprobe_opts()
10575 prog->name, retprobe ? "kretprobe" : "kprobe", in bpf_program__attach_kprobe_opts()
10598 struct bpf_link *bpf_program__attach_kprobe(const struct bpf_program *prog, in bpf_program__attach_kprobe() argument
10606 return bpf_program__attach_kprobe_opts(prog, func_name, &opts); in bpf_program__attach_kprobe()
10609 struct bpf_link *bpf_program__attach_ksyscall(const struct bpf_program *prog, in bpf_program__attach_ksyscall() argument
10619 if (kernel_supports(prog->obj, FEAT_SYSCALL_WRAPPER)) { in bpf_program__attach_ksyscall()
10634 return bpf_program__attach_kprobe_opts(prog, func_name, &kprobe_opts); in bpf_program__attach_ksyscall()
10824 bpf_program__attach_kprobe_multi_opts(const struct bpf_program *prog, in bpf_program__attach_kprobe_multi_opts() argument
10884 prog_fd = bpf_program__fd(prog); in bpf_program__attach_kprobe_multi_opts()
10889 prog->name, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_kprobe_multi_opts()
10902 static int attach_kprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_kprobe() argument
10913 if (strcmp(prog->sec_name, "kprobe") == 0 || strcmp(prog->sec_name, "kretprobe") == 0) in attach_kprobe()
10916 opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe/"); in attach_kprobe()
10918 func_name = prog->sec_name + sizeof("kretprobe/") - 1; in attach_kprobe()
10920 func_name = prog->sec_name + sizeof("kprobe/") - 1; in attach_kprobe()
10934 *link = bpf_program__attach_kprobe_opts(prog, func, &opts); in attach_kprobe()
10939 static int attach_ksyscall(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_ksyscall() argument
10947 if (strcmp(prog->sec_name, "ksyscall") == 0 || strcmp(prog->sec_name, "kretsyscall") == 0) in attach_ksyscall()
10950 opts.retprobe = str_has_pfx(prog->sec_name, "kretsyscall/"); in attach_ksyscall()
10952 syscall_name = prog->sec_name + sizeof("kretsyscall/") - 1; in attach_ksyscall()
10954 syscall_name = prog->sec_name + sizeof("ksyscall/") - 1; in attach_ksyscall()
10956 *link = bpf_program__attach_ksyscall(prog, syscall_name, &opts); in attach_ksyscall()
10960 static int attach_kprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_kprobe_multi() argument
10970 if (strcmp(prog->sec_name, "kprobe.multi") == 0 || in attach_kprobe_multi()
10971 strcmp(prog->sec_name, "kretprobe.multi") == 0) in attach_kprobe_multi()
10974 opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe.multi/"); in attach_kprobe_multi()
10976 spec = prog->sec_name + sizeof("kretprobe.multi/") - 1; in attach_kprobe_multi()
10978 spec = prog->sec_name + sizeof("kprobe.multi/") - 1; in attach_kprobe_multi()
10986 *link = bpf_program__attach_kprobe_multi_opts(prog, pattern, &opts); in attach_kprobe_multi()
10991 static int attach_uprobe_multi(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_uprobe_multi() argument
10999 n = sscanf(prog->sec_name, "%m[^/]/%m[^:]:%ms", in attach_uprobe_multi()
11008 *link = bpf_program__attach_uprobe_multi(prog, -1, binary_path, func_name, &opts); in attach_uprobe_multi()
11012 pr_warn("prog '%s': invalid format of section definition '%s'\n", prog->name, in attach_uprobe_multi()
11013 prog->sec_name); in attach_uprobe_multi()
11247 bpf_program__attach_uprobe_multi(const struct bpf_program *prog, in bpf_program__attach_uprobe_multi() argument
11305 prog->name, path, err); in bpf_program__attach_uprobe_multi()
11342 prog_fd = bpf_program__fd(prog); in bpf_program__attach_uprobe_multi()
11347 prog->name, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_uprobe_multi()
11361 bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, in bpf_program__attach_uprobe_opts() argument
11399 prog->name, binary_path, err); in bpf_program__attach_uprobe_opts()
11432 if (legacy || !kernel_supports(prog->obj, FEAT_PERF_LINK)) in bpf_program__attach_uprobe_opts()
11463 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
11469 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_uprobe_opts()
11474 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
11506 static int attach_uprobe(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_uprobe() argument
11515 n = sscanf(prog->sec_name, "%m[^/]/%m[^:]:%m[a-zA-Z0-9_.]+%li", in attach_uprobe()
11524 prog->name, prog->sec_name); in attach_uprobe()
11532 prog->name); in attach_uprobe()
11536 *link = bpf_program__attach_uprobe_opts(prog, -1, binary_path, offset, &opts); in attach_uprobe()
11540 pr_warn("prog '%s': invalid format of section definition '%s'\n", prog->name, in attach_uprobe()
11541 prog->sec_name); in attach_uprobe()
11551 struct bpf_link *bpf_program__attach_uprobe(const struct bpf_program *prog, in bpf_program__attach_uprobe() argument
11558 return bpf_program__attach_uprobe_opts(prog, pid, binary_path, func_offset, &opts); in bpf_program__attach_uprobe()
11561 struct bpf_link *bpf_program__attach_usdt(const struct bpf_program *prog, in bpf_program__attach_usdt() argument
11567 struct bpf_object *obj = prog->obj; in bpf_program__attach_usdt()
11575 if (bpf_program__fd(prog) < 0) { in bpf_program__attach_usdt()
11577 prog->name); in bpf_program__attach_usdt()
11588 prog->name, binary_path, err); in bpf_program__attach_usdt()
11606 link = usdt_manager_attach_usdt(obj->usdt_man, prog, pid, binary_path, in bpf_program__attach_usdt()
11614 static int attach_usdt(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_usdt() argument
11620 sec_name = bpf_program__section_name(prog); in attach_usdt()
11633 *link = bpf_program__attach_usdt(prog, -1 /* any process */, path, in attach_usdt()
11694 struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, in bpf_program__attach_tracepoint_opts() argument
11712 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
11716 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_tracepoint_opts()
11721 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
11728 struct bpf_link *bpf_program__attach_tracepoint(const struct bpf_program *prog, in bpf_program__attach_tracepoint() argument
11732 return bpf_program__attach_tracepoint_opts(prog, tp_category, tp_name, NULL); in bpf_program__attach_tracepoint()
11735 static int attach_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_tp() argument
11742 if (strcmp(prog->sec_name, "tp") == 0 || strcmp(prog->sec_name, "tracepoint") == 0) in attach_tp()
11745 sec_name = strdup(prog->sec_name); in attach_tp()
11750 if (str_has_pfx(prog->sec_name, "tp/")) in attach_tp()
11762 *link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name); in attach_tp()
11767 struct bpf_link *bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, in bpf_program__attach_raw_tracepoint() argument
11774 prog_fd = bpf_program__fd(prog); in bpf_program__attach_raw_tracepoint()
11776 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_raw_tracepoint()
11790 prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_raw_tracepoint()
11797 static int attach_raw_tp(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_raw_tp() argument
11813 if (!str_has_pfx(prog->sec_name, prefixes[i])) in attach_raw_tp()
11818 if (prog->sec_name[pfx_len] == '\0') in attach_raw_tp()
11821 if (prog->sec_name[pfx_len] != '/') in attach_raw_tp()
11824 tp_name = prog->sec_name + pfx_len + 1; in attach_raw_tp()
11830 prog->name, prog->sec_name); in attach_raw_tp()
11834 *link = bpf_program__attach_raw_tracepoint(prog, tp_name); in attach_raw_tp()
11839 static struct bpf_link *bpf_program__attach_btf_id(const struct bpf_program *prog, in bpf_program__attach_btf_id() argument
11850 prog_fd = bpf_program__fd(prog); in bpf_program__attach_btf_id()
11852 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_btf_id()
11863 pfd = bpf_link_create(prog_fd, 0, bpf_program__expected_attach_type(prog), &link_opts); in bpf_program__attach_btf_id()
11868 prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_btf_id()
11875 struct bpf_link *bpf_program__attach_trace(const struct bpf_program *prog) in bpf_program__attach_trace() argument
11877 return bpf_program__attach_btf_id(prog, NULL); in bpf_program__attach_trace()
11880 struct bpf_link *bpf_program__attach_trace_opts(const struct bpf_program *prog, in bpf_program__attach_trace_opts() argument
11883 return bpf_program__attach_btf_id(prog, opts); in bpf_program__attach_trace_opts()
11886 struct bpf_link *bpf_program__attach_lsm(const struct bpf_program *prog) in bpf_program__attach_lsm() argument
11888 return bpf_program__attach_btf_id(prog, NULL); in bpf_program__attach_lsm()
11891 static int attach_trace(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_trace() argument
11893 *link = bpf_program__attach_trace(prog); in attach_trace()
11897 static int attach_lsm(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_lsm() argument
11899 *link = bpf_program__attach_lsm(prog); in attach_lsm()
11904 bpf_program_attach_fd(const struct bpf_program *prog, in bpf_program_attach_fd() argument
11913 prog_fd = bpf_program__fd(prog); in bpf_program_attach_fd()
11915 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program_attach_fd()
11924 attach_type = bpf_program__expected_attach_type(prog); in bpf_program_attach_fd()
11930 prog->name, target_name, in bpf_program_attach_fd()
11939 bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd) in bpf_program__attach_cgroup() argument
11941 return bpf_program_attach_fd(prog, cgroup_fd, "cgroup", NULL); in bpf_program__attach_cgroup()
11945 bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd) in bpf_program__attach_netns() argument
11947 return bpf_program_attach_fd(prog, netns_fd, "netns", NULL); in bpf_program__attach_netns()
11950 struct bpf_link *bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex) in bpf_program__attach_xdp() argument
11953 return bpf_program_attach_fd(prog, ifindex, "xdp", NULL); in bpf_program__attach_xdp()
11957 bpf_program__attach_tcx(const struct bpf_program *prog, int ifindex, in bpf_program__attach_tcx() argument
11973 prog->name); in bpf_program__attach_tcx()
11978 prog->name); in bpf_program__attach_tcx()
11988 return bpf_program_attach_fd(prog, ifindex, "tcx", &link_create_opts); in bpf_program__attach_tcx()
11991 struct bpf_link *bpf_program__attach_freplace(const struct bpf_program *prog, in bpf_program__attach_freplace() argument
11999 prog->name); in bpf_program__attach_freplace()
12003 if (prog->type != BPF_PROG_TYPE_EXT) { in bpf_program__attach_freplace()
12005 prog->name); in bpf_program__attach_freplace()
12018 return bpf_program_attach_fd(prog, target_fd, "freplace", in bpf_program__attach_freplace()
12024 return bpf_program__attach_trace(prog); in bpf_program__attach_freplace()
12029 bpf_program__attach_iter(const struct bpf_program *prog, in bpf_program__attach_iter() argument
12044 prog_fd = bpf_program__fd(prog); in bpf_program__attach_iter()
12046 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_iter()
12061 prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); in bpf_program__attach_iter()
12068 static int attach_iter(const struct bpf_program *prog, long cookie, struct bpf_link **link) in attach_iter() argument
12070 *link = bpf_program__attach_iter(prog, NULL); in attach_iter()
12074 struct bpf_link *bpf_program__attach_netfilter(const struct bpf_program *prog, in bpf_program__attach_netfilter() argument
12084 prog_fd = bpf_program__fd(prog); in bpf_program__attach_netfilter()
12086 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_netfilter()
12108 prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); in bpf_program__attach_netfilter()
12116 struct bpf_link *bpf_program__attach(const struct bpf_program *prog) in bpf_program__attach() argument
12121 if (!prog->sec_def || !prog->sec_def->prog_attach_fn) in bpf_program__attach()
12124 err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, &link); in bpf_program__attach()
12797 int bpf_program__set_attach_target(struct bpf_program *prog, in bpf_program__set_attach_target() argument
12803 if (!prog || attach_prog_fd < 0) in bpf_program__set_attach_target()
12806 if (prog->obj->loaded) in bpf_program__set_attach_target()
12813 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
12827 err = bpf_object__load_vmlinux_btf(prog->obj, true); in bpf_program__set_attach_target()
12830 err = find_kernel_btf_id(prog->obj, attach_func_name, in bpf_program__set_attach_target()
12831 prog->expected_attach_type, in bpf_program__set_attach_target()
12837 prog->attach_btf_id = btf_id; in bpf_program__set_attach_target()
12838 prog->attach_btf_obj_fd = btf_obj_fd; in bpf_program__set_attach_target()
12839 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
12977 struct bpf_program **prog = progs[i].prog; in populate_skeleton_progs() local
12980 *prog = bpf_object__find_program_by_name(obj, name); in populate_skeleton_progs()
12981 if (!*prog) { in populate_skeleton_progs()
13161 struct bpf_program *prog = *s->progs[i].prog; in bpf_object__attach_skeleton() local
13164 if (!prog->autoload || !prog->autoattach) in bpf_object__attach_skeleton()
13168 if (!prog->sec_def || !prog->sec_def->prog_attach_fn) in bpf_object__attach_skeleton()
13175 err = prog->sec_def->prog_attach_fn(prog, prog->sec_def->cookie, link); in bpf_object__attach_skeleton()
13178 bpf_program__name(prog), err); in bpf_object__attach_skeleton()