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

1 // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
30 union bpf_attr attr; in probe_kern_prog_name() local
33 memset(&attr, 0, attr_sz); in probe_kern_prog_name()
34 attr.prog_type = BPF_PROG_TYPE_SOCKET_FILTER; in probe_kern_prog_name()
35 attr.license = ptr_to_u64("GPL"); in probe_kern_prog_name()
36 attr.insns = ptr_to_u64(insns); in probe_kern_prog_name()
37 attr.insn_cnt = (__u32)ARRAY_SIZE(insns); in probe_kern_prog_name()
38 attr.prog_token_fd = token_fd; in probe_kern_prog_name()
40 attr.prog_flags |= BPF_F_TOKEN_FD; in probe_kern_prog_name()
41 libbpf_strlcpy(attr.prog_name, "libbpf_nametest", sizeof(attr.prog_name)); in probe_kern_prog_name()
44 ret = sys_bpf_prog_load(&attr, attr_sz, PROG_LOAD_ATTEMPTS); in probe_kern_prog_name()
68 ret = -errno; in probe_kern_global_data()
188 /* attr */ in probe_kern_btf_decl_tag()
189 BTF_TYPE_DECL_TAG_ENC(1, 2, -1), in probe_kern_btf_decl_tag()
202 /* attr */ in probe_kern_btf_type_tag()
238 * non-zero expected attach type (i.e., not a BPF_CGROUP_INET_INGRESS) in probe_kern_exp_attach_type()
254 BPF_ALU64_IMM(BPF_ADD, BPF_REG_1, -8), /* r1 += -8 */ in probe_kern_probe_read_kernel()
284 ret = -errno; in probe_prog_bind_map()
348 return -errno; in probe_perf_link()
353 link_fd = bpf_link_create(prog_fd, -1, BPF_PERF_EVENT, NULL); in probe_perf_link()
354 err = -errno; /* close() can clobber errno */ in probe_perf_link()
360 return link_fd < 0 && err == -EBADF; in probe_perf_link()
381 return -errno; in probe_uprobe_multi_link()
383 /* Creating uprobe in '/' binary should fail with -EBADF. */ in probe_uprobe_multi_link()
388 link_fd = bpf_link_create(prog_fd, -1, BPF_TRACE_UPROBE_MULTI, &link_opts); in probe_uprobe_multi_link()
389 err = -errno; /* close() can clobber errno */ in probe_uprobe_multi_link()
391 if (link_fd >= 0 || err != -EBADF) { in probe_uprobe_multi_link()
398 /* Initial multi-uprobe support in kernel didn't handle PID filtering in probe_uprobe_multi_link()
401 * we'll pretend multi-uprobes are not supported, if not. in probe_uprobe_multi_link()
402 * Multi-uprobes are used in USDT attachment logic, and we need to be in probe_uprobe_multi_link()
403 * conservative here, because multi-uprobe selection happens early at in probe_uprobe_multi_link()
405 * attachment time, at which point it's too late to undo multi-uprobe in probe_uprobe_multi_link()
408 * Creating uprobe with pid == -1 for (invalid) '/' binary will fail in probe_uprobe_multi_link()
409 * early with -EINVAL on kernels with fixed PID filtering logic; in probe_uprobe_multi_link()
410 * otherwise -ESRCH would be returned if passed correct binary path in probe_uprobe_multi_link()
411 * (but we'll just get -BADF, of course). in probe_uprobe_multi_link()
413 link_opts.uprobe_multi.pid = -1; /* invalid PID */ in probe_uprobe_multi_link()
418 link_fd = bpf_link_create(prog_fd, -1, BPF_TRACE_UPROBE_MULTI, &link_opts); in probe_uprobe_multi_link()
419 err = -errno; /* close() can clobber errno */ in probe_uprobe_multi_link()
425 return link_fd < 0 && err == -EINVAL; in probe_uprobe_multi_link()
461 /* [2] PTR -> VOID */ in probe_kern_arg_ctx_tag()
466 /* [4] FUNC 'a' -> FUNC_PROTO (main prog) */ in probe_kern_arg_ctx_tag()
471 /* [6] FUNC 'b' -> FUNC_PROTO (subprog) */ in probe_kern_arg_ctx_tag()
473 /* [7] DECL_TAG 'arg:ctx' -> func 'b' arg 'b' */ in probe_kern_arg_ctx_tag()
485 { 0, 4 }, /* main prog -> FUNC 'a' */ in probe_kern_arg_ctx_tag()
486 { 2, 6 }, /* subprog -> FUNC 'b' */ in probe_kern_arg_ctx_tag()
565 "memcg-based memory accounting", probe_memcg_account,
577 "BPF multi-uprobe link support", probe_uprobe_multi_link,
580 "kernel-side __arg_ctx tag", probe_kern_arg_ctx_tag,
596 if (READ_ONCE(cache->res[feat_id]) == FEAT_UNKNOWN) { in feat_supported()
597 ret = feat->probe(cache->token_fd); in feat_supported()
599 WRITE_ONCE(cache->res[feat_id], FEAT_SUPPORTED); in feat_supported()
601 WRITE_ONCE(cache->res[feat_id], FEAT_MISSING); in feat_supported()
604 feat->desc, errstr(ret)); in feat_supported()
605 WRITE_ONCE(cache->res[feat_id], FEAT_MISSING); in feat_supported()
609 return READ_ONCE(cache->res[feat_id]) == FEAT_SUPPORTED; in feat_supported()