xref: /aosp_15_r20/external/bcc/libbpf-tools/javagc.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 Chen 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/usdt.bpf.h>
7*387f9dfdSAndroid Build Coastguard Worker #include "javagc.h"
8*387f9dfdSAndroid Build Coastguard Worker 
9*387f9dfdSAndroid Build Coastguard Worker struct {
10*387f9dfdSAndroid Build Coastguard Worker 	__uint(type, BPF_MAP_TYPE_HASH);
11*387f9dfdSAndroid Build Coastguard Worker 	__uint(max_entries, 100);
12*387f9dfdSAndroid Build Coastguard Worker 	__type(key, uint32_t);
13*387f9dfdSAndroid Build Coastguard Worker 	__type(value, struct data_t);
14*387f9dfdSAndroid Build Coastguard Worker } data_map SEC(".maps");
15*387f9dfdSAndroid Build Coastguard Worker 
16*387f9dfdSAndroid Build Coastguard Worker struct {
17*387f9dfdSAndroid Build Coastguard Worker 	__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
18*387f9dfdSAndroid Build Coastguard Worker 	__type(key, int);
19*387f9dfdSAndroid Build Coastguard Worker 	__type(value, int);
20*387f9dfdSAndroid Build Coastguard Worker } perf_map SEC(".maps");
21*387f9dfdSAndroid Build Coastguard Worker 
22*387f9dfdSAndroid Build Coastguard Worker __u32 time;
23*387f9dfdSAndroid Build Coastguard Worker 
gc_start(struct pt_regs * ctx)24*387f9dfdSAndroid Build Coastguard Worker static int gc_start(struct pt_regs *ctx)
25*387f9dfdSAndroid Build Coastguard Worker {
26*387f9dfdSAndroid Build Coastguard Worker 	struct data_t data = {};
27*387f9dfdSAndroid Build Coastguard Worker 
28*387f9dfdSAndroid Build Coastguard Worker 	data.cpu = bpf_get_smp_processor_id();
29*387f9dfdSAndroid Build Coastguard Worker 	data.pid = bpf_get_current_pid_tgid() >> 32;
30*387f9dfdSAndroid Build Coastguard Worker 	data.ts = bpf_ktime_get_ns();
31*387f9dfdSAndroid Build Coastguard Worker 	bpf_map_update_elem(&data_map, &data.pid, &data, 0);
32*387f9dfdSAndroid Build Coastguard Worker 	return 0;
33*387f9dfdSAndroid Build Coastguard Worker }
34*387f9dfdSAndroid Build Coastguard Worker 
gc_end(struct pt_regs * ctx)35*387f9dfdSAndroid Build Coastguard Worker static int gc_end(struct pt_regs *ctx)
36*387f9dfdSAndroid Build Coastguard Worker {
37*387f9dfdSAndroid Build Coastguard Worker 	struct data_t data = {};
38*387f9dfdSAndroid Build Coastguard Worker 	struct data_t *p;
39*387f9dfdSAndroid Build Coastguard Worker 	__u32 val;
40*387f9dfdSAndroid Build Coastguard Worker 
41*387f9dfdSAndroid Build Coastguard Worker 	data.cpu = bpf_get_smp_processor_id();
42*387f9dfdSAndroid Build Coastguard Worker 	data.pid = bpf_get_current_pid_tgid() >> 32;
43*387f9dfdSAndroid Build Coastguard Worker 	data.ts = bpf_ktime_get_ns();
44*387f9dfdSAndroid Build Coastguard Worker 	p = bpf_map_lookup_elem(&data_map, &data.pid);
45*387f9dfdSAndroid Build Coastguard Worker 	if (!p)
46*387f9dfdSAndroid Build Coastguard Worker 		return 0;
47*387f9dfdSAndroid Build Coastguard Worker 
48*387f9dfdSAndroid Build Coastguard Worker 	val = data.ts - p->ts;
49*387f9dfdSAndroid Build Coastguard Worker 	if (val > time) {
50*387f9dfdSAndroid Build Coastguard Worker 		data.ts = val;
51*387f9dfdSAndroid Build Coastguard Worker 		bpf_perf_event_output(ctx, &perf_map, BPF_F_CURRENT_CPU, &data, sizeof(data));
52*387f9dfdSAndroid Build Coastguard Worker 	}
53*387f9dfdSAndroid Build Coastguard Worker 	bpf_map_delete_elem(&data_map, &data.pid);
54*387f9dfdSAndroid Build Coastguard Worker 	return 0;
55*387f9dfdSAndroid Build Coastguard Worker }
56*387f9dfdSAndroid Build Coastguard Worker 
57*387f9dfdSAndroid Build Coastguard Worker SEC("usdt")
handle_gc_start(struct pt_regs * ctx)58*387f9dfdSAndroid Build Coastguard Worker int handle_gc_start(struct pt_regs *ctx)
59*387f9dfdSAndroid Build Coastguard Worker {
60*387f9dfdSAndroid Build Coastguard Worker 	return gc_start(ctx);
61*387f9dfdSAndroid Build Coastguard Worker }
62*387f9dfdSAndroid Build Coastguard Worker 
63*387f9dfdSAndroid Build Coastguard Worker SEC("usdt")
handle_gc_end(struct pt_regs * ctx)64*387f9dfdSAndroid Build Coastguard Worker int handle_gc_end(struct pt_regs *ctx)
65*387f9dfdSAndroid Build Coastguard Worker {
66*387f9dfdSAndroid Build Coastguard Worker 	return gc_end(ctx);
67*387f9dfdSAndroid Build Coastguard Worker }
68*387f9dfdSAndroid Build Coastguard Worker 
69*387f9dfdSAndroid Build Coastguard Worker SEC("usdt")
handle_mem_pool_gc_start(struct pt_regs * ctx)70*387f9dfdSAndroid Build Coastguard Worker int handle_mem_pool_gc_start(struct pt_regs *ctx)
71*387f9dfdSAndroid Build Coastguard Worker {
72*387f9dfdSAndroid Build Coastguard Worker 	return gc_start(ctx);
73*387f9dfdSAndroid Build Coastguard Worker }
74*387f9dfdSAndroid Build Coastguard Worker 
75*387f9dfdSAndroid Build Coastguard Worker SEC("usdt")
handle_mem_pool_gc_end(struct pt_regs * ctx)76*387f9dfdSAndroid Build Coastguard Worker int handle_mem_pool_gc_end(struct pt_regs *ctx)
77*387f9dfdSAndroid Build Coastguard Worker {
78*387f9dfdSAndroid Build Coastguard Worker 	return gc_end(ctx);
79*387f9dfdSAndroid Build Coastguard Worker }
80*387f9dfdSAndroid Build Coastguard Worker 
81*387f9dfdSAndroid Build Coastguard Worker char LICENSE[] SEC("license") = "Dual BSD/GPL";
82