Calling get_perf_callchain() on perf_events from PEBS entries may cause unwinder errors. To fix this issue, perf subsystem fetches callchain early, and marks perf_events are marked with __PERF_SAMPLE_CALLCHAIN_EARLY. Similar issue exists when BPF program calls get_perf_callchain() via helper functions. For more information about this issue, please refer to discussions in [1]. This set fixes this issue with helper proto bpf_get_stackid_pe and bpf_get_stack_pe. [1] https://lore.kernel.org/lkml/ED7B9430-6489-4260-B3C5-9CFA2E3AA87A@xxxxxx/ Changes v3 => v4: 1. Fix error check logic in bpf_get_stackid_pe and bpf_get_stack_pe. (Alexei) 2. Do not allow attaching BPF programs with bpf_get_stack|stackid to perf_event with precise_ip > 0, but not proper callchain. (Alexei) 3. Add selftest get_stackid_cannot_attach. Changes v2 => v3: 1. Fix handling of stackmap skip field. (Andrii) 2. Simplify the code in a few places. (Andrii) Changes v1 => v2: 1. Simplify the design and avoid introducing new helper function. (Andrii) Song Liu (4): bpf: separate bpf_get_[stack|stackid] for perf events BPF bpf: fail PERF_EVENT_IOC_SET_BPF when bpf_get_[stack|stackid] cannot work selftests/bpf: add callchain_stackid selftests/bpf: add get_stackid_cannot_attach include/linux/bpf.h | 2 + include/linux/filter.h | 3 +- kernel/bpf/stackmap.c | 184 ++++++++++++++++-- kernel/bpf/verifier.c | 3 + kernel/events/core.c | 18 ++ kernel/trace/bpf_trace.c | 4 +- .../prog_tests/get_stackid_cannot_attach.c | 91 +++++++++ .../bpf/prog_tests/perf_event_stackmap.c | 116 +++++++++++ .../selftests/bpf/progs/perf_event_stackmap.c | 59 ++++++ 9 files changed, 459 insertions(+), 21 deletions(-) create mode 100644 tools/testing/selftests/bpf/prog_tests/get_stackid_cannot_attach.c create mode 100644 tools/testing/selftests/bpf/prog_tests/perf_event_stackmap.c create mode 100644 tools/testing/selftests/bpf/progs/perf_event_stackmap.c -- 2.24.1