Lines Matching refs:prog

202 					struct bpf_program *prog);
488 void bpf_program__unload(struct bpf_program *prog) in bpf_program__unload() argument
492 if (!prog) in bpf_program__unload()
499 if (prog->instances.nr > 0) { in bpf_program__unload()
500 for (i = 0; i < prog->instances.nr; i++) in bpf_program__unload()
501 zclose(prog->instances.fds[i]); in bpf_program__unload()
502 } else if (prog->instances.nr != -1) { in bpf_program__unload()
504 prog->instances.nr); in bpf_program__unload()
507 prog->instances.nr = -1; in bpf_program__unload()
508 zfree(&prog->instances.fds); in bpf_program__unload()
510 zfree(&prog->func_info); in bpf_program__unload()
511 zfree(&prog->line_info); in bpf_program__unload()
514 static void bpf_program__exit(struct bpf_program *prog) in bpf_program__exit() argument
516 if (!prog) in bpf_program__exit()
519 if (prog->clear_priv) in bpf_program__exit()
520 prog->clear_priv(prog, prog->priv); in bpf_program__exit()
522 prog->priv = NULL; in bpf_program__exit()
523 prog->clear_priv = NULL; in bpf_program__exit()
525 bpf_program__unload(prog); in bpf_program__exit()
526 zfree(&prog->name); in bpf_program__exit()
527 zfree(&prog->sec_name); in bpf_program__exit()
528 zfree(&prog->pin_name); in bpf_program__exit()
529 zfree(&prog->insns); in bpf_program__exit()
530 zfree(&prog->reloc_desc); in bpf_program__exit()
532 prog->nr_reloc = 0; in bpf_program__exit()
533 prog->insns_cnt = 0; in bpf_program__exit()
534 prog->sec_idx = -1; in bpf_program__exit()
537 static char *__bpf_program__pin_name(struct bpf_program *prog) in __bpf_program__pin_name() argument
541 name = p = strdup(prog->sec_name); in __bpf_program__pin_name()
559 bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog, in bpf_object__init_prog() argument
569 memset(prog, 0, sizeof(*prog)); in bpf_object__init_prog()
570 prog->obj = obj; in bpf_object__init_prog()
572 prog->sec_idx = sec_idx; in bpf_object__init_prog()
573 prog->sec_insn_off = sec_off / BPF_INSN_SZ; in bpf_object__init_prog()
574 prog->sec_insn_cnt = insn_data_sz / BPF_INSN_SZ; in bpf_object__init_prog()
576 prog->insns_cnt = prog->sec_insn_cnt; in bpf_object__init_prog()
578 prog->type = BPF_PROG_TYPE_UNSPEC; in bpf_object__init_prog()
579 prog->load = true; in bpf_object__init_prog()
581 prog->instances.fds = NULL; in bpf_object__init_prog()
582 prog->instances.nr = -1; in bpf_object__init_prog()
584 prog->sec_name = strdup(sec_name); in bpf_object__init_prog()
585 if (!prog->sec_name) in bpf_object__init_prog()
588 prog->name = strdup(name); in bpf_object__init_prog()
589 if (!prog->name) in bpf_object__init_prog()
592 prog->pin_name = __bpf_program__pin_name(prog); in bpf_object__init_prog()
593 if (!prog->pin_name) in bpf_object__init_prog()
596 prog->insns = malloc(insn_data_sz); in bpf_object__init_prog()
597 if (!prog->insns) in bpf_object__init_prog()
599 memcpy(prog->insns, insn_data, insn_data_sz); in bpf_object__init_prog()
604 bpf_program__exit(prog); in bpf_object__init_prog()
612 struct bpf_program *prog, *progs; in bpf_object__add_programs() local
661 prog = &progs[nr_progs]; in bpf_object__add_programs()
663 err = bpf_object__init_prog(obj, prog, name, sec_idx, sec_name, in bpf_object__add_programs()
866 struct bpf_program *prog; in bpf_map__init_kern_struct_ops() local
868 prog = st_ops->progs[i]; in bpf_map__init_kern_struct_ops()
869 if (!prog) in bpf_map__init_kern_struct_ops()
886 prog->attach_btf_id = kern_type_id; in bpf_map__init_kern_struct_ops()
887 prog->expected_attach_type = kern_member_idx; in bpf_map__init_kern_struct_ops()
892 map->name, mname, prog->name, moff, in bpf_map__init_kern_struct_ops()
2504 static inline bool libbpf_prog_needs_vmlinux_btf(struct bpf_program *prog) in libbpf_prog_needs_vmlinux_btf() argument
2506 if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || in libbpf_prog_needs_vmlinux_btf()
2507 prog->type == BPF_PROG_TYPE_LSM) in libbpf_prog_needs_vmlinux_btf()
2513 if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd) in libbpf_prog_needs_vmlinux_btf()
2522 struct bpf_program *prog; in bpf_object__load_vmlinux_btf() local
2540 bpf_object__for_each_program(prog, obj) { in bpf_object__load_vmlinux_btf()
2541 if (!prog->load) in bpf_object__load_vmlinux_btf()
2543 if (libbpf_prog_needs_vmlinux_btf(prog)) { in bpf_object__load_vmlinux_btf()
3273 const struct bpf_program *prog) in prog_is_subprog() argument
3287 return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1; in prog_is_subprog()
3294 struct bpf_program *prog; in bpf_object__find_program_by_name() local
3296 bpf_object__for_each_program(prog, obj) { in bpf_object__find_program_by_name()
3297 if (prog_is_subprog(obj, prog)) in bpf_object__find_program_by_name()
3299 if (!strcmp(prog->name, name)) in bpf_object__find_program_by_name()
3300 return prog; in bpf_object__find_program_by_name()
3335 static int bpf_program__record_reloc(struct bpf_program *prog, in bpf_program__record_reloc() argument
3340 struct bpf_insn *insn = &prog->insns[insn_idx]; in bpf_program__record_reloc()
3341 size_t map_idx, nr_maps = prog->obj->nr_maps; in bpf_program__record_reloc()
3342 struct bpf_object *obj = prog->obj; in bpf_program__record_reloc()
3353 pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name); in bpf_program__record_reloc()
3360 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3365 prog->name, sym_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3376 prog->name, sym_name, insn_idx, insn->code); in bpf_program__record_reloc()
3392 prog->name, sym_name, sym_idx); in bpf_program__record_reloc()
3396 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
3405 prog->name, sym_name, shdr_idx); in bpf_program__record_reloc()
3416 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3426 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3432 prog->name, sym_sec_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3445 prog->name, sym_sec_name); in bpf_program__record_reloc()
3453 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3459 prog->name, sym_sec_name); in bpf_program__record_reloc()
3470 static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) in prog_contains_insn() argument
3472 return insn_idx >= prog->sec_insn_off && in prog_contains_insn()
3473 insn_idx < prog->sec_insn_off + prog->sec_insn_cnt; in prog_contains_insn()
3480 struct bpf_program *prog; in find_prog_by_sec_insn() local
3484 prog = &obj->programs[m]; in find_prog_by_sec_insn()
3486 if (prog->sec_idx < sec_idx || in find_prog_by_sec_insn()
3487 (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx)) in find_prog_by_sec_insn()
3495 prog = &obj->programs[l]; in find_prog_by_sec_insn()
3496 if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx)) in find_prog_by_sec_insn()
3497 return prog; in find_prog_by_sec_insn()
3507 struct bpf_program *prog; in bpf_object__collect_prog_relos() local
3556 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__collect_prog_relos()
3557 if (!prog) { in bpf_object__collect_prog_relos()
3563 relos = libbpf_reallocarray(prog->reloc_desc, in bpf_object__collect_prog_relos()
3564 prog->nr_reloc + 1, sizeof(*relos)); in bpf_object__collect_prog_relos()
3567 prog->reloc_desc = relos; in bpf_object__collect_prog_relos()
3570 insn_idx -= prog->sec_insn_off; in bpf_object__collect_prog_relos()
3571 err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc], in bpf_object__collect_prog_relos()
3576 prog->nr_reloc++; in bpf_object__collect_prog_relos()
3970 int ret, map, prog; in probe_prog_bind_map() local
3993 prog = bpf_load_program_xattr(&prg_attr, NULL, 0); in probe_prog_bind_map()
3994 if (prog < 0) { in probe_prog_bind_map()
3999 ret = bpf_prog_bind_map(prog, map, NULL); in probe_prog_bind_map()
4002 close(prog); in probe_prog_bind_map()
5102 static int bpf_core_calc_field_relo(const struct bpf_program *prog, in bpf_core_calc_field_relo() argument
5146 prog->name, relo->kind, relo->insn_off / 8); in bpf_core_calc_field_relo()
5168 prog->name, relo->kind, relo->insn_off / 8); in bpf_core_calc_field_relo()
5318 static int bpf_core_calc_relo(const struct bpf_program *prog, in bpf_core_calc_relo() argument
5336 err = bpf_core_calc_field_relo(prog, relo, local_spec, in bpf_core_calc_relo()
5339 err = err ?: bpf_core_calc_field_relo(prog, relo, targ_spec, in bpf_core_calc_relo()
5397 prog->name, relo_idx, core_relo_kind_str(relo->kind), in bpf_core_calc_relo()
5408 static void bpf_core_poison_insn(struct bpf_program *prog, int relo_idx, in bpf_core_poison_insn() argument
5412 prog->name, relo_idx, insn_idx); in bpf_core_poison_insn()
5468 static int bpf_core_patch_insn(struct bpf_program *prog, in bpf_core_patch_insn() argument
5485 insn_idx = insn_idx - prog->sec_insn_off; in bpf_core_patch_insn()
5486 insn = &prog->insns[insn_idx]; in bpf_core_patch_insn()
5495 bpf_core_poison_insn(prog, relo_idx, insn_idx + 1, insn + 1); in bpf_core_patch_insn()
5496 bpf_core_poison_insn(prog, relo_idx, insn_idx, insn); in bpf_core_patch_insn()
5510 prog->name, relo_idx, in bpf_core_patch_insn()
5517 prog->name, relo_idx, insn_idx, in bpf_core_patch_insn()
5525 prog->name, relo_idx, insn_idx, insn->off, orig_val, new_val); in bpf_core_patch_insn()
5530 prog->name, relo_idx, insn_idx, new_val); in bpf_core_patch_insn()
5536 prog->name, relo_idx, insn_idx); in bpf_core_patch_insn()
5543 prog->name, relo_idx, insn_idx, orig_val, new_val); in bpf_core_patch_insn()
5551 prog->name, relo_idx, insn_idx, insn_bytes_sz, res->orig_sz); in bpf_core_patch_insn()
5558 prog->name, relo_idx, insn_idx, res->new_sz); in bpf_core_patch_insn()
5564 prog->name, relo_idx, insn_idx, res->orig_sz, res->new_sz); in bpf_core_patch_insn()
5572 insn_idx + 1 >= prog->insns_cnt || in bpf_core_patch_insn()
5576 prog->name, relo_idx, insn_idx); in bpf_core_patch_insn()
5583 prog->name, relo_idx, in bpf_core_patch_insn()
5592 prog->name, relo_idx, insn_idx, in bpf_core_patch_insn()
5598 prog->name, relo_idx, insn_idx, insn->code, in bpf_core_patch_insn()
5722 static int bpf_core_apply_relo(struct bpf_program *prog, in bpf_core_apply_relo() argument
5755 prog->name, relo_idx, local_id, btf_kind_str(local_type), in bpf_core_apply_relo()
5761 pr_debug("prog '%s': relo #%d: kind <%s> (%d), spec is ", prog->name, in bpf_core_apply_relo()
5778 prog->name, relo_idx, core_relo_kind_str(relo->kind), relo->kind); in bpf_core_apply_relo()
5786 prog->name, relo_idx, local_id, btf_kind_str(local_type), in bpf_core_apply_relo()
5802 prog->name, relo_idx, i); in bpf_core_apply_relo()
5808 pr_debug("prog '%s': relo #%d: %s candidate #%d ", prog->name, in bpf_core_apply_relo()
5816 err = bpf_core_calc_relo(prog, relo, relo_idx, &local_spec, &cand_spec, &cand_res); in bpf_core_apply_relo()
5828 prog->name, relo_idx, cand_spec.bit_offset, in bpf_core_apply_relo()
5837 prog->name, relo_idx, in bpf_core_apply_relo()
5870 prog->name, relo_idx); in bpf_core_apply_relo()
5873 err = bpf_core_calc_relo(prog, relo, relo_idx, &local_spec, NULL, &targ_res); in bpf_core_apply_relo()
5880 err = bpf_core_patch_insn(prog, relo, relo_idx, &targ_res); in bpf_core_apply_relo()
5883 prog->name, relo_idx, relo->insn_off, err); in bpf_core_apply_relo()
5898 struct bpf_program *prog; in bpf_object__relocate_core() local
5934 prog = NULL; in bpf_object__relocate_core()
5937 prog = &obj->programs[i]; in bpf_object__relocate_core()
5941 if (!prog) { in bpf_object__relocate_core()
5945 sec_idx = prog->sec_idx; in bpf_object__relocate_core()
5952 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__relocate_core()
5953 if (!prog) { in bpf_object__relocate_core()
5969 if (!prog->load) in bpf_object__relocate_core()
5972 err = bpf_core_apply_relo(prog, rec, i, obj->btf, in bpf_object__relocate_core()
5976 prog->name, i, err); in bpf_object__relocate_core()
6001 bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_data() argument
6005 for (i = 0; i < prog->nr_reloc; i++) { in bpf_object__relocate_data()
6006 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_object__relocate_data()
6007 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate_data()
6044 prog->name, i, relo->type); in bpf_object__relocate_data()
6053 const struct bpf_program *prog, in adjust_prog_btf_ext_info() argument
6069 if (strcmp(sec_name, prog->sec_name) != 0) in adjust_prog_btf_ext_info()
6075 if (insn_off < prog->sec_insn_off) in adjust_prog_btf_ext_info()
6077 if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt) in adjust_prog_btf_ext_info()
6106 off_adj = prog->sub_insn_off - prog->sec_insn_off; in adjust_prog_btf_ext_info()
6124 const struct bpf_program *prog) in reloc_prog_func_and_line_info() argument
6137 if (main_prog != prog && !main_prog->func_info) in reloc_prog_func_and_line_info()
6140 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info, in reloc_prog_func_and_line_info()
6147 prog->name, err); in reloc_prog_func_and_line_info()
6155 pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name); in reloc_prog_func_and_line_info()
6160 prog->name); in reloc_prog_func_and_line_info()
6165 if (main_prog != prog && !main_prog->line_info) in reloc_prog_func_and_line_info()
6168 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info, in reloc_prog_func_and_line_info()
6175 prog->name, err); in reloc_prog_func_and_line_info()
6183 pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name); in reloc_prog_func_and_line_info()
6188 prog->name); in reloc_prog_func_and_line_info()
6203 static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) in find_prog_insn_relo() argument
6205 return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc, in find_prog_insn_relo()
6206 sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx); in find_prog_insn_relo()
6211 struct bpf_program *prog) in bpf_object__reloc_code() argument
6219 err = reloc_prog_func_and_line_info(obj, main_prog, prog); in bpf_object__reloc_code()
6223 for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) { in bpf_object__reloc_code()
6224 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
6228 relo = find_prog_insn_relo(prog, insn_idx); in bpf_object__reloc_code()
6231 prog->name, insn_idx, relo->type); in bpf_object__reloc_code()
6250 sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1; in bpf_object__reloc_code()
6257 prog->name); in bpf_object__reloc_code()
6297 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
6303 insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1; in bpf_object__reloc_code()
6309 prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off); in bpf_object__reloc_code()
6397 bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_calls() argument
6416 err = bpf_object__reloc_code(obj, prog, prog); in bpf_object__relocate_calls()
6427 struct bpf_program *prog; in bpf_object__relocate() local
6444 prog = &obj->programs[i]; in bpf_object__relocate()
6445 err = bpf_object__relocate_data(obj, prog); in bpf_object__relocate()
6448 prog->name, err); in bpf_object__relocate()
6458 prog = &obj->programs[i]; in bpf_object__relocate()
6462 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
6465 err = bpf_object__relocate_calls(obj, prog); in bpf_object__relocate()
6468 prog->name, err); in bpf_object__relocate()
6474 prog = &obj->programs[i]; in bpf_object__relocate()
6475 zfree(&prog->reloc_desc); in bpf_object__relocate()
6476 prog->nr_reloc = 0; in bpf_object__relocate()
6660 static int bpf_object__sanitize_prog(struct bpf_object* obj, struct bpf_program *prog) in bpf_object__sanitize_prog() argument
6662 struct bpf_insn *insn = prog->insns; in bpf_object__sanitize_prog()
6666 for (i = 0; i < prog->insns_cnt; i++, insn++) { in bpf_object__sanitize_prog()
6693 load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt, in load_program() argument
6706 load_attr.prog_type = prog->type; in load_program()
6708 if (!kernel_supports(FEAT_EXP_ATTACH_TYPE) && prog->sec_def && in load_program()
6709 prog->sec_def->is_exp_attach_type_optional) in load_program()
6712 load_attr.expected_attach_type = prog->expected_attach_type; in load_program()
6714 load_attr.name = prog->name; in load_program()
6718 if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || in load_program()
6719 prog->type == BPF_PROG_TYPE_LSM) { in load_program()
6720 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6721 } else if (prog->type == BPF_PROG_TYPE_TRACING || in load_program()
6722 prog->type == BPF_PROG_TYPE_EXT) { in load_program()
6723 load_attr.attach_prog_fd = prog->attach_prog_fd; in load_program()
6724 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6727 load_attr.prog_ifindex = prog->prog_ifindex; in load_program()
6730 btf_fd = bpf_object__btf_fd(prog->obj); in load_program()
6733 load_attr.func_info = prog->func_info; in load_program()
6734 load_attr.func_info_rec_size = prog->func_info_rec_size; in load_program()
6735 load_attr.func_info_cnt = prog->func_info_cnt; in load_program()
6736 load_attr.line_info = prog->line_info; in load_program()
6737 load_attr.line_info_rec_size = prog->line_info_rec_size; in load_program()
6738 load_attr.line_info_cnt = prog->line_info_cnt; in load_program()
6740 load_attr.log_level = prog->log_level; in load_program()
6741 load_attr.prog_flags = prog->prog_flags; in load_program()
6758 if (prog->obj->rodata_map_idx >= 0 && in load_program()
6761 &prog->obj->maps[prog->obj->rodata_map_idx]; in load_program()
6766 prog->name, cp); in load_program()
6816 static int libbpf_find_attach_btf_id(struct bpf_program *prog);
6818 int bpf_program__load(struct bpf_program *prog, char *license, __u32 kern_ver) in bpf_program__load() argument
6822 if (prog->obj->loaded) { in bpf_program__load()
6823 pr_warn("prog '%s': can't load after object was loaded\n", prog->name); in bpf_program__load()
6827 if ((prog->type == BPF_PROG_TYPE_TRACING || in bpf_program__load()
6828 prog->type == BPF_PROG_TYPE_LSM || in bpf_program__load()
6829 prog->type == BPF_PROG_TYPE_EXT) && !prog->attach_btf_id) { in bpf_program__load()
6830 btf_id = libbpf_find_attach_btf_id(prog); in bpf_program__load()
6833 prog->attach_btf_id = btf_id; in bpf_program__load()
6836 if (prog->instances.nr < 0 || !prog->instances.fds) { in bpf_program__load()
6837 if (prog->preprocessor) { in bpf_program__load()
6839 prog->name); in bpf_program__load()
6843 prog->instances.fds = malloc(sizeof(int)); in bpf_program__load()
6844 if (!prog->instances.fds) { in bpf_program__load()
6848 prog->instances.nr = 1; in bpf_program__load()
6849 prog->instances.fds[0] = -1; in bpf_program__load()
6852 if (!prog->preprocessor) { in bpf_program__load()
6853 if (prog->instances.nr != 1) { in bpf_program__load()
6855 prog->name, prog->instances.nr); in bpf_program__load()
6857 err = load_program(prog, prog->insns, prog->insns_cnt, in bpf_program__load()
6860 prog->instances.fds[0] = fd; in bpf_program__load()
6864 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__load()
6866 bpf_program_prep_t preprocessor = prog->preprocessor; in bpf_program__load()
6869 err = preprocessor(prog, i, prog->insns, in bpf_program__load()
6870 prog->insns_cnt, &result); in bpf_program__load()
6873 i, prog->name); in bpf_program__load()
6879 i, prog->name); in bpf_program__load()
6880 prog->instances.fds[i] = -1; in bpf_program__load()
6886 err = load_program(prog, result.new_insn_ptr, in bpf_program__load()
6890 i, prog->name); in bpf_program__load()
6896 prog->instances.fds[i] = fd; in bpf_program__load()
6900 pr_warn("failed to load program '%s'\n", prog->name); in bpf_program__load()
6901 zfree(&prog->insns); in bpf_program__load()
6902 prog->insns_cnt = 0; in bpf_program__load()
6909 struct bpf_program *prog; in bpf_object__load_progs() local
6914 prog = &obj->programs[i]; in bpf_object__load_progs()
6915 err = bpf_object__sanitize_prog(obj, prog); in bpf_object__load_progs()
6921 prog = &obj->programs[i]; in bpf_object__load_progs()
6922 if (prog_is_subprog(obj, prog)) in bpf_object__load_progs()
6924 if (!prog->load) { in bpf_object__load_progs()
6925 pr_debug("prog '%s': skipped loading\n", prog->name); in bpf_object__load_progs()
6928 prog->log_level |= log_level; in bpf_object__load_progs()
6929 err = bpf_program__load(prog, obj->license, obj->kern_version); in bpf_object__load_progs()
6943 struct bpf_program *prog; in __bpf_object__open() local
6993 bpf_object__for_each_program(prog, obj) { in __bpf_object__open()
6994 prog->sec_def = find_sec_def(prog->sec_name); in __bpf_object__open()
6995 if (!prog->sec_def) in __bpf_object__open()
6999 if (prog->sec_def->is_sleepable) in __bpf_object__open()
7000 prog->prog_flags |= BPF_F_SLEEPABLE; in __bpf_object__open()
7001 bpf_program__set_type(prog, prog->sec_def->prog_type); in __bpf_object__open()
7002 bpf_program__set_expected_attach_type(prog, in __bpf_object__open()
7003 prog->sec_def->expected_attach_type); in __bpf_object__open()
7005 if (prog->sec_def->prog_type == BPF_PROG_TYPE_TRACING || in __bpf_object__open()
7006 prog->sec_def->prog_type == BPF_PROG_TYPE_EXT) in __bpf_object__open()
7007 prog->attach_prog_fd = OPTS_GET(opts, attach_prog_fd, 0); in __bpf_object__open()
7424 int bpf_program__pin_instance(struct bpf_program *prog, const char *path, in bpf_program__pin_instance() argument
7438 if (prog == NULL) { in bpf_program__pin_instance()
7443 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program__pin_instance()
7445 instance, prog->name, prog->instances.nr); in bpf_program__pin_instance()
7449 if (bpf_obj_pin(prog->instances.fds[instance], path)) { in bpf_program__pin_instance()
7460 int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, in bpf_program__unpin_instance() argument
7469 if (prog == NULL) { in bpf_program__unpin_instance()
7474 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program__unpin_instance()
7476 instance, prog->name, prog->instances.nr); in bpf_program__unpin_instance()
7488 int bpf_program__pin(struct bpf_program *prog, const char *path) in bpf_program__pin() argument
7500 if (prog == NULL) { in bpf_program__pin()
7505 if (prog->instances.nr <= 0) { in bpf_program__pin()
7506 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__pin()
7510 if (prog->instances.nr == 1) { in bpf_program__pin()
7512 return bpf_program__pin_instance(prog, path, 0); in bpf_program__pin()
7515 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__pin()
7528 err = bpf_program__pin_instance(prog, buf, i); in bpf_program__pin()
7546 bpf_program__unpin_instance(prog, buf, i); in bpf_program__pin()
7554 int bpf_program__unpin(struct bpf_program *prog, const char *path) in bpf_program__unpin() argument
7562 if (prog == NULL) { in bpf_program__unpin()
7567 if (prog->instances.nr <= 0) { in bpf_program__unpin()
7568 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__unpin()
7572 if (prog->instances.nr == 1) { in bpf_program__unpin()
7574 return bpf_program__unpin_instance(prog, path, 0); in bpf_program__unpin()
7577 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__unpin()
7587 err = bpf_program__unpin_instance(prog, buf, i); in bpf_program__unpin()
7821 struct bpf_program *prog; in bpf_object__pin_programs() local
7832 bpf_object__for_each_program(prog, obj) { in bpf_object__pin_programs()
7837 prog->pin_name); in bpf_object__pin_programs()
7846 err = bpf_program__pin(prog, buf); in bpf_object__pin_programs()
7854 while ((prog = bpf_program__prev(prog, obj))) { in bpf_object__pin_programs()
7859 prog->pin_name); in bpf_object__pin_programs()
7865 bpf_program__unpin(prog, buf); in bpf_object__pin_programs()
7873 struct bpf_program *prog; in bpf_object__unpin_programs() local
7879 bpf_object__for_each_program(prog, obj) { in bpf_object__unpin_programs()
7884 prog->pin_name); in bpf_object__unpin_programs()
7890 err = bpf_program__unpin(prog, buf); in bpf_object__unpin_programs()
8068 struct bpf_program *prog = prev; in bpf_program__next() local
8071 prog = __bpf_program__iter(prog, obj, true); in bpf_program__next()
8072 } while (prog && prog_is_subprog(obj, prog)); in bpf_program__next()
8074 return prog; in bpf_program__next()
8080 struct bpf_program *prog = next; in bpf_program__prev() local
8083 prog = __bpf_program__iter(prog, obj, false); in bpf_program__prev()
8084 } while (prog && prog_is_subprog(obj, prog)); in bpf_program__prev()
8086 return prog; in bpf_program__prev()
8089 int bpf_program__set_priv(struct bpf_program *prog, void *priv, in bpf_program__set_priv() argument
8092 if (prog->priv && prog->clear_priv) in bpf_program__set_priv()
8093 prog->clear_priv(prog, prog->priv); in bpf_program__set_priv()
8095 prog->priv = priv; in bpf_program__set_priv()
8096 prog->clear_priv = clear_priv; in bpf_program__set_priv()
8100 void *bpf_program__priv(const struct bpf_program *prog) in bpf_program__priv() argument
8102 return prog ? prog->priv : ERR_PTR(-EINVAL); in bpf_program__priv()
8105 void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) in bpf_program__set_ifindex() argument
8107 prog->prog_ifindex = ifindex; in bpf_program__set_ifindex()
8110 const char *bpf_program__name(const struct bpf_program *prog) in bpf_program__name() argument
8112 return prog->name; in bpf_program__name()
8115 const char *bpf_program__section_name(const struct bpf_program *prog) in bpf_program__section_name() argument
8117 return prog->sec_name; in bpf_program__section_name()
8120 const char *bpf_program__title(const struct bpf_program *prog, bool needs_copy) in bpf_program__title() argument
8124 title = prog->sec_name; in bpf_program__title()
8136 bool bpf_program__autoload(const struct bpf_program *prog) in bpf_program__autoload() argument
8138 return prog->load; in bpf_program__autoload()
8141 int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) in bpf_program__set_autoload() argument
8143 if (prog->obj->loaded) in bpf_program__set_autoload()
8146 prog->load = autoload; in bpf_program__set_autoload()
8150 int bpf_program__fd(const struct bpf_program *prog) in bpf_program__fd() argument
8152 return bpf_program__nth_fd(prog, 0); in bpf_program__fd()
8155 size_t bpf_program__size(const struct bpf_program *prog) in bpf_program__size() argument
8157 return prog->insns_cnt * BPF_INSN_SZ; in bpf_program__size()
8160 int bpf_program__set_prep(struct bpf_program *prog, int nr_instances, in bpf_program__set_prep() argument
8168 if (prog->instances.nr > 0 || prog->instances.fds) { in bpf_program__set_prep()
8182 prog->instances.nr = nr_instances; in bpf_program__set_prep()
8183 prog->instances.fds = instances_fds; in bpf_program__set_prep()
8184 prog->preprocessor = prep; in bpf_program__set_prep()
8188 int bpf_program__nth_fd(const struct bpf_program *prog, int n) in bpf_program__nth_fd() argument
8192 if (!prog) in bpf_program__nth_fd()
8195 if (n >= prog->instances.nr || n < 0) { in bpf_program__nth_fd()
8197 n, prog->name, prog->instances.nr); in bpf_program__nth_fd()
8201 fd = prog->instances.fds[n]; in bpf_program__nth_fd()
8204 n, prog->name); in bpf_program__nth_fd()
8211 enum bpf_prog_type bpf_program__get_type(struct bpf_program *prog) in bpf_program__get_type() argument
8213 return prog->type; in bpf_program__get_type()
8216 void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) in bpf_program__set_type() argument
8218 prog->type = type; in bpf_program__set_type()
8221 static bool bpf_program__is_type(const struct bpf_program *prog, in bpf_program__is_type() argument
8224 return prog ? (prog->type == type) : false; in bpf_program__is_type()
8228 int bpf_program__set_##NAME(struct bpf_program *prog) \
8230 if (!prog) \
8232 bpf_program__set_type(prog, TYPE); \
8236 bool bpf_program__is_##NAME(const struct bpf_program *prog) \
8238 return bpf_program__is_type(prog, TYPE); \
8256 bpf_program__get_expected_attach_type(struct bpf_program *prog) in bpf_program__get_expected_attach_type() argument
8258 return prog->expected_attach_type; in bpf_program__get_expected_attach_type()
8261 void bpf_program__set_expected_attach_type(struct bpf_program *prog, in bpf_program__set_expected_attach_type() argument
8264 prog->expected_attach_type = type; in bpf_program__set_expected_attach_type()
8307 struct bpf_program *prog);
8309 struct bpf_program *prog);
8311 struct bpf_program *prog);
8313 struct bpf_program *prog);
8315 struct bpf_program *prog);
8317 struct bpf_program *prog);
8559 struct bpf_program *prog; in bpf_object__collect_st_ops_relos() local
8631 prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx); in bpf_object__collect_st_ops_relos()
8632 if (!prog) { in bpf_object__collect_st_ops_relos()
8638 if (prog->type == BPF_PROG_TYPE_UNSPEC) { in bpf_object__collect_st_ops_relos()
8641 sec_def = find_sec_def(prog->sec_name); in bpf_object__collect_st_ops_relos()
8645 prog->type = sec_def->prog_type; in bpf_object__collect_st_ops_relos()
8649 prog->type = BPF_PROG_TYPE_STRUCT_OPS; in bpf_object__collect_st_ops_relos()
8650 prog->attach_btf_id = st_ops->type_id; in bpf_object__collect_st_ops_relos()
8651 prog->expected_attach_type = member_idx; in bpf_object__collect_st_ops_relos()
8652 } else if (prog->type != BPF_PROG_TYPE_STRUCT_OPS || in bpf_object__collect_st_ops_relos()
8653 prog->attach_btf_id != st_ops->type_id || in bpf_object__collect_st_ops_relos()
8654 prog->expected_attach_type != member_idx) { in bpf_object__collect_st_ops_relos()
8657 st_ops->progs[member_idx] = prog; in bpf_object__collect_st_ops_relos()
8664 map->name, prog->name, prog->sec_name, prog->type, in bpf_object__collect_st_ops_relos()
8665 prog->attach_btf_id, prog->expected_attach_type, name); in bpf_object__collect_st_ops_relos()
8764 static int libbpf_find_attach_btf_id(struct bpf_program *prog) in libbpf_find_attach_btf_id() argument
8766 enum bpf_attach_type attach_type = prog->expected_attach_type; in libbpf_find_attach_btf_id()
8767 __u32 attach_prog_fd = prog->attach_prog_fd; in libbpf_find_attach_btf_id()
8768 const char *name = prog->sec_name; in libbpf_find_attach_btf_id()
8783 err = __find_vmlinux_btf_id(prog->obj->btf_vmlinux, in libbpf_find_attach_btf_id()
9069 struct bpf_program *prog, *first_prog = NULL; in bpf_prog_load_xattr() local
9086 bpf_object__for_each_program(prog, obj) { in bpf_prog_load_xattr()
9094 bpf_program__set_type(prog, attr->prog_type); in bpf_prog_load_xattr()
9095 bpf_program__set_expected_attach_type(prog, in bpf_prog_load_xattr()
9098 if (bpf_program__get_type(prog) == BPF_PROG_TYPE_UNSPEC) { in bpf_prog_load_xattr()
9107 prog->prog_ifindex = attr->ifindex; in bpf_prog_load_xattr()
9108 prog->log_level = attr->log_level; in bpf_prog_load_xattr()
9109 prog->prog_flags |= attr->prog_flags; in bpf_prog_load_xattr()
9111 first_prog = prog; in bpf_prog_load_xattr()
9145 int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog) in bpf_link__update_program() argument
9147 return bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL); in bpf_link__update_program()
9287 struct bpf_link *bpf_program__attach_perf_event(struct bpf_program *prog, in bpf_program__attach_perf_event() argument
9296 prog->name, pfd); in bpf_program__attach_perf_event()
9299 prog_fd = bpf_program__fd(prog); in bpf_program__attach_perf_event()
9302 prog->name); in bpf_program__attach_perf_event()
9316 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event()
9319 prog->name, pfd); in bpf_program__attach_perf_event()
9326 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event()
9437 struct bpf_link *bpf_program__attach_kprobe(struct bpf_program *prog, in bpf_program__attach_kprobe() argument
9449 prog->name, retprobe ? "kretprobe" : "kprobe", func_name, in bpf_program__attach_kprobe()
9453 link = bpf_program__attach_perf_event(prog, pfd); in bpf_program__attach_kprobe()
9458 prog->name, retprobe ? "kretprobe" : "kprobe", func_name, in bpf_program__attach_kprobe()
9466 struct bpf_program *prog) in attach_kprobe() argument
9471 func_name = prog->sec_name + sec->len; in attach_kprobe()
9474 return bpf_program__attach_kprobe(prog, retprobe, func_name); in attach_kprobe()
9477 struct bpf_link *bpf_program__attach_uprobe(struct bpf_program *prog, in bpf_program__attach_uprobe() argument
9490 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe()
9495 link = bpf_program__attach_perf_event(prog, pfd); in bpf_program__attach_uprobe()
9500 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe()
9558 struct bpf_link *bpf_program__attach_tracepoint(struct bpf_program *prog, in bpf_program__attach_tracepoint() argument
9569 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint()
9573 link = bpf_program__attach_perf_event(prog, pfd); in bpf_program__attach_tracepoint()
9578 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint()
9586 struct bpf_program *prog) in attach_tp() argument
9591 sec_name = strdup(prog->sec_name); in attach_tp()
9605 link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name); in attach_tp()
9611 struct bpf_link *bpf_program__attach_raw_tracepoint(struct bpf_program *prog, in bpf_program__attach_raw_tracepoint() argument
9618 prog_fd = bpf_program__fd(prog); in bpf_program__attach_raw_tracepoint()
9620 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_raw_tracepoint()
9634 prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_raw_tracepoint()
9642 struct bpf_program *prog) in attach_raw_tp() argument
9644 const char *tp_name = prog->sec_name + sec->len; in attach_raw_tp()
9646 return bpf_program__attach_raw_tracepoint(prog, tp_name); in attach_raw_tp()
9650 static struct bpf_link *bpf_program__attach_btf_id(struct bpf_program *prog) in bpf_program__attach_btf_id() argument
9656 prog_fd = bpf_program__fd(prog); in bpf_program__attach_btf_id()
9658 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_btf_id()
9672 prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_btf_id()
9679 struct bpf_link *bpf_program__attach_trace(struct bpf_program *prog) in bpf_program__attach_trace() argument
9681 return bpf_program__attach_btf_id(prog); in bpf_program__attach_trace()
9684 struct bpf_link *bpf_program__attach_lsm(struct bpf_program *prog) in bpf_program__attach_lsm() argument
9686 return bpf_program__attach_btf_id(prog); in bpf_program__attach_lsm()
9690 struct bpf_program *prog) in attach_trace() argument
9692 return bpf_program__attach_trace(prog); in attach_trace()
9696 struct bpf_program *prog) in attach_lsm() argument
9698 return bpf_program__attach_lsm(prog); in attach_lsm()
9702 struct bpf_program *prog) in attach_iter() argument
9704 return bpf_program__attach_iter(prog, NULL); in attach_iter()
9708 bpf_program__attach_fd(struct bpf_program *prog, int target_fd, int btf_id, in bpf_program__attach_fd() argument
9718 prog_fd = bpf_program__fd(prog); in bpf_program__attach_fd()
9720 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_fd()
9729 attach_type = bpf_program__get_expected_attach_type(prog); in bpf_program__attach_fd()
9735 prog->name, target_name, in bpf_program__attach_fd()
9744 bpf_program__attach_cgroup(struct bpf_program *prog, int cgroup_fd) in bpf_program__attach_cgroup() argument
9746 return bpf_program__attach_fd(prog, cgroup_fd, 0, "cgroup"); in bpf_program__attach_cgroup()
9750 bpf_program__attach_netns(struct bpf_program *prog, int netns_fd) in bpf_program__attach_netns() argument
9752 return bpf_program__attach_fd(prog, netns_fd, 0, "netns"); in bpf_program__attach_netns()
9755 struct bpf_link *bpf_program__attach_xdp(struct bpf_program *prog, int ifindex) in bpf_program__attach_xdp() argument
9758 return bpf_program__attach_fd(prog, ifindex, 0, "xdp"); in bpf_program__attach_xdp()
9761 struct bpf_link *bpf_program__attach_freplace(struct bpf_program *prog, in bpf_program__attach_freplace() argument
9769 prog->name); in bpf_program__attach_freplace()
9773 if (prog->type != BPF_PROG_TYPE_EXT) { in bpf_program__attach_freplace()
9775 prog->name); in bpf_program__attach_freplace()
9784 return bpf_program__attach_fd(prog, target_fd, btf_id, "freplace"); in bpf_program__attach_freplace()
9789 return bpf_program__attach_trace(prog); in bpf_program__attach_freplace()
9794 bpf_program__attach_iter(struct bpf_program *prog, in bpf_program__attach_iter() argument
9809 prog_fd = bpf_program__fd(prog); in bpf_program__attach_iter()
9811 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_iter()
9826 prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); in bpf_program__attach_iter()
9833 struct bpf_link *bpf_program__attach(struct bpf_program *prog) in bpf_program__attach() argument
9837 sec_def = find_sec_def(prog->sec_name); in bpf_program__attach()
9841 return sec_def->attach_fn(sec_def, prog); in bpf_program__attach()
9870 struct bpf_program *prog = st_ops->progs[i]; in bpf_map__attach_struct_ops() local
9874 if (!prog) in bpf_map__attach_struct_ops()
9877 prog_fd = bpf_program__fd(prog); in bpf_map__attach_struct_ops()
10658 int bpf_program__set_attach_target(struct bpf_program *prog, in bpf_program__set_attach_target() argument
10664 if (!prog || attach_prog_fd < 0 || !attach_func_name) in bpf_program__set_attach_target()
10672 prog->expected_attach_type); in bpf_program__set_attach_target()
10677 prog->attach_btf_id = btf_id; in bpf_program__set_attach_target()
10678 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
10832 struct bpf_program **prog = s->progs[i].prog; in bpf_object__open_skeleton() local
10835 *prog = bpf_object__find_program_by_name(obj, name); in bpf_object__open_skeleton()
10836 if (!*prog) { in bpf_object__open_skeleton()
10903 struct bpf_program *prog = *s->progs[i].prog; in bpf_object__attach_skeleton() local
10907 if (!prog->load) in bpf_object__attach_skeleton()
10910 sec_def = find_sec_def(prog->sec_name); in bpf_object__attach_skeleton()
10914 *link = sec_def->attach_fn(sec_def, prog); in bpf_object__attach_skeleton()
10917 bpf_program__name(prog), PTR_ERR(*link)); in bpf_object__attach_skeleton()