[PATCH 1/2] perf sample_filter.bpf: Stop using vmlinux.h generated by bpftool, use CO-RE

From: Arnaldo Carvalho de Melo
Date: Fri May 05 2023 - 08:55:18 EST


Including linux/bpf.h and linux/perf_events.h we get the UAPI structs
and then define a subset 'struct perf_sample_data' with the fields we
use in this tool while using __attribute__((preserve_access_index)) so
that at libbpf load time it can fixup the offsets according to the
'struct perf_data_sample' obtained from the running kernel BTF
(/sys/kernel/btf/vmlinux).

Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>
---
tools/perf/util/bpf_skel/sample_filter.bpf.c | 37 +++++++++++++++++++-
1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/tools/perf/util/bpf_skel/sample_filter.bpf.c b/tools/perf/util/bpf_skel/sample_filter.bpf.c
index cffe493af1ed5f31..045532c2366d74ef 100644
--- a/tools/perf/util/bpf_skel/sample_filter.bpf.c
+++ b/tools/perf/util/bpf_skel/sample_filter.bpf.c
@@ -1,12 +1,47 @@
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
// Copyright (c) 2023 Google
-#include "vmlinux.h"
+#include <linux/bpf.h>
+#include <linux/perf_event.h>
#include <bpf/bpf_helpers.h>
#include <bpf/bpf_tracing.h>
#include <bpf/bpf_core_read.h>

#include "sample-filter.h"

+// non-UAPI kernel data structures, just the fields used in this tool,
+// preserving the access index so that libbpf can fixup offsets with the ones
+// used in the kernel when loading the BPF bytecode, if they differ from what
+// is used here.
+
+struct perf_sample_data {
+ __u64 addr;
+ __u64 period;
+ union perf_sample_weight weight;
+ __u64 txn;
+ union perf_mem_data_src data_src;
+ __u64 ip;
+ struct {
+ __u32 pid;
+ __u32 tid;
+ } tid_entry;
+ __u64 time;
+ __u64 id;
+ struct {
+ __u32 cpu;
+ } cpu_entry;
+ __u64 phys_addr;
+ __u64 data_page_size;
+ __u64 code_page_size;
+} __attribute__((__aligned__(64))) __attribute__((preserve_access_index));
+
+struct bpf_perf_event_data_kern {
+ struct perf_sample_data * data;
+ struct perf_event * event;
+
+ /* size: 24, cachelines: 1, members: 3 */
+ /* last cacheline: 24 bytes */
+} __attribute__((preserve_access_index));
+
/* BPF map that will be filled by user space */
struct filters {
__uint(type, BPF_MAP_TYPE_ARRAY);
--
2.39.2