xref: /aosp_15_r20/external/bcc/libbpf-tools/slabratetop.bpf.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker /* SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause) */
2*387f9dfdSAndroid Build Coastguard Worker /* Copyright (c) 2022 Rong Tao */
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_core_read.h>
6*387f9dfdSAndroid Build Coastguard Worker #include <bpf/bpf_tracing.h>
7*387f9dfdSAndroid Build Coastguard Worker #include "slabratetop.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 pid_t target_pid = 0;
12*387f9dfdSAndroid Build Coastguard Worker 
13*387f9dfdSAndroid Build Coastguard Worker static struct slabrate_info slab_zero_value = {};
14*387f9dfdSAndroid Build Coastguard Worker 
15*387f9dfdSAndroid Build Coastguard Worker struct {
16*387f9dfdSAndroid Build Coastguard Worker 	__uint(type, BPF_MAP_TYPE_HASH);
17*387f9dfdSAndroid Build Coastguard Worker 	__uint(max_entries, MAX_ENTRIES);
18*387f9dfdSAndroid Build Coastguard Worker 	__type(key, char *);
19*387f9dfdSAndroid Build Coastguard Worker 	__type(value, struct slabrate_info);
20*387f9dfdSAndroid Build Coastguard Worker } slab_entries SEC(".maps");
21*387f9dfdSAndroid Build Coastguard Worker 
probe_entry(struct kmem_cache * cachep)22*387f9dfdSAndroid Build Coastguard Worker static int probe_entry(struct kmem_cache *cachep)
23*387f9dfdSAndroid Build Coastguard Worker {
24*387f9dfdSAndroid Build Coastguard Worker 	__u64 pid_tgid = bpf_get_current_pid_tgid();
25*387f9dfdSAndroid Build Coastguard Worker 	__u32 pid = pid_tgid >> 32;
26*387f9dfdSAndroid Build Coastguard Worker 	struct slabrate_info *valuep;
27*387f9dfdSAndroid Build Coastguard Worker 	const char *name = BPF_CORE_READ(cachep, name);
28*387f9dfdSAndroid Build Coastguard Worker 
29*387f9dfdSAndroid Build Coastguard Worker 	if (target_pid && target_pid != pid)
30*387f9dfdSAndroid Build Coastguard Worker 		return 0;
31*387f9dfdSAndroid Build Coastguard Worker 
32*387f9dfdSAndroid Build Coastguard Worker 	valuep = bpf_map_lookup_elem(&slab_entries, &name);
33*387f9dfdSAndroid Build Coastguard Worker 	if (!valuep) {
34*387f9dfdSAndroid Build Coastguard Worker 		bpf_map_update_elem(&slab_entries, &name, &slab_zero_value, BPF_ANY);
35*387f9dfdSAndroid Build Coastguard Worker 		valuep = bpf_map_lookup_elem(&slab_entries, &name);
36*387f9dfdSAndroid Build Coastguard Worker 		if (!valuep)
37*387f9dfdSAndroid Build Coastguard Worker 			return 0;
38*387f9dfdSAndroid Build Coastguard Worker 		bpf_probe_read_kernel(&valuep->name, sizeof(valuep->name), name);
39*387f9dfdSAndroid Build Coastguard Worker 	}
40*387f9dfdSAndroid Build Coastguard Worker 
41*387f9dfdSAndroid Build Coastguard Worker 	valuep->count++;
42*387f9dfdSAndroid Build Coastguard Worker 	valuep->size += BPF_CORE_READ(cachep, size);
43*387f9dfdSAndroid Build Coastguard Worker 
44*387f9dfdSAndroid Build Coastguard Worker 	return 0;
45*387f9dfdSAndroid Build Coastguard Worker }
46*387f9dfdSAndroid Build Coastguard Worker 
47*387f9dfdSAndroid Build Coastguard Worker SEC("kprobe/kmem_cache_alloc")
BPF_KPROBE(kmem_cache_alloc,struct kmem_cache * cachep)48*387f9dfdSAndroid Build Coastguard Worker int BPF_KPROBE(kmem_cache_alloc, struct kmem_cache *cachep)
49*387f9dfdSAndroid Build Coastguard Worker {
50*387f9dfdSAndroid Build Coastguard Worker 	return probe_entry(cachep);
51*387f9dfdSAndroid Build Coastguard Worker }
52*387f9dfdSAndroid Build Coastguard Worker 
53*387f9dfdSAndroid Build Coastguard Worker char LICENSE[] SEC("license") = "Dual BSD/GPL";
54