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
879 prog = st_ops->progs[i]; in bpf_map__init_kern_struct_ops()
880 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()
2503 static inline bool libbpf_prog_needs_vmlinux_btf(struct bpf_program *prog) in libbpf_prog_needs_vmlinux_btf() argument
2505 if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || in libbpf_prog_needs_vmlinux_btf()
2506 prog->type == BPF_PROG_TYPE_LSM) in libbpf_prog_needs_vmlinux_btf()
2512 if (prog->type == BPF_PROG_TYPE_TRACING && !prog->attach_prog_fd) in libbpf_prog_needs_vmlinux_btf()
2521 struct bpf_program *prog; in bpf_object__load_vmlinux_btf() local
2539 bpf_object__for_each_program(prog, obj) { in bpf_object__load_vmlinux_btf()
2540 if (!prog->load) in bpf_object__load_vmlinux_btf()
2542 if (libbpf_prog_needs_vmlinux_btf(prog)) { in bpf_object__load_vmlinux_btf()
3272 const struct bpf_program *prog) in prog_is_subprog() argument
3286 return prog->sec_idx == obj->efile.text_shndx && obj->nr_programs > 1; in prog_is_subprog()
3293 struct bpf_program *prog; in bpf_object__find_program_by_name() local
3295 bpf_object__for_each_program(prog, obj) { in bpf_object__find_program_by_name()
3296 if (prog_is_subprog(obj, prog)) in bpf_object__find_program_by_name()
3298 if (!strcmp(prog->name, name)) in bpf_object__find_program_by_name()
3299 return prog; in bpf_object__find_program_by_name()
3334 static int bpf_program__record_reloc(struct bpf_program *prog, in bpf_program__record_reloc() argument
3339 struct bpf_insn *insn = &prog->insns[insn_idx]; in bpf_program__record_reloc()
3340 size_t map_idx, nr_maps = prog->obj->nr_maps; in bpf_program__record_reloc()
3341 struct bpf_object *obj = prog->obj; in bpf_program__record_reloc()
3352 pr_warn("prog '%s': incorrect bpf_call opcode\n", prog->name); in bpf_program__record_reloc()
3359 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3364 prog->name, sym_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3375 prog->name, sym_name, insn_idx, insn->code); in bpf_program__record_reloc()
3391 prog->name, sym_name, sym_idx); in bpf_program__record_reloc()
3395 prog->name, i, ext->name, ext->sym_idx, insn_idx); in bpf_program__record_reloc()
3404 prog->name, sym_name, shdr_idx); in bpf_program__record_reloc()
3415 prog->name, sym_name, sym_sec_name); in bpf_program__record_reloc()
3425 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3431 prog->name, sym_sec_name, (size_t)sym->st_value); in bpf_program__record_reloc()
3444 prog->name, sym_sec_name); in bpf_program__record_reloc()
3452 prog->name, map_idx, map->name, map->sec_idx, in bpf_program__record_reloc()
3458 prog->name, sym_sec_name); in bpf_program__record_reloc()
3469 static bool prog_contains_insn(const struct bpf_program *prog, size_t insn_idx) in prog_contains_insn() argument
3471 return insn_idx >= prog->sec_insn_off && in prog_contains_insn()
3472 insn_idx < prog->sec_insn_off + prog->sec_insn_cnt; in prog_contains_insn()
3479 struct bpf_program *prog; in find_prog_by_sec_insn() local
3483 prog = &obj->programs[m]; in find_prog_by_sec_insn()
3485 if (prog->sec_idx < sec_idx || in find_prog_by_sec_insn()
3486 (prog->sec_idx == sec_idx && prog->sec_insn_off <= insn_idx)) in find_prog_by_sec_insn()
3494 prog = &obj->programs[l]; in find_prog_by_sec_insn()
3495 if (prog->sec_idx == sec_idx && prog_contains_insn(prog, insn_idx)) in find_prog_by_sec_insn()
3496 return prog; in find_prog_by_sec_insn()
3506 struct bpf_program *prog; in bpf_object__collect_prog_relos() local
3555 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__collect_prog_relos()
3556 if (!prog) { in bpf_object__collect_prog_relos()
3562 relos = libbpf_reallocarray(prog->reloc_desc, in bpf_object__collect_prog_relos()
3563 prog->nr_reloc + 1, sizeof(*relos)); in bpf_object__collect_prog_relos()
3566 prog->reloc_desc = relos; in bpf_object__collect_prog_relos()
3569 insn_idx -= prog->sec_insn_off; in bpf_object__collect_prog_relos()
3570 err = bpf_program__record_reloc(prog, &relos[prog->nr_reloc], in bpf_object__collect_prog_relos()
3575 prog->nr_reloc++; in bpf_object__collect_prog_relos()
3926 int ret, map, prog; in probe_prog_bind_map() local
3949 prog = bpf_load_program_xattr(&prg_attr, NULL, 0); in probe_prog_bind_map()
3950 if (prog < 0) { in probe_prog_bind_map()
3955 ret = bpf_prog_bind_map(prog, map, NULL); in probe_prog_bind_map()
3958 close(prog); in probe_prog_bind_map()
5043 static int bpf_core_calc_field_relo(const struct bpf_program *prog, in bpf_core_calc_field_relo() argument
5087 prog->name, relo->kind, relo->insn_off / 8); in bpf_core_calc_field_relo()
5109 prog->name, relo->kind, relo->insn_off / 8); in bpf_core_calc_field_relo()
5259 static int bpf_core_calc_relo(const struct bpf_program *prog, in bpf_core_calc_relo() argument
5277 err = bpf_core_calc_field_relo(prog, relo, local_spec, in bpf_core_calc_relo()
5280 err = err ?: bpf_core_calc_field_relo(prog, relo, targ_spec, in bpf_core_calc_relo()
5338 prog->name, relo_idx, core_relo_kind_str(relo->kind), in bpf_core_calc_relo()
5349 static void bpf_core_poison_insn(struct bpf_program *prog, int relo_idx, in bpf_core_poison_insn() argument
5353 prog->name, relo_idx, insn_idx); in bpf_core_poison_insn()
5409 static int bpf_core_patch_insn(struct bpf_program *prog, in bpf_core_patch_insn() argument
5426 insn_idx = insn_idx - prog->sec_insn_off; in bpf_core_patch_insn()
5427 insn = &prog->insns[insn_idx]; in bpf_core_patch_insn()
5436 bpf_core_poison_insn(prog, relo_idx, insn_idx + 1, insn + 1); in bpf_core_patch_insn()
5437 bpf_core_poison_insn(prog, relo_idx, insn_idx, insn); in bpf_core_patch_insn()
5451 prog->name, relo_idx, in bpf_core_patch_insn()
5458 prog->name, relo_idx, insn_idx, in bpf_core_patch_insn()
5466 prog->name, relo_idx, insn_idx, insn->off, orig_val, new_val); in bpf_core_patch_insn()
5471 prog->name, relo_idx, insn_idx, new_val); in bpf_core_patch_insn()
5477 prog->name, relo_idx, insn_idx); in bpf_core_patch_insn()
5484 prog->name, relo_idx, insn_idx, orig_val, new_val); in bpf_core_patch_insn()
5492 prog->name, relo_idx, insn_idx, insn_bytes_sz, res->orig_sz); in bpf_core_patch_insn()
5499 prog->name, relo_idx, insn_idx, res->new_sz); in bpf_core_patch_insn()
5505 prog->name, relo_idx, insn_idx, res->orig_sz, res->new_sz); in bpf_core_patch_insn()
5513 insn_idx + 1 >= prog->insns_cnt || in bpf_core_patch_insn()
5517 prog->name, relo_idx, insn_idx); in bpf_core_patch_insn()
5524 prog->name, relo_idx, in bpf_core_patch_insn()
5533 prog->name, relo_idx, insn_idx, in bpf_core_patch_insn()
5539 prog->name, relo_idx, insn_idx, insn->code, in bpf_core_patch_insn()
5663 static int bpf_core_apply_relo(struct bpf_program *prog, in bpf_core_apply_relo() argument
5696 prog->name, relo_idx, local_id, btf_kind_str(local_type), in bpf_core_apply_relo()
5702 pr_debug("prog '%s': relo #%d: kind <%s> (%d), spec is ", prog->name, in bpf_core_apply_relo()
5719 prog->name, relo_idx, core_relo_kind_str(relo->kind), relo->kind); in bpf_core_apply_relo()
5727 prog->name, relo_idx, local_id, btf_kind_str(local_type), in bpf_core_apply_relo()
5743 prog->name, relo_idx, i); in bpf_core_apply_relo()
5749 pr_debug("prog '%s': relo #%d: %s candidate #%d ", prog->name, in bpf_core_apply_relo()
5757 err = bpf_core_calc_relo(prog, relo, relo_idx, &local_spec, &cand_spec, &cand_res); in bpf_core_apply_relo()
5769 prog->name, relo_idx, cand_spec.bit_offset, in bpf_core_apply_relo()
5778 prog->name, relo_idx, in bpf_core_apply_relo()
5811 prog->name, relo_idx); in bpf_core_apply_relo()
5814 err = bpf_core_calc_relo(prog, relo, relo_idx, &local_spec, NULL, &targ_res); in bpf_core_apply_relo()
5821 err = bpf_core_patch_insn(prog, relo, relo_idx, &targ_res); in bpf_core_apply_relo()
5824 prog->name, relo_idx, relo->insn_off, err); in bpf_core_apply_relo()
5839 struct bpf_program *prog; in bpf_object__relocate_core() local
5875 prog = NULL; in bpf_object__relocate_core()
5877 prog = &obj->programs[i]; in bpf_object__relocate_core()
5878 if (strcmp(prog->sec_name, sec_name) == 0) in bpf_object__relocate_core()
5881 if (!prog) { in bpf_object__relocate_core()
5885 sec_idx = prog->sec_idx; in bpf_object__relocate_core()
5892 prog = find_prog_by_sec_insn(obj, sec_idx, insn_idx); in bpf_object__relocate_core()
5893 if (!prog) { in bpf_object__relocate_core()
5902 if (!prog->load) in bpf_object__relocate_core()
5905 err = bpf_core_apply_relo(prog, rec, i, obj->btf, in bpf_object__relocate_core()
5909 prog->name, i, err); in bpf_object__relocate_core()
5934 bpf_object__relocate_data(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_data() argument
5938 for (i = 0; i < prog->nr_reloc; i++) { in bpf_object__relocate_data()
5939 struct reloc_desc *relo = &prog->reloc_desc[i]; in bpf_object__relocate_data()
5940 struct bpf_insn *insn = &prog->insns[relo->insn_idx]; in bpf_object__relocate_data()
5977 prog->name, i, relo->type); in bpf_object__relocate_data()
5986 const struct bpf_program *prog, in adjust_prog_btf_ext_info() argument
6002 if (strcmp(sec_name, prog->sec_name) != 0) in adjust_prog_btf_ext_info()
6008 if (insn_off < prog->sec_insn_off) in adjust_prog_btf_ext_info()
6010 if (insn_off >= prog->sec_insn_off + prog->sec_insn_cnt) in adjust_prog_btf_ext_info()
6039 off_adj = prog->sub_insn_off - prog->sec_insn_off; in adjust_prog_btf_ext_info()
6057 const struct bpf_program *prog) in reloc_prog_func_and_line_info() argument
6070 if (main_prog != prog && !main_prog->func_info) in reloc_prog_func_and_line_info()
6073 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->func_info, in reloc_prog_func_and_line_info()
6080 prog->name, err); in reloc_prog_func_and_line_info()
6088 pr_warn("prog '%s': missing .BTF.ext function info.\n", prog->name); in reloc_prog_func_and_line_info()
6093 prog->name); in reloc_prog_func_and_line_info()
6098 if (main_prog != prog && !main_prog->line_info) in reloc_prog_func_and_line_info()
6101 err = adjust_prog_btf_ext_info(obj, prog, &obj->btf_ext->line_info, in reloc_prog_func_and_line_info()
6108 prog->name, err); in reloc_prog_func_and_line_info()
6116 pr_warn("prog '%s': missing .BTF.ext line info.\n", prog->name); in reloc_prog_func_and_line_info()
6121 prog->name); in reloc_prog_func_and_line_info()
6136 static struct reloc_desc *find_prog_insn_relo(const struct bpf_program *prog, size_t insn_idx) in find_prog_insn_relo() argument
6138 return bsearch(&insn_idx, prog->reloc_desc, prog->nr_reloc, in find_prog_insn_relo()
6139 sizeof(*prog->reloc_desc), cmp_relo_by_insn_idx); in find_prog_insn_relo()
6144 struct bpf_program *prog) in bpf_object__reloc_code() argument
6152 err = reloc_prog_func_and_line_info(obj, main_prog, prog); in bpf_object__reloc_code()
6156 for (insn_idx = 0; insn_idx < prog->sec_insn_cnt; insn_idx++) { in bpf_object__reloc_code()
6157 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
6161 relo = find_prog_insn_relo(prog, insn_idx); in bpf_object__reloc_code()
6164 prog->name, insn_idx, relo->type); in bpf_object__reloc_code()
6183 sub_insn_idx = prog->sec_insn_off + insn_idx + insn->imm + 1; in bpf_object__reloc_code()
6190 prog->name); in bpf_object__reloc_code()
6230 insn = &main_prog->insns[prog->sub_insn_off + insn_idx]; in bpf_object__reloc_code()
6236 insn->imm = subprog->sub_insn_off - (prog->sub_insn_off + insn_idx) - 1; in bpf_object__reloc_code()
6242 prog->name, insn_idx, insn->imm, subprog->name, subprog->sub_insn_off); in bpf_object__reloc_code()
6330 bpf_object__relocate_calls(struct bpf_object *obj, struct bpf_program *prog) in bpf_object__relocate_calls() argument
6349 err = bpf_object__reloc_code(obj, prog, prog); in bpf_object__relocate_calls()
6360 struct bpf_program *prog; in bpf_object__relocate() local
6377 prog = &obj->programs[i]; in bpf_object__relocate()
6378 err = bpf_object__relocate_data(obj, prog); in bpf_object__relocate()
6381 prog->name, err); in bpf_object__relocate()
6391 prog = &obj->programs[i]; in bpf_object__relocate()
6395 if (prog_is_subprog(obj, prog)) in bpf_object__relocate()
6398 err = bpf_object__relocate_calls(obj, prog); in bpf_object__relocate()
6401 prog->name, err); in bpf_object__relocate()
6407 prog = &obj->programs[i]; in bpf_object__relocate()
6408 zfree(&prog->reloc_desc); in bpf_object__relocate()
6409 prog->nr_reloc = 0; in bpf_object__relocate()
6593 static int bpf_object__sanitize_prog(struct bpf_object* obj, struct bpf_program *prog) in bpf_object__sanitize_prog() argument
6595 struct bpf_insn *insn = prog->insns; in bpf_object__sanitize_prog()
6599 for (i = 0; i < prog->insns_cnt; i++, insn++) { in bpf_object__sanitize_prog()
6626 load_program(struct bpf_program *prog, struct bpf_insn *insns, int insns_cnt, in load_program() argument
6639 load_attr.prog_type = prog->type; in load_program()
6641 if (!kernel_supports(FEAT_EXP_ATTACH_TYPE) && prog->sec_def && in load_program()
6642 prog->sec_def->is_exp_attach_type_optional) in load_program()
6645 load_attr.expected_attach_type = prog->expected_attach_type; in load_program()
6647 load_attr.name = prog->name; in load_program()
6651 if (prog->type == BPF_PROG_TYPE_STRUCT_OPS || in load_program()
6652 prog->type == BPF_PROG_TYPE_LSM) { in load_program()
6653 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6654 } else if (prog->type == BPF_PROG_TYPE_TRACING || in load_program()
6655 prog->type == BPF_PROG_TYPE_EXT) { in load_program()
6656 load_attr.attach_prog_fd = prog->attach_prog_fd; in load_program()
6657 load_attr.attach_btf_id = prog->attach_btf_id; in load_program()
6660 load_attr.prog_ifindex = prog->prog_ifindex; in load_program()
6663 btf_fd = bpf_object__btf_fd(prog->obj); in load_program()
6666 load_attr.func_info = prog->func_info; in load_program()
6667 load_attr.func_info_rec_size = prog->func_info_rec_size; in load_program()
6668 load_attr.func_info_cnt = prog->func_info_cnt; in load_program()
6669 load_attr.line_info = prog->line_info; in load_program()
6670 load_attr.line_info_rec_size = prog->line_info_rec_size; in load_program()
6671 load_attr.line_info_cnt = prog->line_info_cnt; in load_program()
6673 load_attr.log_level = prog->log_level; in load_program()
6674 load_attr.prog_flags = prog->prog_flags; in load_program()
6691 if (prog->obj->rodata_map_idx >= 0 && in load_program()
6694 &prog->obj->maps[prog->obj->rodata_map_idx]; in load_program()
6699 prog->name, cp); in load_program()
6749 static int libbpf_find_attach_btf_id(struct bpf_program *prog);
6751 int bpf_program__load(struct bpf_program *prog, char *license, __u32 kern_ver) in bpf_program__load() argument
6755 if (prog->obj->loaded) { in bpf_program__load()
6756 pr_warn("prog '%s': can't load after object was loaded\n", prog->name); in bpf_program__load()
6760 if ((prog->type == BPF_PROG_TYPE_TRACING || in bpf_program__load()
6761 prog->type == BPF_PROG_TYPE_LSM || in bpf_program__load()
6762 prog->type == BPF_PROG_TYPE_EXT) && !prog->attach_btf_id) { in bpf_program__load()
6763 btf_id = libbpf_find_attach_btf_id(prog); in bpf_program__load()
6766 prog->attach_btf_id = btf_id; in bpf_program__load()
6769 if (prog->instances.nr < 0 || !prog->instances.fds) { in bpf_program__load()
6770 if (prog->preprocessor) { in bpf_program__load()
6772 prog->name); in bpf_program__load()
6776 prog->instances.fds = malloc(sizeof(int)); in bpf_program__load()
6777 if (!prog->instances.fds) { in bpf_program__load()
6781 prog->instances.nr = 1; in bpf_program__load()
6782 prog->instances.fds[0] = -1; in bpf_program__load()
6785 if (!prog->preprocessor) { in bpf_program__load()
6786 if (prog->instances.nr != 1) { in bpf_program__load()
6788 prog->name, prog->instances.nr); in bpf_program__load()
6790 err = load_program(prog, prog->insns, prog->insns_cnt, in bpf_program__load()
6793 prog->instances.fds[0] = fd; in bpf_program__load()
6797 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__load()
6799 bpf_program_prep_t preprocessor = prog->preprocessor; in bpf_program__load()
6802 err = preprocessor(prog, i, prog->insns, in bpf_program__load()
6803 prog->insns_cnt, &result); in bpf_program__load()
6806 i, prog->name); in bpf_program__load()
6812 i, prog->name); in bpf_program__load()
6813 prog->instances.fds[i] = -1; in bpf_program__load()
6819 err = load_program(prog, result.new_insn_ptr, in bpf_program__load()
6823 i, prog->name); in bpf_program__load()
6829 prog->instances.fds[i] = fd; in bpf_program__load()
6833 pr_warn("failed to load program '%s'\n", prog->name); in bpf_program__load()
6834 zfree(&prog->insns); in bpf_program__load()
6835 prog->insns_cnt = 0; in bpf_program__load()
6842 struct bpf_program *prog; in bpf_object__load_progs() local
6847 prog = &obj->programs[i]; in bpf_object__load_progs()
6848 err = bpf_object__sanitize_prog(obj, prog); in bpf_object__load_progs()
6854 prog = &obj->programs[i]; in bpf_object__load_progs()
6855 if (prog_is_subprog(obj, prog)) in bpf_object__load_progs()
6857 if (!prog->load) { in bpf_object__load_progs()
6858 pr_debug("prog '%s': skipped loading\n", prog->name); in bpf_object__load_progs()
6861 prog->log_level |= log_level; in bpf_object__load_progs()
6862 err = bpf_program__load(prog, obj->license, obj->kern_version); in bpf_object__load_progs()
6876 struct bpf_program *prog; in __bpf_object__open() local
6924 bpf_object__for_each_program(prog, obj) { in __bpf_object__open()
6925 prog->sec_def = find_sec_def(prog->sec_name); in __bpf_object__open()
6926 if (!prog->sec_def) in __bpf_object__open()
6930 if (prog->sec_def->is_sleepable) in __bpf_object__open()
6931 prog->prog_flags |= BPF_F_SLEEPABLE; in __bpf_object__open()
6932 bpf_program__set_type(prog, prog->sec_def->prog_type); in __bpf_object__open()
6933 bpf_program__set_expected_attach_type(prog, in __bpf_object__open()
6934 prog->sec_def->expected_attach_type); in __bpf_object__open()
6936 if (prog->sec_def->prog_type == BPF_PROG_TYPE_TRACING || in __bpf_object__open()
6937 prog->sec_def->prog_type == BPF_PROG_TYPE_EXT) in __bpf_object__open()
6938 prog->attach_prog_fd = OPTS_GET(opts, attach_prog_fd, 0); in __bpf_object__open()
7355 int bpf_program__pin_instance(struct bpf_program *prog, const char *path, in bpf_program__pin_instance() argument
7369 if (prog == NULL) { in bpf_program__pin_instance()
7374 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program__pin_instance()
7376 instance, prog->name, prog->instances.nr); in bpf_program__pin_instance()
7380 if (bpf_obj_pin(prog->instances.fds[instance], path)) { in bpf_program__pin_instance()
7391 int bpf_program__unpin_instance(struct bpf_program *prog, const char *path, in bpf_program__unpin_instance() argument
7400 if (prog == NULL) { in bpf_program__unpin_instance()
7405 if (instance < 0 || instance >= prog->instances.nr) { in bpf_program__unpin_instance()
7407 instance, prog->name, prog->instances.nr); in bpf_program__unpin_instance()
7419 int bpf_program__pin(struct bpf_program *prog, const char *path) in bpf_program__pin() argument
7431 if (prog == NULL) { in bpf_program__pin()
7436 if (prog->instances.nr <= 0) { in bpf_program__pin()
7437 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__pin()
7441 if (prog->instances.nr == 1) { in bpf_program__pin()
7443 return bpf_program__pin_instance(prog, path, 0); in bpf_program__pin()
7446 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__pin()
7459 err = bpf_program__pin_instance(prog, buf, i); in bpf_program__pin()
7477 bpf_program__unpin_instance(prog, buf, i); in bpf_program__pin()
7485 int bpf_program__unpin(struct bpf_program *prog, const char *path) in bpf_program__unpin() argument
7493 if (prog == NULL) { in bpf_program__unpin()
7498 if (prog->instances.nr <= 0) { in bpf_program__unpin()
7499 pr_warn("no instances of prog %s to pin\n", prog->name); in bpf_program__unpin()
7503 if (prog->instances.nr == 1) { in bpf_program__unpin()
7505 return bpf_program__unpin_instance(prog, path, 0); in bpf_program__unpin()
7508 for (i = 0; i < prog->instances.nr; i++) { in bpf_program__unpin()
7518 err = bpf_program__unpin_instance(prog, buf, i); in bpf_program__unpin()
7740 struct bpf_program *prog; in bpf_object__pin_programs() local
7751 bpf_object__for_each_program(prog, obj) { in bpf_object__pin_programs()
7756 prog->pin_name); in bpf_object__pin_programs()
7765 err = bpf_program__pin(prog, buf); in bpf_object__pin_programs()
7773 while ((prog = bpf_program__prev(prog, obj))) { in bpf_object__pin_programs()
7778 prog->pin_name); in bpf_object__pin_programs()
7784 bpf_program__unpin(prog, buf); in bpf_object__pin_programs()
7792 struct bpf_program *prog; in bpf_object__unpin_programs() local
7798 bpf_object__for_each_program(prog, obj) { in bpf_object__unpin_programs()
7803 prog->pin_name); in bpf_object__unpin_programs()
7809 err = bpf_program__unpin(prog, buf); in bpf_object__unpin_programs()
7987 struct bpf_program *prog = prev; in bpf_program__next() local
7990 prog = __bpf_program__iter(prog, obj, true); in bpf_program__next()
7991 } while (prog && prog_is_subprog(obj, prog)); in bpf_program__next()
7993 return prog; in bpf_program__next()
7999 struct bpf_program *prog = next; in bpf_program__prev() local
8002 prog = __bpf_program__iter(prog, obj, false); in bpf_program__prev()
8003 } while (prog && prog_is_subprog(obj, prog)); in bpf_program__prev()
8005 return prog; in bpf_program__prev()
8008 int bpf_program__set_priv(struct bpf_program *prog, void *priv, in bpf_program__set_priv() argument
8011 if (prog->priv && prog->clear_priv) in bpf_program__set_priv()
8012 prog->clear_priv(prog, prog->priv); in bpf_program__set_priv()
8014 prog->priv = priv; in bpf_program__set_priv()
8015 prog->clear_priv = clear_priv; in bpf_program__set_priv()
8019 void *bpf_program__priv(const struct bpf_program *prog) in bpf_program__priv() argument
8021 return prog ? prog->priv : ERR_PTR(-EINVAL); in bpf_program__priv()
8024 void bpf_program__set_ifindex(struct bpf_program *prog, __u32 ifindex) in bpf_program__set_ifindex() argument
8026 prog->prog_ifindex = ifindex; in bpf_program__set_ifindex()
8029 const char *bpf_program__name(const struct bpf_program *prog) in bpf_program__name() argument
8031 return prog->name; in bpf_program__name()
8034 const char *bpf_program__section_name(const struct bpf_program *prog) in bpf_program__section_name() argument
8036 return prog->sec_name; in bpf_program__section_name()
8039 const char *bpf_program__title(const struct bpf_program *prog, bool needs_copy) in bpf_program__title() argument
8043 title = prog->sec_name; in bpf_program__title()
8055 bool bpf_program__autoload(const struct bpf_program *prog) in bpf_program__autoload() argument
8057 return prog->load; in bpf_program__autoload()
8060 int bpf_program__set_autoload(struct bpf_program *prog, bool autoload) in bpf_program__set_autoload() argument
8062 if (prog->obj->loaded) in bpf_program__set_autoload()
8065 prog->load = autoload; in bpf_program__set_autoload()
8069 int bpf_program__fd(const struct bpf_program *prog) in bpf_program__fd() argument
8071 return bpf_program__nth_fd(prog, 0); in bpf_program__fd()
8074 size_t bpf_program__size(const struct bpf_program *prog) in bpf_program__size() argument
8076 return prog->insns_cnt * BPF_INSN_SZ; in bpf_program__size()
8079 int bpf_program__set_prep(struct bpf_program *prog, int nr_instances, in bpf_program__set_prep() argument
8087 if (prog->instances.nr > 0 || prog->instances.fds) { in bpf_program__set_prep()
8101 prog->instances.nr = nr_instances; in bpf_program__set_prep()
8102 prog->instances.fds = instances_fds; in bpf_program__set_prep()
8103 prog->preprocessor = prep; in bpf_program__set_prep()
8107 int bpf_program__nth_fd(const struct bpf_program *prog, int n) in bpf_program__nth_fd() argument
8111 if (!prog) in bpf_program__nth_fd()
8114 if (n >= prog->instances.nr || n < 0) { in bpf_program__nth_fd()
8116 n, prog->name, prog->instances.nr); in bpf_program__nth_fd()
8120 fd = prog->instances.fds[n]; in bpf_program__nth_fd()
8123 n, prog->name); in bpf_program__nth_fd()
8130 enum bpf_prog_type bpf_program__get_type(struct bpf_program *prog) in bpf_program__get_type() argument
8132 return prog->type; in bpf_program__get_type()
8135 void bpf_program__set_type(struct bpf_program *prog, enum bpf_prog_type type) in bpf_program__set_type() argument
8137 prog->type = type; in bpf_program__set_type()
8140 static bool bpf_program__is_type(const struct bpf_program *prog, in bpf_program__is_type() argument
8143 return prog ? (prog->type == type) : false; in bpf_program__is_type()
8147 int bpf_program__set_##NAME(struct bpf_program *prog) \
8149 if (!prog) \
8151 bpf_program__set_type(prog, TYPE); \
8155 bool bpf_program__is_##NAME(const struct bpf_program *prog) \
8157 return bpf_program__is_type(prog, TYPE); \
8175 bpf_program__get_expected_attach_type(struct bpf_program *prog) in bpf_program__get_expected_attach_type() argument
8177 return prog->expected_attach_type; in bpf_program__get_expected_attach_type()
8180 void bpf_program__set_expected_attach_type(struct bpf_program *prog, in bpf_program__set_expected_attach_type() argument
8183 prog->expected_attach_type = type; in bpf_program__set_expected_attach_type()
8226 struct bpf_program *prog);
8228 struct bpf_program *prog);
8230 struct bpf_program *prog);
8232 struct bpf_program *prog);
8234 struct bpf_program *prog);
8236 struct bpf_program *prog);
8478 struct bpf_program *prog; in bpf_object__collect_st_ops_relos() local
8550 prog = find_prog_by_sec_insn(obj, shdr_idx, insn_idx); in bpf_object__collect_st_ops_relos()
8551 if (!prog) { in bpf_object__collect_st_ops_relos()
8557 if (prog->type == BPF_PROG_TYPE_UNSPEC) { in bpf_object__collect_st_ops_relos()
8560 sec_def = find_sec_def(prog->sec_name); in bpf_object__collect_st_ops_relos()
8564 prog->type = sec_def->prog_type; in bpf_object__collect_st_ops_relos()
8568 prog->type = BPF_PROG_TYPE_STRUCT_OPS; in bpf_object__collect_st_ops_relos()
8569 prog->attach_btf_id = st_ops->type_id; in bpf_object__collect_st_ops_relos()
8570 prog->expected_attach_type = member_idx; in bpf_object__collect_st_ops_relos()
8571 } else if (prog->type != BPF_PROG_TYPE_STRUCT_OPS || in bpf_object__collect_st_ops_relos()
8572 prog->attach_btf_id != st_ops->type_id || in bpf_object__collect_st_ops_relos()
8573 prog->expected_attach_type != member_idx) { in bpf_object__collect_st_ops_relos()
8576 st_ops->progs[member_idx] = prog; in bpf_object__collect_st_ops_relos()
8583 map->name, prog->name, prog->sec_name, prog->type, in bpf_object__collect_st_ops_relos()
8584 prog->attach_btf_id, prog->expected_attach_type, name); in bpf_object__collect_st_ops_relos()
8683 static int libbpf_find_attach_btf_id(struct bpf_program *prog) in libbpf_find_attach_btf_id() argument
8685 enum bpf_attach_type attach_type = prog->expected_attach_type; in libbpf_find_attach_btf_id()
8686 __u32 attach_prog_fd = prog->attach_prog_fd; in libbpf_find_attach_btf_id()
8687 const char *name = prog->sec_name; in libbpf_find_attach_btf_id()
8702 err = __find_vmlinux_btf_id(prog->obj->btf_vmlinux, in libbpf_find_attach_btf_id()
8988 struct bpf_program *prog, *first_prog = NULL; in bpf_prog_load_xattr() local
9005 bpf_object__for_each_program(prog, obj) { in bpf_prog_load_xattr()
9013 bpf_program__set_type(prog, attr->prog_type); in bpf_prog_load_xattr()
9014 bpf_program__set_expected_attach_type(prog, in bpf_prog_load_xattr()
9017 if (bpf_program__get_type(prog) == BPF_PROG_TYPE_UNSPEC) { in bpf_prog_load_xattr()
9026 prog->prog_ifindex = attr->ifindex; in bpf_prog_load_xattr()
9027 prog->log_level = attr->log_level; in bpf_prog_load_xattr()
9028 prog->prog_flags |= attr->prog_flags; in bpf_prog_load_xattr()
9030 first_prog = prog; in bpf_prog_load_xattr()
9064 int bpf_link__update_program(struct bpf_link *link, struct bpf_program *prog) in bpf_link__update_program() argument
9066 return bpf_link_update(bpf_link__fd(link), bpf_program__fd(prog), NULL); in bpf_link__update_program()
9206 struct bpf_link *bpf_program__attach_perf_event(struct bpf_program *prog, in bpf_program__attach_perf_event() argument
9215 prog->name, pfd); in bpf_program__attach_perf_event()
9218 prog_fd = bpf_program__fd(prog); in bpf_program__attach_perf_event()
9221 prog->name); in bpf_program__attach_perf_event()
9235 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event()
9238 prog->name, pfd); in bpf_program__attach_perf_event()
9245 prog->name, pfd, libbpf_strerror_r(err, errmsg, sizeof(errmsg))); in bpf_program__attach_perf_event()
9356 struct bpf_link *bpf_program__attach_kprobe(struct bpf_program *prog, in bpf_program__attach_kprobe() argument
9368 prog->name, retprobe ? "kretprobe" : "kprobe", func_name, in bpf_program__attach_kprobe()
9372 link = bpf_program__attach_perf_event(prog, pfd); in bpf_program__attach_kprobe()
9377 prog->name, retprobe ? "kretprobe" : "kprobe", func_name, in bpf_program__attach_kprobe()
9385 struct bpf_program *prog) in attach_kprobe() argument
9390 func_name = prog->sec_name + sec->len; in attach_kprobe()
9393 return bpf_program__attach_kprobe(prog, retprobe, func_name); in attach_kprobe()
9396 struct bpf_link *bpf_program__attach_uprobe(struct bpf_program *prog, in bpf_program__attach_uprobe() argument
9409 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe()
9414 link = bpf_program__attach_perf_event(prog, pfd); in bpf_program__attach_uprobe()
9419 prog->name, retprobe ? "uretprobe" : "uprobe", in bpf_program__attach_uprobe()
9477 struct bpf_link *bpf_program__attach_tracepoint(struct bpf_program *prog, in bpf_program__attach_tracepoint() argument
9488 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint()
9492 link = bpf_program__attach_perf_event(prog, pfd); in bpf_program__attach_tracepoint()
9497 prog->name, tp_category, tp_name, in bpf_program__attach_tracepoint()
9505 struct bpf_program *prog) in attach_tp() argument
9510 sec_name = strdup(prog->sec_name); in attach_tp()
9524 link = bpf_program__attach_tracepoint(prog, tp_cat, tp_name); in attach_tp()
9530 struct bpf_link *bpf_program__attach_raw_tracepoint(struct bpf_program *prog, in bpf_program__attach_raw_tracepoint() argument
9537 prog_fd = bpf_program__fd(prog); in bpf_program__attach_raw_tracepoint()
9539 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_raw_tracepoint()
9553 prog->name, tp_name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_raw_tracepoint()
9561 struct bpf_program *prog) in attach_raw_tp() argument
9563 const char *tp_name = prog->sec_name + sec->len; in attach_raw_tp()
9565 return bpf_program__attach_raw_tracepoint(prog, tp_name); in attach_raw_tp()
9569 static struct bpf_link *bpf_program__attach_btf_id(struct bpf_program *prog) in bpf_program__attach_btf_id() argument
9575 prog_fd = bpf_program__fd(prog); in bpf_program__attach_btf_id()
9577 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_btf_id()
9591 prog->name, libbpf_strerror_r(pfd, errmsg, sizeof(errmsg))); in bpf_program__attach_btf_id()
9598 struct bpf_link *bpf_program__attach_trace(struct bpf_program *prog) in bpf_program__attach_trace() argument
9600 return bpf_program__attach_btf_id(prog); in bpf_program__attach_trace()
9603 struct bpf_link *bpf_program__attach_lsm(struct bpf_program *prog) in bpf_program__attach_lsm() argument
9605 return bpf_program__attach_btf_id(prog); in bpf_program__attach_lsm()
9609 struct bpf_program *prog) in attach_trace() argument
9611 return bpf_program__attach_trace(prog); in attach_trace()
9615 struct bpf_program *prog) in attach_lsm() argument
9617 return bpf_program__attach_lsm(prog); in attach_lsm()
9621 struct bpf_program *prog) in attach_iter() argument
9623 return bpf_program__attach_iter(prog, NULL); in attach_iter()
9627 bpf_program__attach_fd(struct bpf_program *prog, int target_fd, int btf_id, in bpf_program__attach_fd() argument
9637 prog_fd = bpf_program__fd(prog); in bpf_program__attach_fd()
9639 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_fd()
9648 attach_type = bpf_program__get_expected_attach_type(prog); in bpf_program__attach_fd()
9654 prog->name, target_name, in bpf_program__attach_fd()
9663 bpf_program__attach_cgroup(struct bpf_program *prog, int cgroup_fd) in bpf_program__attach_cgroup() argument
9665 return bpf_program__attach_fd(prog, cgroup_fd, 0, "cgroup"); in bpf_program__attach_cgroup()
9669 bpf_program__attach_netns(struct bpf_program *prog, int netns_fd) in bpf_program__attach_netns() argument
9671 return bpf_program__attach_fd(prog, netns_fd, 0, "netns"); in bpf_program__attach_netns()
9674 struct bpf_link *bpf_program__attach_xdp(struct bpf_program *prog, int ifindex) in bpf_program__attach_xdp() argument
9677 return bpf_program__attach_fd(prog, ifindex, 0, "xdp"); in bpf_program__attach_xdp()
9680 struct bpf_link *bpf_program__attach_freplace(struct bpf_program *prog, in bpf_program__attach_freplace() argument
9688 prog->name); in bpf_program__attach_freplace()
9692 if (prog->type != BPF_PROG_TYPE_EXT) { in bpf_program__attach_freplace()
9694 prog->name); in bpf_program__attach_freplace()
9703 return bpf_program__attach_fd(prog, target_fd, btf_id, "freplace"); in bpf_program__attach_freplace()
9708 return bpf_program__attach_trace(prog); in bpf_program__attach_freplace()
9713 bpf_program__attach_iter(struct bpf_program *prog, in bpf_program__attach_iter() argument
9728 prog_fd = bpf_program__fd(prog); in bpf_program__attach_iter()
9730 pr_warn("prog '%s': can't attach before loaded\n", prog->name); in bpf_program__attach_iter()
9745 prog->name, libbpf_strerror_r(link_fd, errmsg, sizeof(errmsg))); in bpf_program__attach_iter()
9752 struct bpf_link *bpf_program__attach(struct bpf_program *prog) in bpf_program__attach() argument
9756 sec_def = find_sec_def(prog->sec_name); in bpf_program__attach()
9760 return sec_def->attach_fn(sec_def, prog); in bpf_program__attach()
9789 struct bpf_program *prog = st_ops->progs[i]; in bpf_map__attach_struct_ops() local
9793 if (!prog) in bpf_map__attach_struct_ops()
9796 prog_fd = bpf_program__fd(prog); in bpf_map__attach_struct_ops()
10577 int bpf_program__set_attach_target(struct bpf_program *prog, in bpf_program__set_attach_target() argument
10583 if (!prog || attach_prog_fd < 0 || !attach_func_name) in bpf_program__set_attach_target()
10591 prog->expected_attach_type); in bpf_program__set_attach_target()
10596 prog->attach_btf_id = btf_id; in bpf_program__set_attach_target()
10597 prog->attach_prog_fd = attach_prog_fd; in bpf_program__set_attach_target()
10751 struct bpf_program **prog = s->progs[i].prog; in bpf_object__open_skeleton() local
10754 *prog = bpf_object__find_program_by_name(obj, name); in bpf_object__open_skeleton()
10755 if (!*prog) { in bpf_object__open_skeleton()
10822 struct bpf_program *prog = *s->progs[i].prog; in bpf_object__attach_skeleton() local
10826 if (!prog->load) in bpf_object__attach_skeleton()
10829 sec_def = find_sec_def(prog->sec_name); in bpf_object__attach_skeleton()
10833 *link = sec_def->attach_fn(sec_def, prog); in bpf_object__attach_skeleton()
10836 bpf_program__name(prog), PTR_ERR(*link)); in bpf_object__attach_skeleton()