introduce BPF_PROG_TYPE_TRACEPOINT program type and allow it to be attached to the perf tracepoint handler, which will copy the arguments into the per-cpu buffer and pass it to the bpf program as its first argument. The layout of the fields can be discovered by doing 'cat /sys/kernel/debug/tracing/events/sched/sched_switch/format' prior to the compilation of the program with exception that first 8 bytes are reserved and not accessible to the program. This area is used to store the pointer to 'struct pt_regs' which some of the bpf helpers will use: +---------+ | 8 bytes | hidden 'struct pt_regs *' (inaccessible to bpf program) +---------+ | N bytes | static tracepoint fields defined in tracepoint/format (bpf readonly) +---------+ | dynamic | __dynamic_array bytes of tracepoint (inaccessible to bpf yet) +---------+ Not that all of the fields are already dumped to user space via perf ring buffer and broken application access it directly without consulting tracepoint/format. Same rule applies here: static tracepoint fields should only be accessed in a format defined in tracepoint/format. The order of fields and field sizes are not an ABI.
Showing the changes to include/uapi (1 of 3 files). Show all
Unified · Split
| @@ -92,6 +92,7 @@ enum bpf_prog_type { · 91 unmodified lines | |||
| 92 | BPF_PROG_TYPE_KPROBE, | 92 | BPF_PROG_TYPE_KPROBE, |
| 93 | BPF_PROG_TYPE_SCHED_CLS, | 93 | BPF_PROG_TYPE_SCHED_CLS, |
| 94 | BPF_PROG_TYPE_SCHED_ACT, | 94 | BPF_PROG_TYPE_SCHED_ACT, |
| 95 | BPF_PROG_TYPE_TRACEPOINT, | ||
| 95 | }; | 96 | }; |
| 96 | 97 | ||
| 97 | #define BPF_PSEUDO_MAP_FD 1 | 98 | #define BPF_PSEUDO_MAP_FD 1 |