Lines Matching +full:multi +full:- +full:attr

1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
29 union bpf_attr attr; in probe_kern_prog_name() local
32 memset(&attr, 0, attr_sz); in probe_kern_prog_name()
33 attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER; in probe_kern_prog_name()
34 attr.license = ptr_to_u64("GPL"); in probe_kern_prog_name()
35 attr.insns = ptr_to_u64(insns); in probe_kern_prog_name()
36 attr.insn_cnt = (__u32)ARRAY_SIZE(insns); in probe_kern_prog_name()
37 attr.prog_token_fd = token_fd; in probe_kern_prog_name()
39 attr.prog_flags |= BPF_F_TOKEN_FD; in probe_kern_prog_name()
40 libbpf_strlcpy(attr.prog_name, "libbpf_nametest", sizeof(attr.prog_name)); in probe_kern_prog_name()
43 ret = sys_bpf_prog_load(&attr, attr_sz, PROG_LOAD_ATTEMPTS); in probe_kern_prog_name()
67 ret = -errno; in probe_kern_global_data()
187 /* attr */ in probe_kern_btf_decl_tag()
188 BTF_TYPE_DECL_TAG_ENC(1, 2, -1), in probe_kern_btf_decl_tag()
201 /* attr */ in probe_kern_btf_type_tag()
237 * non-zero expected attach type (i.e., not a BPF_CGROUP_INET_INGRESS) in probe_kern_exp_attach_type()
253 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), /* r1 += -8 */ in probe_kern_probe_read_kernel()
283 ret = -errno; in probe_prog_bind_map()
347 return -errno; in probe_perf_link()
352 link_fd = bpf_link_create(prog_fd, -1, BPF_PERF_EVENT, NULL); in probe_perf_link()
353 err = -errno; /* close() can clobber errno */ in probe_perf_link()
359 return link_fd < 0 && err == -EBADF; in probe_perf_link()
380 return -errno; in probe_uprobe_multi_link()
382 /* Creating uprobe in '/' binary should fail with -EBADF. */ in probe_uprobe_multi_link()
387 link_fd = bpf_link_create(prog_fd, -1, BPF_TRACE_UPROBE_MULTI, &link_opts); in probe_uprobe_multi_link()
388 err = -errno; /* close() can clobber errno */ in probe_uprobe_multi_link()
390 if (link_fd >= 0 || err != -EBADF) { in probe_uprobe_multi_link()
397 /* Initial multi-uprobe support in kernel didn't handle PID filtering in probe_uprobe_multi_link()
400 * we'll pretend multi-uprobes are not supported, if not. in probe_uprobe_multi_link()
401 * Multi-uprobes are used in USDT attachment logic, and we need to be in probe_uprobe_multi_link()
402 * conservative here, because multi-uprobe selection happens early at in probe_uprobe_multi_link()
404 * attachment time, at which point it's too late to undo multi-uprobe in probe_uprobe_multi_link()
407 * Creating uprobe with pid == -1 for (invalid) '/' binary will fail in probe_uprobe_multi_link()
408 * early with -EINVAL on kernels with fixed PID filtering logic; in probe_uprobe_multi_link()
409 * otherwise -ESRCH would be returned if passed correct binary path in probe_uprobe_multi_link()
410 * (but we'll just get -BADF, of course). in probe_uprobe_multi_link()
412 link_opts.uprobe_multi.pid = -1; /* invalid PID */ in probe_uprobe_multi_link()
417 link_fd = bpf_link_create(prog_fd, -1, BPF_TRACE_UPROBE_MULTI, &link_opts); in probe_uprobe_multi_link()
418 err = -errno; /* close() can clobber errno */ in probe_uprobe_multi_link()
424 return link_fd < 0 && err == -EINVAL; in probe_uprobe_multi_link()
460 /* [2] PTR -> VOID */ in probe_kern_arg_ctx_tag()
465 /* [4] FUNC 'a' -> FUNC_PROTO (main prog) */ in probe_kern_arg_ctx_tag()
470 /* [6] FUNC 'b' -> FUNC_PROTO (subprog) */ in probe_kern_arg_ctx_tag()
472 /* [7] DECL_TAG 'arg:ctx' -> func 'b' arg 'b' */ in probe_kern_arg_ctx_tag()
484 { 0, 4 }, /* main prog -> FUNC 'a' */ in probe_kern_arg_ctx_tag()
485 { 2, 6 }, /* subprog -> FUNC 'b' */ in probe_kern_arg_ctx_tag()
532 ret = -errno; in probe_ldimm64_full_range_off()
541 ret = -errno; in probe_ldimm64_full_range_off()
548 return -EINVAL; in probe_ldimm64_full_range_off()
626 "memcg-based memory accounting", probe_memcg_account,
638 "BPF multi-uprobe link support", probe_uprobe_multi_link,
641 "kernel-side __arg_ctx tag", probe_kern_arg_ctx_tag,
660 if (READ_ONCE(cache->res[feat_id]) == FEAT_UNKNOWN) { in feat_supported()
661 ret = feat->probe(cache->token_fd); in feat_supported()
663 WRITE_ONCE(cache->res[feat_id], FEAT_SUPPORTED); in feat_supported()
665 WRITE_ONCE(cache->res[feat_id], FEAT_MISSING); in feat_supported()
668 feat->desc, errstr(ret)); in feat_supported()
669 WRITE_ONCE(cache->res[feat_id], FEAT_MISSING); in feat_supported()
673 return READ_ONCE(cache->res[feat_id]) == FEAT_SUPPORTED; in feat_supported()