mirror of
https://github.com/netdata/libbpf.git
synced 2026-04-07 17:19:07 +08:00
libbpf: Support detecting and attaching of writable tracepoint program
Program on writable tracepoint is BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE, but its attachment is the same as BPF_PROG_TYPE_RAW_TRACEPOINT. Signed-off-by: Hou Tao <houtao1@huawei.com> Signed-off-by: Andrii Nakryiko <andrii@kernel.org> Link: https://lore.kernel.org/bpf/20211004094857.30868-3-hotforest@gmail.com
This commit is contained in:
26
src/libbpf.c
26
src/libbpf.c
@@ -8078,6 +8078,8 @@ static const struct bpf_sec_def section_defs[] = {
|
|||||||
SEC_DEF("tp/", TRACEPOINT, 0, SEC_NONE, attach_tp),
|
SEC_DEF("tp/", TRACEPOINT, 0, SEC_NONE, attach_tp),
|
||||||
SEC_DEF("raw_tracepoint/", RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp),
|
SEC_DEF("raw_tracepoint/", RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp),
|
||||||
SEC_DEF("raw_tp/", RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp),
|
SEC_DEF("raw_tp/", RAW_TRACEPOINT, 0, SEC_NONE, attach_raw_tp),
|
||||||
|
SEC_DEF("raw_tracepoint.w/", RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp),
|
||||||
|
SEC_DEF("raw_tp.w/", RAW_TRACEPOINT_WRITABLE, 0, SEC_NONE, attach_raw_tp),
|
||||||
SEC_DEF("tp_btf/", TRACING, BPF_TRACE_RAW_TP, SEC_ATTACH_BTF, attach_trace),
|
SEC_DEF("tp_btf/", TRACING, BPF_TRACE_RAW_TP, SEC_ATTACH_BTF, attach_trace),
|
||||||
SEC_DEF("fentry/", TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF, attach_trace),
|
SEC_DEF("fentry/", TRACING, BPF_TRACE_FENTRY, SEC_ATTACH_BTF, attach_trace),
|
||||||
SEC_DEF("fmod_ret/", TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF, attach_trace),
|
SEC_DEF("fmod_ret/", TRACING, BPF_MODIFY_RETURN, SEC_ATTACH_BTF, attach_trace),
|
||||||
@@ -9847,12 +9849,26 @@ struct bpf_link *bpf_program__attach_raw_tracepoint(const struct bpf_program *pr
|
|||||||
|
|
||||||
static struct bpf_link *attach_raw_tp(const struct bpf_program *prog, long cookie)
|
static struct bpf_link *attach_raw_tp(const struct bpf_program *prog, long cookie)
|
||||||
{
|
{
|
||||||
const char *tp_name;
|
static const char *const prefixes[] = {
|
||||||
|
"raw_tp/",
|
||||||
|
"raw_tracepoint/",
|
||||||
|
"raw_tp.w/",
|
||||||
|
"raw_tracepoint.w/",
|
||||||
|
};
|
||||||
|
size_t i;
|
||||||
|
const char *tp_name = NULL;
|
||||||
|
|
||||||
if (str_has_pfx(prog->sec_name, "raw_tp/"))
|
for (i = 0; i < ARRAY_SIZE(prefixes); i++) {
|
||||||
tp_name = prog->sec_name + sizeof("raw_tp/") - 1;
|
if (str_has_pfx(prog->sec_name, prefixes[i])) {
|
||||||
else
|
tp_name = prog->sec_name + strlen(prefixes[i]);
|
||||||
tp_name = prog->sec_name + sizeof("raw_tracepoint/") - 1;
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!tp_name) {
|
||||||
|
pr_warn("prog '%s': invalid section name '%s'\n",
|
||||||
|
prog->name, prog->sec_name);
|
||||||
|
return libbpf_err_ptr(-EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
return bpf_program__attach_raw_tracepoint(prog, tp_name);
|
return bpf_program__attach_raw_tracepoint(prog, tp_name);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user