1*387f9dfdSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*387f9dfdSAndroid Build Coastguard Worker // Copyright (c) 2020 Wenbo Zhang
3*387f9dfdSAndroid Build Coastguard Worker #include <vmlinux.h>
4*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_helpers.h>
5*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_tracing.h>
6*387f9dfdSAndroid Build Coastguard Worker #include "maps.bpf.h"
7*387f9dfdSAndroid Build Coastguard Worker #include "llcstat.h"
8*387f9dfdSAndroid Build Coastguard Worker
9*387f9dfdSAndroid Build Coastguard Worker #define MAX_ENTRIES 10240
10*387f9dfdSAndroid Build Coastguard Worker
11*387f9dfdSAndroid Build Coastguard Worker const volatile bool targ_per_thread = false;
12*387f9dfdSAndroid Build Coastguard Worker
13*387f9dfdSAndroid Build Coastguard Worker struct {
14*387f9dfdSAndroid Build Coastguard Worker __uint(type, BPF_MAP_TYPE_HASH);
15*387f9dfdSAndroid Build Coastguard Worker __uint(max_entries, MAX_ENTRIES);
16*387f9dfdSAndroid Build Coastguard Worker __type(key, struct key_info);
17*387f9dfdSAndroid Build Coastguard Worker __type(value, struct value_info);
18*387f9dfdSAndroid Build Coastguard Worker } infos SEC(".maps");
19*387f9dfdSAndroid Build Coastguard Worker
20*387f9dfdSAndroid Build Coastguard Worker static __always_inline
trace_event(__u64 sample_period,bool miss)21*387f9dfdSAndroid Build Coastguard Worker int trace_event(__u64 sample_period, bool miss)
22*387f9dfdSAndroid Build Coastguard Worker {
23*387f9dfdSAndroid Build Coastguard Worker struct key_info key = {};
24*387f9dfdSAndroid Build Coastguard Worker struct value_info *infop, zero = {};
25*387f9dfdSAndroid Build Coastguard Worker
26*387f9dfdSAndroid Build Coastguard Worker u64 pid_tgid = bpf_get_current_pid_tgid();
27*387f9dfdSAndroid Build Coastguard Worker key.cpu = bpf_get_smp_processor_id();
28*387f9dfdSAndroid Build Coastguard Worker key.pid = pid_tgid >> 32;
29*387f9dfdSAndroid Build Coastguard Worker if (targ_per_thread)
30*387f9dfdSAndroid Build Coastguard Worker key.tid = (u32)pid_tgid;
31*387f9dfdSAndroid Build Coastguard Worker else
32*387f9dfdSAndroid Build Coastguard Worker key.tid = key.pid;
33*387f9dfdSAndroid Build Coastguard Worker
34*387f9dfdSAndroid Build Coastguard Worker infop = bpf_map_lookup_or_try_init(&infos, &key, &zero);
35*387f9dfdSAndroid Build Coastguard Worker if (!infop)
36*387f9dfdSAndroid Build Coastguard Worker return 0;
37*387f9dfdSAndroid Build Coastguard Worker if (miss)
38*387f9dfdSAndroid Build Coastguard Worker infop->miss += sample_period;
39*387f9dfdSAndroid Build Coastguard Worker else
40*387f9dfdSAndroid Build Coastguard Worker infop->ref += sample_period;
41*387f9dfdSAndroid Build Coastguard Worker bpf_get_current_comm(infop->comm, sizeof(infop->comm));
42*387f9dfdSAndroid Build Coastguard Worker
43*387f9dfdSAndroid Build Coastguard Worker return 0;
44*387f9dfdSAndroid Build Coastguard Worker }
45*387f9dfdSAndroid Build Coastguard Worker
46*387f9dfdSAndroid Build Coastguard Worker SEC("perf_event")
on_cache_miss(struct bpf_perf_event_data * ctx)47*387f9dfdSAndroid Build Coastguard Worker int on_cache_miss(struct bpf_perf_event_data *ctx)
48*387f9dfdSAndroid Build Coastguard Worker {
49*387f9dfdSAndroid Build Coastguard Worker return trace_event(ctx->sample_period, true);
50*387f9dfdSAndroid Build Coastguard Worker }
51*387f9dfdSAndroid Build Coastguard Worker
52*387f9dfdSAndroid Build Coastguard Worker SEC("perf_event")
on_cache_ref(struct bpf_perf_event_data * ctx)53*387f9dfdSAndroid Build Coastguard Worker int on_cache_ref(struct bpf_perf_event_data *ctx)
54*387f9dfdSAndroid Build Coastguard Worker {
55*387f9dfdSAndroid Build Coastguard Worker return trace_event(ctx->sample_period, false);
56*387f9dfdSAndroid Build Coastguard Worker }
57*387f9dfdSAndroid Build Coastguard Worker
58*387f9dfdSAndroid Build Coastguard Worker char LICENSE[] SEC("license") = "GPL";
59