Lines Matching refs:prog
73 static bool prog_is_subprog(const struct bpf_object *obj, const struct bpf_program *prog);
223 typedef int (*init_fn_t)(struct bpf_program *prog, long cookie);
224 typedef int (*preload_fn_t)(struct bpf_program *prog, struct bpf_prog_load_params *attr, long cooki…
225 typedef struct bpf_link *(*attach_fn_t)(const struct bpf_program *prog, long cookie);
569 void bpf_program__unload(struct bpf_program *prog) in bpf_program__unload() argument
573 if (!prog) in bpf_program__unload()
580 if (prog->instances.nr > 0) { in bpf_program__unload()
581 for (i = 0; i < prog->instances.nr; i++) in bpf_program__unload()
582 zclose(prog->instances.fds[i]); in bpf_program__unload()
583 } else if (prog->instances.nr != -1) { in bpf_program__unload()
585 prog->instances.nr); in bpf_program__unload()
588 prog->instances.nr = -1; in bpf_program__unload()
589 zfree(&prog->instances.fds); in bpf_program__unload()
591 zfree(&prog->func_info); in bpf_program__unload()
592 zfree(&prog->line_info); in bpf_program__unload()
595 static void bpf_program__exit(struct bpf_program *prog) in bpf_program__exit() argument
597 if (!prog) in bpf_program__exit()
600 if (prog->clear_priv) in bpf_program__exit()
601 prog->clear_priv(prog, prog->priv); in bpf_program__exit()
603 prog->priv = NULL; in bpf_program__exit()
604 prog->clear_priv = NULL; in bpf_program__exit()
606 bpf_program__unload(prog); in bpf_program__exit()
607 zfree(&prog->name); in bpf_program__exit()
608 zfree(&prog->sec_name); in bpf_program__exit()
609 zfree(&prog->pin_name); in bpf_program__exit()
610 zfree(&prog->insns); in bpf_program__exit()
611 zfree(&prog->reloc_desc); in bpf_program__exit()
613 prog->nr_reloc = 0; in bpf_program__exit()
614 prog->insns_cnt = 0; in bpf_program__exit()
615 prog->sec_idx = -1; in bpf_program__exit()
618 static char *__bpf_program__pin_name(struct bpf_program *prog) in __bpf_program__pin_name() argument
623 name = strdup(prog->name); in __bpf_program__pin_name()
625 name = strdup(prog->sec_name); in __bpf_program__pin_name()
659 bpf_object__init_prog(struct bpf_object *obj, struct bpf_program *prog, in bpf_object__init_prog() argument
669 memset(prog, 0, sizeof(*prog)); in bpf_object__init_prog()
670 prog->obj = obj; in bpf_object__init_prog()
672 prog->sec_idx = sec_idx; in bpf_object__init_prog()
673 prog->sec_insn_off = sec_off / BPF_INSN_SZ; in bpf_object__init_prog()
674 prog->sec_insn_cnt = insn_data_sz / BPF_INSN_SZ; in bpf_object__init_prog()
676 prog->insns_cnt = prog->sec_insn_cnt; in bpf_object__init_prog()
678 prog->type = BPF_PROG_TYPE_UNSPEC; in bpf_object__init_prog()
679 prog->load = true; in bpf_object__init_prog()
681 prog->instances.fds = NULL; in bpf_object__init_prog()
682 prog->instances.nr = -1; in bpf_object__init_prog()
684 prog->sec_name = strdup(sec_name); in bpf_object__init_prog()
685 if (!prog->sec_name) in bpf_object__init_prog()
688 prog->name = strdup(name); in bpf_object__init_prog()
689 if (!prog->name) in bpf_object__init_prog()
692 prog->pin_name = __bpf_program__pin_name(prog); in bpf_object__init_prog()
693 if (!prog->pin_name) in bpf_object__init_prog()
696 prog->insns = malloc(insn_data_sz); in bpf_object__init_prog()
697 if (!prog->insns) in bpf_object__init_prog()
699 memcpy(prog->insns, insn_data, insn_data_sz); in bpf_object__init_prog()
704 bpf_program__exit(prog); in bpf_object__init_prog()
713 struct bpf_program *prog, *progs; in bpf_object__add_programs() local
770 prog = &progs[nr_progs]; in bpf_object__add_programs()
772 err = bpf_object__init_prog(obj, prog, name, sec_idx, sec_name, in bpf_object__add_programs()
785 prog->mark_btf_static = true; in bpf_object__add_programs()
983 struct bpf_program *prog; in bpf_map__init_kern_struct_ops() local
985 prog = st_ops->progs[i]; in bpf_map__init_kern_struct_ops()
986 if (!prog) in bpf_map__init_kern_struct_ops()
1003 prog->attach_btf_id = kern_type_id; in bpf_map__init_kern_struct_ops()
1004 prog->expected_attach_type = kern_member_idx; in bpf_map__init_kern_struct_ops()
1009 map->name, mname, prog->name, moff, in bpf_map__init_kern_struct_ops()
2830 static bool prog_needs_vmlinux_btf(struct bpf_program *prog) in prog_needs_vmlinux_btf() argument
2832 if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || in prog_needs_vmlinux_btf()
2833 prog->type == BPF_PROG_TYPE_LSM) in prog_needs_vmlinux_btf()
2839 if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd) in prog_needs_vmlinux_btf()
2847 struct bpf_program *prog; in obj_needs_vmlinux_btf() local
2865 bpf_object__for_each_program(prog, obj) { in obj_needs_vmlinux_btf()
2866 if (!prog->load) in obj_needs_vmlinux_btf()
2868 if (prog_needs_vmlinux_btf(prog)) in obj_needs_vmlinux_btf()
2923 struct bpf_program *prog = &obj->programs[i]; in bpf_object__sanitize_and_load_btf() local
2928 if (!prog->mark_btf_static || !prog_is_subprog(obj, prog)) in bpf_object__sanitize_and_load_btf()
2938 if (strcmp(name, prog->name) != 0) in bpf_object__sanitize_and_load_btf()
3767 const struct bpf_program *prog) in prog_is_subprog() argument
3781 return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1; in prog_is_subprog()
3788 struct bpf_program *prog; in bpf_object__find_program_by_name() local
3790 bpf_object__for_each_program(prog, obj) { in bpf_object__find_program_by_name()
3791 if (prog_is_subprog(obj, prog)) in bpf_object__find_program_by_name()
3793 if (!strcmp(prog->name, name)) in bpf_object__find_program_by_name()
3794 return prog; in bpf_object__find_program_by_name()
3837 static int bpf_program__record_reloc(struct bpf_program *prog, in bpf_program__record_reloc() argument
3842 struct bpf_insn *insn = &prog->insns[insn_idx]; in bpf_program__record_reloc()
3843 size_t map_idx, nr_maps = prog->obj->nr_maps; in bpf_program__record_reloc()
3844 struct bpf_object *obj = prog->obj; in bpf_program__record_reloc()
3852 prog->name, sym_name, insn_idx, insn->code); in bpf_program__record_reloc()
3868 prog->name, sym_name, sym_idx); in bpf_program__record_reloc()
3872 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
3885 pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name); in bpf_program__record_reloc()
3892 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3897 prog->name, sym_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3908 prog->name, sym_name, shdr_idx); in bpf_program__record_reloc()
3919 prog->name, sym_name, (size_t)sym->st_value, insn->imm); in bpf_program__record_reloc()
3936 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3946 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3952 prog->name, sym_sec_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3965 prog->name, sym_sec_name); in bpf_program__record_reloc()
3973 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3979 prog->name, sym_sec_name); in bpf_program__record_reloc()
3990 static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) in prog_contains_insn() argument
3992 return insn_idx >= prog->sec_insn_off && in prog_contains_insn()
3993 insn_idx < prog->sec_insn_off + prog->sec_insn_cnt; in prog_contains_insn()
4000 struct bpf_program *prog; in find_prog_by_sec_insn() local
4004 prog = &obj->programs[m]; in find_prog_by_sec_insn()
4006 if (prog->sec_idx < sec_idx || in find_prog_by_sec_insn()
4007 (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx)) in find_prog_by_sec_insn()
4015 prog = &obj->programs[l]; in find_prog_by_sec_insn()
4016 if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx)) in find_prog_by_sec_insn()
4017 return prog; in find_prog_by_sec_insn()
4026 struct bpf_program *prog; in bpf_object__collect_prog_relos() local
4084 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__collect_prog_relos()
4085 if (!prog) { in bpf_object__collect_prog_relos()
4091 relos = libbpf_reallocarray(prog->reloc_desc, in bpf_object__collect_prog_relos()
4092 prog->nr_reloc + 1, sizeof(*relos)); in bpf_object__collect_prog_relos()
4095 prog->reloc_desc = relos; in bpf_object__collect_prog_relos()
4098 insn_idx -= prog->sec_insn_off; in bpf_object__collect_prog_relos()
4099 err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc], in bpf_object__collect_prog_relos()
4104 prog->nr_reloc++; in bpf_object__collect_prog_relos()
4537 int ret, map, prog; in probe_prog_bind_map() local
4560 prog = bpf_load_program_xattr(&prg_attr, NULL, 0); in probe_prog_bind_map()
4561 if (prog < 0) { in probe_prog_bind_map()
4566 ret = bpf_prog_bind_map(prog, map, NULL); in probe_prog_bind_map()
4569 close(prog); in probe_prog_bind_map()
5402 static int bpf_core_apply_relo(struct bpf_program *prog, in bpf_core_apply_relo() argument
5410 const char *prog_name = prog->name; in bpf_core_apply_relo()
5424 insn_idx = insn_idx - prog->sec_insn_off; in bpf_core_apply_relo()
5425 if (insn_idx >= prog->insns_cnt) in bpf_core_apply_relo()
5427 insn = &prog->insns[insn_idx]; in bpf_core_apply_relo()
5437 if (prog->obj->gen_loader) { in bpf_core_apply_relo()
5439 prog - prog->obj->programs, relo->insn_off / 8, in bpf_core_apply_relo()
5446 cands = bpf_core_find_cands(prog->obj, local_btf, local_id); in bpf_core_apply_relo()
5471 struct bpf_program *prog; in bpf_object__relocate_core() local
5506 prog = NULL; in bpf_object__relocate_core()
5508 prog = &obj->programs[i]; in bpf_object__relocate_core()
5509 if (strcmp(prog->sec_name, sec_name) == 0) in bpf_object__relocate_core()
5512 if (!prog) { in bpf_object__relocate_core()
5516 sec_idx = prog->sec_idx; in bpf_object__relocate_core()
5523 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__relocate_core()
5524 if (!prog) { in bpf_object__relocate_core()
5533 if (!prog->load) in bpf_object__relocate_core()
5536 err = bpf_core_apply_relo(prog, rec, i, obj->btf, cand_cache); in bpf_object__relocate_core()
5539 prog->name, i, err); in bpf_object__relocate_core()
5565 bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_data() argument
5569 for (i = 0; i < prog->nr_reloc; i++) { in bpf_object__relocate_data()
5570 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_object__relocate_data()
5571 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate_data()
5630 prog->name, i); in bpf_object__relocate_data()
5640 prog->name, i, relo->type); in bpf_object__relocate_data()
5649 const struct bpf_program *prog, in adjust_prog_btf_ext_info() argument
5665 if (strcmp(sec_name, prog->sec_name) != 0) in adjust_prog_btf_ext_info()
5671 if (insn_off < prog->sec_insn_off) in adjust_prog_btf_ext_info()
5673 if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt) in adjust_prog_btf_ext_info()
5702 off_adj = prog->sub_insn_off - prog->sec_insn_off; in adjust_prog_btf_ext_info()
5720 const struct bpf_program *prog) in reloc_prog_func_and_line_info() argument
5733 if (main_prog != prog && !main_prog->func_info) in reloc_prog_func_and_line_info()
5736 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info, in reloc_prog_func_and_line_info()
5743 prog->name, err); in reloc_prog_func_and_line_info()
5751 pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name); in reloc_prog_func_and_line_info()
5756 prog->name); in reloc_prog_func_and_line_info()
5761 if (main_prog != prog && !main_prog->line_info) in reloc_prog_func_and_line_info()
5764 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info, in reloc_prog_func_and_line_info()
5771 prog->name, err); in reloc_prog_func_and_line_info()
5779 pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name); in reloc_prog_func_and_line_info()
5784 prog->name); in reloc_prog_func_and_line_info()
5799 static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) in find_prog_insn_relo() argument
5801 return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc, in find_prog_insn_relo()
5802 sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx); in find_prog_insn_relo()
5831 struct bpf_program *prog) in bpf_object__reloc_code() argument
5839 err = reloc_prog_func_and_line_info(obj, main_prog, prog); in bpf_object__reloc_code()
5843 for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) { in bpf_object__reloc_code()
5844 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
5848 relo = find_prog_insn_relo(prog, insn_idx); in bpf_object__reloc_code()
5856 prog->name, insn_idx, relo->type); in bpf_object__reloc_code()
5880 prog->name, insn_idx); in bpf_object__reloc_code()
5889 sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1; in bpf_object__reloc_code()
5896 prog->name); in bpf_object__reloc_code()
5940 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
5946 insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1; in bpf_object__reloc_code()
5949 prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off); in bpf_object__reloc_code()
6037 bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_calls() argument
6053 err = bpf_object__reloc_code(obj, prog, prog); in bpf_object__relocate_calls()
6064 struct bpf_program *prog; in bpf_object__free_relocs() local
6069 prog = &obj->programs[i]; in bpf_object__free_relocs()
6070 zfree(&prog->reloc_desc); in bpf_object__free_relocs()
6071 prog->nr_reloc = 0; in bpf_object__free_relocs()
6078 struct bpf_program *prog; in bpf_object__relocate() local
6099 prog = &obj->programs[i]; in bpf_object__relocate()
6100 for (j = 0; j < prog->nr_reloc; j++) { in bpf_object__relocate()
6101 struct reloc_desc *relo = &prog->reloc_desc[j]; in bpf_object__relocate()
6102 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate()
6118 prog = &obj->programs[i]; in bpf_object__relocate()
6122 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
6125 err = bpf_object__relocate_calls(obj, prog); in bpf_object__relocate()
6128 prog->name, err); in bpf_object__relocate()
6134 prog = &obj->programs[i]; in bpf_object__relocate()
6135 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
6137 err = bpf_object__relocate_data(obj, prog); in bpf_object__relocate()
6140 prog->name, err); in bpf_object__relocate()
6337 static int bpf_object__sanitize_prog(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__sanitize_prog() argument
6339 struct bpf_insn *insn = prog->insns; in bpf_object__sanitize_prog()
6346 for (i = 0; i < prog->insns_cnt; i++, insn++) { in bpf_object__sanitize_prog()
6372 static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name,
6376 static int libbpf_preload_prog(struct bpf_program *prog, in libbpf_preload_prog() argument
6382 if ((def & SEC_EXP_ATTACH_OPT) && !kernel_supports(prog->obj, FEAT_EXP_ATTACH_TYPE)) in libbpf_preload_prog()
6388 if ((prog->type == BPF_PROG_TYPE_TRACING || in libbpf_preload_prog()
6389 prog->type == BPF_PROG_TYPE_LSM || in libbpf_preload_prog()
6390 prog->type == BPF_PROG_TYPE_EXT) && !prog->attach_btf_id) { in libbpf_preload_prog()
6394 attach_name = strchr(prog->sec_name, '/') + 1; in libbpf_preload_prog()
6395 err = libbpf_find_attach_btf_id(prog, attach_name, &btf_obj_fd, &btf_type_id); in libbpf_preload_prog()
6400 prog->attach_btf_obj_fd = btf_obj_fd; in libbpf_preload_prog()
6401 prog->attach_btf_id = btf_type_id; in libbpf_preload_prog()
6415 load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt, in load_program() argument
6419 struct bpf_object *obj = prog->obj; in load_program()
6425 if (prog->type == BPF_PROG_TYPE_UNSPEC) { in load_program()
6431 prog->name, prog->sec_name); in load_program()
6438 load_attr.prog_type = prog->type; in load_program()
6439 load_attr.expected_attach_type = prog->expected_attach_type; in load_program()
6441 load_attr.name = prog->name; in load_program()
6445 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6446 load_attr.attach_prog_fd = prog->attach_prog_fd; in load_program()
6447 load_attr.attach_btf_obj_fd = prog->attach_btf_obj_fd; in load_program()
6448 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6450 load_attr.prog_ifindex = prog->prog_ifindex; in load_program()
6456 load_attr.func_info = prog->func_info; in load_program()
6457 load_attr.func_info_rec_size = prog->func_info_rec_size; in load_program()
6458 load_attr.func_info_cnt = prog->func_info_cnt; in load_program()
6459 load_attr.line_info = prog->line_info; in load_program()
6460 load_attr.line_info_rec_size = prog->line_info_rec_size; in load_program()
6461 load_attr.line_info_cnt = prog->line_info_cnt; in load_program()
6463 load_attr.log_level = prog->log_level; in load_program()
6464 load_attr.prog_flags = prog->prog_flags; in load_program()
6468 if (prog->sec_def && prog->sec_def->preload_fn) { in load_program()
6469 err = prog->sec_def->preload_fn(prog, &load_attr, prog->sec_def->cookie); in load_program()
6472 prog->name, err); in load_program()
6479 prog - obj->programs); in load_program()
6505 map = &prog->obj->maps[i]; in load_program()
6512 prog->name, cp); in load_program()
6565 static int bpf_program__record_externs(struct bpf_program *prog) in bpf_program__record_externs() argument
6567 struct bpf_object *obj = prog->obj; in bpf_program__record_externs()
6570 for (i = 0; i < prog->nr_reloc; i++) { in bpf_program__record_externs()
6571 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_program__record_externs()
6594 int bpf_program__load(struct bpf_program *prog, char *license, __u32 kern_ver) in bpf_program__load() argument
6598 if (prog->obj->loaded) { in bpf_program__load()
6599 pr_warn("prog '%s': can't load after object was loaded\n", prog->name); in bpf_program__load()
6603 if (prog->instances.nr < 0 || !prog->instances.fds) { in bpf_program__load()
6604 if (prog->preprocessor) { in bpf_program__load()
6606 prog->name); in bpf_program__load()
6610 prog->instances.fds = malloc(sizeof(int)); in bpf_program__load()
6611 if (!prog->instances.fds) { in bpf_program__load()
6615 prog->instances.nr = 1; in bpf_program__load()
6616 prog->instances.fds[0] = -1; in bpf_program__load()
6619 if (!prog->preprocessor) { in bpf_program__load()
6620 if (prog->instances.nr != 1) { in bpf_program__load()
6622 prog->name, prog->instances.nr); in bpf_program__load()
6624 if (prog->obj->gen_loader) in bpf_program__load()
6625 bpf_program__record_externs(prog); in bpf_program__load()
6626 err = load_program(prog, prog->insns, prog->insns_cnt, in bpf_program__load()
6629 prog->instances.fds[0] = fd; in bpf_program__load()
6633 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__load()
6635 bpf_program_prep_t preprocessor = prog->preprocessor; in bpf_program__load()
6638 err = preprocessor(prog, i, prog->insns, in bpf_program__load()
6639 prog->insns_cnt, &result); in bpf_program__load()
6642 i, prog->name); in bpf_program__load()
6648 i, prog->name); in bpf_program__load()
6649 prog->instances.fds[i] = -1; in bpf_program__load()
6655 err = load_program(prog, result.new_insn_ptr, in bpf_program__load()
6659 i, prog->name); in bpf_program__load()
6665 prog->instances.fds[i] = fd; in bpf_program__load()
6669 pr_warn("failed to load program '%s'\n", prog->name); in bpf_program__load()
6676 struct bpf_program *prog; in bpf_object__load_progs() local
6681 prog = &obj->programs[i]; in bpf_object__load_progs()
6682 err = bpf_object__sanitize_prog(obj, prog); in bpf_object__load_progs()
6688 prog = &obj->programs[i]; in bpf_object__load_progs()
6689 if (prog_is_subprog(obj, prog)) in bpf_object__load_progs()
6691 if (!prog->load) { in bpf_object__load_progs()
6692 pr_debug("prog '%s': skipped loading\n", prog->name); in bpf_object__load_progs()
6695 prog->log_level |= log_level; in bpf_object__load_progs()
6696 err = bpf_program__load(prog, obj->license, obj->kern_version); in bpf_object__load_progs()
6709 struct bpf_program *prog; in bpf_object_init_progs() local
6712 bpf_object__for_each_program(prog, obj) { in bpf_object_init_progs()
6713 prog->sec_def = find_sec_def(prog->sec_name); in bpf_object_init_progs()
6714 if (!prog->sec_def) { in bpf_object_init_progs()
6717 prog->name, prog->sec_name); in bpf_object_init_progs()
6721 bpf_program__set_type(prog, prog->sec_def->prog_type); in bpf_object_init_progs()
6722 bpf_program__set_expected_attach_type(prog, prog->sec_def->expected_attach_type); in bpf_object_init_progs()
6726 if (prog->sec_def->prog_type == BPF_PROG_TYPE_TRACING || in bpf_object_init_progs()
6727 prog->sec_def->prog_type == BPF_PROG_TYPE_EXT) in bpf_object_init_progs()
6728 prog->attach_prog_fd = OPTS_GET(opts, attach_prog_fd, 0); in bpf_object_init_progs()
6734 if (prog->sec_def->init_fn) { in bpf_object_init_progs()
6735 err = prog->sec_def->init_fn(prog, prog->sec_def->cookie); in bpf_object_init_progs()
6738 prog->name, err); in bpf_object_init_progs()
7376 static int bpf_program_pin_instance(struct bpf_program *prog, const char *path, int instance) in bpf_program_pin_instance() argument
7389 if (prog == NULL) { in bpf_program_pin_instance()
7394 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program_pin_instance()
7396 instance, prog->name, prog->instances.nr); in bpf_program_pin_instance()
7400 if (bpf_obj_pin(prog->instances.fds[instance], path)) { in bpf_program_pin_instance()
7411 static int bpf_program_unpin_instance(struct bpf_program *prog, const char *path, int instance) in bpf_program_unpin_instance() argument
7419 if (prog == NULL) { in bpf_program_unpin_instance()
7424 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program_unpin_instance()
7426 instance, prog->name, prog->instances.nr); in bpf_program_unpin_instance()
7440 int bpf_object__pin_instance(struct bpf_program *prog, const char *path, int instance);
7443 int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, int instance);
7445 int bpf_program__pin(struct bpf_program *prog, const char *path) in bpf_program__pin() argument
7457 if (prog == NULL) { in bpf_program__pin()
7462 if (prog->instances.nr <= 0) { in bpf_program__pin()
7463 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__pin()
7467 if (prog->instances.nr == 1) { in bpf_program__pin()
7469 return bpf_program_pin_instance(prog, path, 0); in bpf_program__pin()
7472 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__pin()
7485 err = bpf_program_pin_instance(prog, buf, i); in bpf_program__pin()
7503 bpf_program_unpin_instance(prog, buf, i); in bpf_program__pin()
7511 int bpf_program__unpin(struct bpf_program *prog, const char *path) in bpf_program__unpin() argument
7519 if (prog == NULL) { in bpf_program__unpin()
7524 if (prog->instances.nr <= 0) { in bpf_program__unpin()
7525 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__unpin()
7529 if (prog->instances.nr == 1) { in bpf_program__unpin()
7531 return bpf_program_unpin_instance(prog, path, 0); in bpf_program__unpin()
7534 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__unpin()
7544 err = bpf_program_unpin_instance(prog, buf, i); in bpf_program__unpin()
7783 struct bpf_program *prog; in bpf_object__pin_programs() local
7794 bpf_object__for_each_program(prog, obj) { in bpf_object__pin_programs()
7799 prog->pin_name); in bpf_object__pin_programs()
7808 err = bpf_program__pin(prog, buf); in bpf_object__pin_programs()
7816 while ((prog = bpf_program__prev(prog, obj))) { in bpf_object__pin_programs()
7821 prog->pin_name); in bpf_object__pin_programs()
7827 bpf_program__unpin(prog, buf); in bpf_object__pin_programs()
7835 struct bpf_program *prog; in bpf_object__unpin_programs() local
7841 bpf_object__for_each_program(prog, obj) { in bpf_object__unpin_programs()
7846 prog->pin_name); in bpf_object__unpin_programs()
7852 err = bpf_program__unpin(prog, buf); in bpf_object__unpin_programs()
8069 struct bpf_program *prog = prev; in bpf_object__next_program() local
8072 prog = __bpf_program__iter(prog, obj, true); in bpf_object__next_program()
8073 } while (prog && prog_is_subprog(obj, prog)); in bpf_object__next_program()
8075 return prog; in bpf_object__next_program()
8087 struct bpf_program *prog = next; in bpf_object__prev_program() local
8090 prog = __bpf_program__iter(prog, obj, false); in bpf_object__prev_program()
8091 } while (prog && prog_is_subprog(obj, prog)); in bpf_object__prev_program()
8093 return prog; in bpf_object__prev_program()
8096 int bpf_program__set_priv(struct bpf_program *prog, void *priv, in bpf_program__set_priv() argument
8099 if (prog->priv && prog->clear_priv) in bpf_program__set_priv()
8100 prog->clear_priv(prog, prog->priv); in bpf_program__set_priv()
8102 prog->priv = priv; in bpf_program__set_priv()
8103 prog->clear_priv = clear_priv; in bpf_program__set_priv()
8107 void *bpf_program__priv(const struct bpf_program *prog) in bpf_program__priv() argument
8109 return prog ? prog->priv : libbpf_err_ptr(-EINVAL); in bpf_program__priv()
8112 void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) in bpf_program__set_ifindex() argument
8114 prog->prog_ifindex = ifindex; in bpf_program__set_ifindex()
8117 const char *bpf_program__name(const struct bpf_program *prog) in bpf_program__name() argument
8119 return prog->name; in bpf_program__name()
8122 const char *bpf_program__section_name(const struct bpf_program *prog) in bpf_program__section_name() argument
8124 return prog->sec_name; in bpf_program__section_name()
8127 const char *bpf_program__title(const struct bpf_program *prog, bool needs_copy) in bpf_program__title() argument
8131 title = prog->sec_name; in bpf_program__title()
8143 bool bpf_program__autoload(const struct bpf_program *prog) in bpf_program__autoload() argument
8145 return prog->load; in bpf_program__autoload()
8148 int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) in bpf_program__set_autoload() argument
8150 if (prog->obj->loaded) in bpf_program__set_autoload()
8153 prog->load = autoload; in bpf_program__set_autoload()
8157 int bpf_program__fd(const struct bpf_program *prog) in bpf_program__fd() argument
8159 return bpf_program__nth_fd(prog, 0); in bpf_program__fd()
8162 size_t bpf_program__size(const struct bpf_program *prog) in bpf_program__size() argument
8164 return prog->insns_cnt * BPF_INSN_SZ; in bpf_program__size()
8167 const struct bpf_insn *bpf_program__insns(const struct bpf_program *prog) in bpf_program__insns() argument
8169 return prog->insns; in bpf_program__insns()
8172 size_t bpf_program__insn_cnt(const struct bpf_program *prog) in bpf_program__insn_cnt() argument
8174 return prog->insns_cnt; in bpf_program__insn_cnt()
8177 int bpf_program__set_prep(struct bpf_program *prog, int nr_instances, in bpf_program__set_prep() argument
8185 if (prog->instances.nr > 0 || prog->instances.fds) { in bpf_program__set_prep()
8199 prog->instances.nr = nr_instances; in bpf_program__set_prep()
8200 prog->instances.fds = instances_fds; in bpf_program__set_prep()
8201 prog->preprocessor = prep; in bpf_program__set_prep()
8205 int bpf_program__nth_fd(const struct bpf_program *prog, int n) in bpf_program__nth_fd() argument
8209 if (!prog) in bpf_program__nth_fd()
8212 if (n >= prog->instances.nr || n < 0) { in bpf_program__nth_fd()
8214 n, prog->name, prog->instances.nr); in bpf_program__nth_fd()
8218 fd = prog->instances.fds[n]; in bpf_program__nth_fd()
8221 n, prog->name); in bpf_program__nth_fd()
8228 enum bpf_prog_type bpf_program__get_type(const struct bpf_program *prog) in bpf_program__get_type() argument
8230 return prog->type; in bpf_program__get_type()
8233 void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) in bpf_program__set_type() argument
8235 prog->type = type; in bpf_program__set_type()
8238 static bool bpf_program__is_type(const struct bpf_program *prog, in bpf_program__is_type() argument
8241 return prog ? (prog->type == type) : false; in bpf_program__is_type()
8245 int bpf_program__set_##NAME(struct bpf_program *prog) \
8247 if (!prog) \
8249 bpf_program__set_type(prog, TYPE); \
8253 bool bpf_program__is_##NAME(const struct bpf_program *prog) \
8255 return bpf_program__is_type(prog, TYPE); \
8273 bpf_program__get_expected_attach_type(const struct bpf_program *prog) in bpf_program__get_expected_attach_type() argument
8275 return prog->expected_attach_type; in bpf_program__get_expected_attach_type()
8278 void bpf_program__set_expected_attach_type(struct bpf_program *prog, in bpf_program__set_expected_attach_type() argument
8281 prog->expected_attach_type = type; in bpf_program__set_expected_attach_type()
8293 static struct bpf_link *attach_kprobe(const struct bpf_program *prog, long cookie);
8294 static struct bpf_link *attach_tp(const struct bpf_program *prog, long cookie);
8295 static struct bpf_link *attach_raw_tp(const struct bpf_program *prog, long cookie);
8296 static struct bpf_link *attach_trace(const struct bpf_program *prog, long cookie);
8297 static struct bpf_link *attach_lsm(const struct bpf_program *prog, long cookie);
8298 static struct bpf_link *attach_iter(const struct bpf_program *prog, long cookie);
8510 struct bpf_program *prog; in bpf_object__collect_st_ops_relos() local
8582 prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx); in bpf_object__collect_st_ops_relos()
8583 if (!prog) { in bpf_object__collect_st_ops_relos()
8590 if (prog->type != BPF_PROG_TYPE_STRUCT_OPS) { in bpf_object__collect_st_ops_relos()
8592 map->name, prog->name); in bpf_object__collect_st_ops_relos()
8599 if (!prog->attach_btf_id) { in bpf_object__collect_st_ops_relos()
8600 prog->attach_btf_id = st_ops->type_id; in bpf_object__collect_st_ops_relos()
8601 prog->expected_attach_type = member_idx; in bpf_object__collect_st_ops_relos()
8608 if (prog->attach_btf_id != st_ops->type_id || in bpf_object__collect_st_ops_relos()
8609 prog->expected_attach_type != member_idx) { in bpf_object__collect_st_ops_relos()
8611 map->name, prog->name, prog->sec_name, prog->type, in bpf_object__collect_st_ops_relos()
8612 prog->attach_btf_id, prog->expected_attach_type, name); in bpf_object__collect_st_ops_relos()
8616 st_ops->progs[member_idx] = prog; in bpf_object__collect_st_ops_relos()
8769 static int libbpf_find_attach_btf_id(struct bpf_program *prog, const char *attach_name, in libbpf_find_attach_btf_id() argument
8772 enum bpf_attach_type attach_type = prog->expected_attach_type; in libbpf_find_attach_btf_id()
8773 __u32 attach_prog_fd = prog->attach_prog_fd; in libbpf_find_attach_btf_id()
8790 if (prog->obj->gen_loader) { in libbpf_find_attach_btf_id()
8791 bpf_gen__record_attach_target(prog->obj->gen_loader, attach_name, attach_type); in libbpf_find_attach_btf_id()
8795 err = find_kernel_btf_id(prog->obj, attach_name, attach_type, btf_obj_fd, btf_type_id); in libbpf_find_attach_btf_id()
9165 struct bpf_program *prog, *first_prog = NULL; in bpf_prog_load_xattr() local
9183 bpf_object__for_each_program(prog, obj) { in bpf_prog_load_xattr()
9191 bpf_program__set_type(prog, attr->prog_type); in bpf_prog_load_xattr()
9192 bpf_program__set_expected_attach_type(prog, in bpf_prog_load_xattr()
9195 if (bpf_program__get_type(prog) == BPF_PROG_TYPE_UNSPEC) { in bpf_prog_load_xattr()
9204 prog->prog_ifindex = attr->ifindex; in bpf_prog_load_xattr()
9205 prog->log_level = attr->log_level; in bpf_prog_load_xattr()
9206 prog->prog_flags |= attr->prog_flags; in bpf_prog_load_xattr()
9208 first_prog = prog; in bpf_prog_load_xattr()
9242 int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog) in bpf_link__update_program() argument
9246 ret = bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL); in bpf_link__update_program()
9422 struct bpf_link *bpf_program__attach_perf_event_opts(const struct bpf_program *prog, int pfd, in bpf_program__attach_perf_event_opts() argument
9434 prog->name, pfd); in bpf_program__attach_perf_event_opts()
9437 prog_fd = bpf_program__fd(prog); in bpf_program__attach_perf_event_opts()
9440 prog->name); in bpf_program__attach_perf_event_opts()
9451 if (kernel_supports(prog->obj, FEAT_PERF_LINK)) { in bpf_program__attach_perf_event_opts()
9459 prog->name, pfd, in bpf_program__attach_perf_event_opts()
9466 pr_warn("prog '%s': user context value is not supported\n", prog->name); in bpf_program__attach_perf_event_opts()
9474 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
9477 prog->name, pfd); in bpf_program__attach_perf_event_opts()
9485 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event_opts()
9497 struct bpf_link *bpf_program__attach_perf_event(const struct bpf_program *prog, int pfd) in bpf_program__attach_perf_event() argument
9499 return bpf_program__attach_perf_event_opts(prog, pfd, NULL); in bpf_program__attach_perf_event()
9708 bpf_program__attach_kprobe_opts(const struct bpf_program *prog, in bpf_program__attach_kprobe_opts() argument
9748 prog->name, retprobe ? "kretprobe" : "kprobe", in bpf_program__attach_kprobe_opts()
9753 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_kprobe_opts()
9758 prog->name, retprobe ? "kretprobe" : "kprobe", in bpf_program__attach_kprobe_opts()
9777 struct bpf_link *bpf_program__attach_kprobe(const struct bpf_program *prog, in bpf_program__attach_kprobe() argument
9785 return bpf_program__attach_kprobe_opts(prog, func_name, &opts); in bpf_program__attach_kprobe()
9788 static struct bpf_link *attach_kprobe(const struct bpf_program *prog, long cookie) in attach_kprobe() argument
9797 opts.retprobe = str_has_pfx(prog->sec_name, "kretprobe/"); in attach_kprobe()
9799 func_name = prog->sec_name + sizeof("kretprobe/") - 1; in attach_kprobe()
9801 func_name = prog->sec_name + sizeof("kprobe/") - 1; in attach_kprobe()
9817 link = bpf_program__attach_kprobe_opts(prog, func, &opts); in attach_kprobe()
9902 bpf_program__attach_uprobe_opts(const struct bpf_program *prog, pid_t pid, in bpf_program__attach_uprobe_opts() argument
9943 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
9949 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_uprobe_opts()
9954 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe_opts()
9973 struct bpf_link *bpf_program__attach_uprobe(const struct bpf_program *prog, in bpf_program__attach_uprobe() argument
9980 return bpf_program__attach_uprobe_opts(prog, pid, binary_path, func_offset, &opts); in bpf_program__attach_uprobe()
10033 struct bpf_link *bpf_program__attach_tracepoint_opts(const struct bpf_program *prog, in bpf_program__attach_tracepoint_opts() argument
10051 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
10055 link = bpf_program__attach_perf_event_opts(prog, pfd, &pe_opts); in bpf_program__attach_tracepoint_opts()
10060 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint_opts()
10067 struct bpf_link *bpf_program__attach_tracepoint(const struct bpf_program *prog, in bpf_program__attach_tracepoint() argument
10071 return bpf_program__attach_tracepoint_opts(prog, tp_category, tp_name, NULL); in bpf_program__attach_tracepoint()
10074 static struct bpf_link *attach_tp(const struct bpf_program *prog, long cookie) in attach_tp() argument
10079 sec_name = strdup(prog->sec_name); in attach_tp()
10084 if (str_has_pfx(prog->sec_name, "tp/")) in attach_tp()
10096 link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name); in attach_tp()
10101 struct bpf_link *bpf_program__attach_raw_tracepoint(const struct bpf_program *prog, in bpf_program__attach_raw_tracepoint() argument
10108 prog_fd = bpf_program__fd(prog); in bpf_program__attach_raw_tracepoint()
10110 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_raw_tracepoint()
10124 prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_raw_tracepoint()
10131 static struct bpf_link *attach_raw_tp(const struct bpf_program *prog, long cookie) in attach_raw_tp() argument
10143 if (str_has_pfx(prog->sec_name, prefixes[i])) { in attach_raw_tp()
10144 tp_name = prog->sec_name + strlen(prefixes[i]); in attach_raw_tp()
10150 prog->name, prog->sec_name); in attach_raw_tp()
10154 return bpf_program__attach_raw_tracepoint(prog, tp_name); in attach_raw_tp()
10158 static struct bpf_link *bpf_program__attach_btf_id(const struct bpf_program *prog) in bpf_program__attach_btf_id() argument
10164 prog_fd = bpf_program__fd(prog); in bpf_program__attach_btf_id()
10166 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_btf_id()
10180 prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_btf_id()
10187 struct bpf_link *bpf_program__attach_trace(const struct bpf_program *prog) in bpf_program__attach_trace() argument
10189 return bpf_program__attach_btf_id(prog); in bpf_program__attach_trace()
10192 struct bpf_link *bpf_program__attach_lsm(const struct bpf_program *prog) in bpf_program__attach_lsm() argument
10194 return bpf_program__attach_btf_id(prog); in bpf_program__attach_lsm()
10197 static struct bpf_link *attach_trace(const struct bpf_program *prog, long cookie) in attach_trace() argument
10199 return bpf_program__attach_trace(prog); in attach_trace()
10202 static struct bpf_link *attach_lsm(const struct bpf_program *prog, long cookie) in attach_lsm() argument
10204 return bpf_program__attach_lsm(prog); in attach_lsm()
10208 bpf_program__attach_fd(const struct bpf_program *prog, int target_fd, int btf_id, in bpf_program__attach_fd() argument
10218 prog_fd = bpf_program__fd(prog); in bpf_program__attach_fd()
10220 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_fd()
10229 attach_type = bpf_program__get_expected_attach_type(prog); in bpf_program__attach_fd()
10235 prog->name, target_name, in bpf_program__attach_fd()
10244 bpf_program__attach_cgroup(const struct bpf_program *prog, int cgroup_fd) in bpf_program__attach_cgroup() argument
10246 return bpf_program__attach_fd(prog, cgroup_fd, 0, "cgroup"); in bpf_program__attach_cgroup()
10250 bpf_program__attach_netns(const struct bpf_program *prog, int netns_fd) in bpf_program__attach_netns() argument
10252 return bpf_program__attach_fd(prog, netns_fd, 0, "netns"); in bpf_program__attach_netns()
10255 struct bpf_link *bpf_program__attach_xdp(const struct bpf_program *prog, int ifindex) in bpf_program__attach_xdp() argument
10258 return bpf_program__attach_fd(prog, ifindex, 0, "xdp"); in bpf_program__attach_xdp()
10261 struct bpf_link *bpf_program__attach_freplace(const struct bpf_program *prog, in bpf_program__attach_freplace() argument
10269 prog->name); in bpf_program__attach_freplace()
10273 if (prog->type != BPF_PROG_TYPE_EXT) { in bpf_program__attach_freplace()
10275 prog->name); in bpf_program__attach_freplace()
10284 return bpf_program__attach_fd(prog, target_fd, btf_id, "freplace"); in bpf_program__attach_freplace()
10289 return bpf_program__attach_trace(prog); in bpf_program__attach_freplace()
10294 bpf_program__attach_iter(const struct bpf_program *prog, in bpf_program__attach_iter() argument
10309 prog_fd = bpf_program__fd(prog); in bpf_program__attach_iter()
10311 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_iter()
10326 prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); in bpf_program__attach_iter()
10333 static struct bpf_link *attach_iter(const struct bpf_program *prog, long cookie) in attach_iter() argument
10335 return bpf_program__attach_iter(prog, NULL); in attach_iter()
10338 struct bpf_link *bpf_program__attach(const struct bpf_program *prog) in bpf_program__attach() argument
10340 if (!prog->sec_def || !prog->sec_def->attach_fn) in bpf_program__attach()
10343 return prog->sec_def->attach_fn(prog, prog->sec_def->cookie); in bpf_program__attach()
10372 struct bpf_program *prog = st_ops->progs[i]; in bpf_map__attach_struct_ops() local
10376 if (!prog) in bpf_map__attach_struct_ops()
10379 prog_fd = bpf_program__fd(prog); in bpf_map__attach_struct_ops()
11163 int bpf_program__set_attach_target(struct bpf_program *prog, in bpf_program__set_attach_target() argument
11169 if (!prog || attach_prog_fd < 0) in bpf_program__set_attach_target()
11172 if (prog->obj->loaded) in bpf_program__set_attach_target()
11179 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
11193 err = bpf_object__load_vmlinux_btf(prog->obj, true); in bpf_program__set_attach_target()
11196 err = find_kernel_btf_id(prog->obj, attach_func_name, in bpf_program__set_attach_target()
11197 prog->expected_attach_type, in bpf_program__set_attach_target()
11203 prog->attach_btf_id = btf_id; in bpf_program__set_attach_target()
11204 prog->attach_btf_obj_fd = btf_obj_fd; in bpf_program__set_attach_target()
11205 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
11360 struct bpf_program **prog = s->progs[i].prog; in bpf_object__open_skeleton() local
11363 *prog = bpf_object__find_program_by_name(obj, name); in bpf_object__open_skeleton()
11364 if (!*prog) { in bpf_object__open_skeleton()
11431 struct bpf_program *prog = *s->progs[i].prog; in bpf_object__attach_skeleton() local
11434 if (!prog->load) in bpf_object__attach_skeleton()
11438 if (!prog->sec_def || !prog->sec_def->attach_fn) in bpf_object__attach_skeleton()
11441 *link = bpf_program__attach(prog); in bpf_object__attach_skeleton()
11445 bpf_program__name(prog), err); in bpf_object__attach_skeleton()