perf bpf: Support BPF program attach to tracepoints
To support
98b5c2c65c29 ("perf, bpf: allow bpf programs attach to
tracepoints"), this patch allows BPF scripts to select tracepoints in
their section name.
Example:
# cat test_tracepoint.c
/*********************************************/
#include <uapi/linux/bpf.h>
#define SEC(NAME) __attribute__((section(NAME), used))
SEC("raw_syscalls:sys_enter")
int func(void *ctx)
{
/*
* /sys/kernel/debug/tracing/events/raw_syscalls/sys_enter/format:
* ...
* field:long id; offset:8; size:8; signed:1;
* ...
* ctx + 8 select 'id'
*/
u64 id = *((u64 *)(ctx + 8));
if (id == 1)
return 1;
return 0;
}
SEC("_write=sys_write")
int _write(void *ctx)
{
return 1;
}
char _license[] SEC("license") = "GPL";
int _version SEC("version") = LINUX_VERSION_CODE;
/*********************************************/
# perf record -e ./test_tracepoint.c dd if=/dev/zero of=/dev/null count=5
5+0 records in
5+0 records out
2560 bytes (2.6 kB) copied, 6.2281e-05 s, 41.1 MB/s
[ perf record: Woken up 1 times to write data ]
# perf script
dd 13436 [005] 1596.490869: raw_syscalls:sys_enter: NR 1 (1,
178d000, 200,
7ffe82470d60,
ffffffffffffe020, fffff
dd 13436 [005] 1596.490871: perf_bpf_probe:_write: (
ffffffff812351e0)
dd 13436 [005] 1596.490873: raw_syscalls:sys_enter: NR 1 (1,
178d000, 200,
ffffffffffffe000,
ffffffffffffe020, f
dd 13436 [005] 1596.490874: perf_bpf_probe:_write: (
ffffffff812351e0)
dd 13436 [005] 1596.490876: raw_syscalls:sys_enter: NR 1 (1,
178d000, 200,
ffffffffffffe000,
ffffffffffffe020, f
dd 13436 [005] 1596.490876: perf_bpf_probe:_write: (
ffffffff812351e0)
dd 13436 [005] 1596.490878: raw_syscalls:sys_enter: NR 1 (1,
178d000, 200,
ffffffffffffe000,
ffffffffffffe020, f
dd 13436 [005] 1596.490879: perf_bpf_probe:_write: (
ffffffff812351e0)
dd 13436 [005] 1596.490881: raw_syscalls:sys_enter: NR 1 (1,
178d000, 200,
ffffffffffffe000,
ffffffffffffe020, f
dd 13436 [005] 1596.490882: perf_bpf_probe:_write: (
ffffffff812351e0)
dd 13436 [005] 1596.490900: raw_syscalls:sys_enter: NR 1 (2,
7ffe8246e640, 1f, 40acb8,
7f44bac74700,
7f44baa4fba
dd 13436 [005] 1596.490901: perf_bpf_probe:_write: (
ffffffff812351e0)
dd 13436 [005] 1596.490917: raw_syscalls:sys_enter: NR 1 (2,
7ffe8246e640, 1a,
fffffffa,
7f44bac74700,
7f44baa4f
dd 13436 [005] 1596.490918: perf_bpf_probe:_write: (
ffffffff812351e0)
dd 13436 [005] 1596.490932: raw_syscalls:sys_enter: NR 1 (2,
7ffe8246e640, 1a,
fffffff9,
7f44bac74700,
7f44baa4f
dd 13436 [005] 1596.490933: perf_bpf_probe:_write: (
ffffffff812351e0)
Committer note:
Further testing:
# trace --no-sys --event /home/acme/bpf/tracepoint.c cat /etc/passwd > /dev/null
0.000 raw_syscalls:sys_enter:NR 1 (1,
7f0490504000, c48,
7f0490503010,
ffffffffffffffff, 0))
0.006 perf_bpf_probe:_write:(
ffffffff81241bc0))
#
Signed-off-by: Wang Nan <wangnan0@huawei.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Alexei Starovoitov <ast@kernel.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Zefan Li <lizefan@huawei.com>
Cc: pi3orama@163.com
Link: http://lkml.kernel.org/r/1468406646-21642-6-git-send-email-wangnan0@huawei.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>