xref: /aosp_15_r20/external/bcc/libbpf-tools/statsnoop.bpf.c (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Worker // SPDX-License-Identifier: GPL-2.0
2*387f9dfdSAndroid Build Coastguard Worker // Copyright (c) 2021 Hengqi Chen
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 "statsnoop.h"
7*387f9dfdSAndroid Build Coastguard Worker 
8*387f9dfdSAndroid Build Coastguard Worker #define MAX_ENTRIES 10240
9*387f9dfdSAndroid Build Coastguard Worker 
10*387f9dfdSAndroid Build Coastguard Worker const volatile pid_t target_pid = 0;
11*387f9dfdSAndroid Build Coastguard Worker const volatile bool  trace_failed_only = 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, __u32);
17*387f9dfdSAndroid Build Coastguard Worker 	__type(value, const char *);
18*387f9dfdSAndroid Build Coastguard Worker } values SEC(".maps");
19*387f9dfdSAndroid Build Coastguard Worker 
20*387f9dfdSAndroid Build Coastguard Worker struct {
21*387f9dfdSAndroid Build Coastguard Worker 	__uint(type, BPF_MAP_TYPE_PERF_EVENT_ARRAY);
22*387f9dfdSAndroid Build Coastguard Worker 	__uint(key_size, sizeof(__u32));
23*387f9dfdSAndroid Build Coastguard Worker 	__uint(value_size, sizeof(__u32));
24*387f9dfdSAndroid Build Coastguard Worker } events SEC(".maps");
25*387f9dfdSAndroid Build Coastguard Worker 
probe_entry(void * ctx,const char * pathname)26*387f9dfdSAndroid Build Coastguard Worker static int probe_entry(void *ctx, const char *pathname)
27*387f9dfdSAndroid Build Coastguard Worker {
28*387f9dfdSAndroid Build Coastguard Worker 	__u64 id = bpf_get_current_pid_tgid();
29*387f9dfdSAndroid Build Coastguard Worker 	__u32 pid = id >> 32;
30*387f9dfdSAndroid Build Coastguard Worker 	__u32 tid = (__u32)id;
31*387f9dfdSAndroid Build Coastguard Worker 
32*387f9dfdSAndroid Build Coastguard Worker 	if (!pathname)
33*387f9dfdSAndroid Build Coastguard Worker 		return 0;
34*387f9dfdSAndroid Build Coastguard Worker 
35*387f9dfdSAndroid Build Coastguard Worker 	if (target_pid && target_pid != pid)
36*387f9dfdSAndroid Build Coastguard Worker 		return 0;
37*387f9dfdSAndroid Build Coastguard Worker 
38*387f9dfdSAndroid Build Coastguard Worker 	bpf_map_update_elem(&values, &tid, &pathname, BPF_ANY);
39*387f9dfdSAndroid Build Coastguard Worker 	return 0;
40*387f9dfdSAndroid Build Coastguard Worker };
41*387f9dfdSAndroid Build Coastguard Worker 
probe_return(void * ctx,int ret)42*387f9dfdSAndroid Build Coastguard Worker static int probe_return(void *ctx, int ret)
43*387f9dfdSAndroid Build Coastguard Worker {
44*387f9dfdSAndroid Build Coastguard Worker 	__u64 id = bpf_get_current_pid_tgid();
45*387f9dfdSAndroid Build Coastguard Worker 	__u32 pid = id >> 32;
46*387f9dfdSAndroid Build Coastguard Worker 	__u32 tid = (__u32)id;
47*387f9dfdSAndroid Build Coastguard Worker 	const char **pathname;
48*387f9dfdSAndroid Build Coastguard Worker 	struct event event = {};
49*387f9dfdSAndroid Build Coastguard Worker 
50*387f9dfdSAndroid Build Coastguard Worker 	pathname = bpf_map_lookup_elem(&values, &tid);
51*387f9dfdSAndroid Build Coastguard Worker 	if (!pathname)
52*387f9dfdSAndroid Build Coastguard Worker 		return 0;
53*387f9dfdSAndroid Build Coastguard Worker 
54*387f9dfdSAndroid Build Coastguard Worker 	if (trace_failed_only && ret >= 0) {
55*387f9dfdSAndroid Build Coastguard Worker 		bpf_map_delete_elem(&values, &tid);
56*387f9dfdSAndroid Build Coastguard Worker 		return 0;
57*387f9dfdSAndroid Build Coastguard Worker 	}
58*387f9dfdSAndroid Build Coastguard Worker 
59*387f9dfdSAndroid Build Coastguard Worker 	event.pid = pid;
60*387f9dfdSAndroid Build Coastguard Worker 	event.ts_ns = bpf_ktime_get_ns();
61*387f9dfdSAndroid Build Coastguard Worker 	event.ret = ret;
62*387f9dfdSAndroid Build Coastguard Worker 	bpf_get_current_comm(&event.comm, sizeof(event.comm));
63*387f9dfdSAndroid Build Coastguard Worker 	bpf_probe_read_user_str(event.pathname, sizeof(event.pathname), *pathname);
64*387f9dfdSAndroid Build Coastguard Worker 
65*387f9dfdSAndroid Build Coastguard Worker 	bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));
66*387f9dfdSAndroid Build Coastguard Worker 	bpf_map_delete_elem(&values, &tid);
67*387f9dfdSAndroid Build Coastguard Worker 	return 0;
68*387f9dfdSAndroid Build Coastguard Worker }
69*387f9dfdSAndroid Build Coastguard Worker 
70*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_enter_statfs")
handle_statfs_entry(struct trace_event_raw_sys_enter * ctx)71*387f9dfdSAndroid Build Coastguard Worker int handle_statfs_entry(struct trace_event_raw_sys_enter *ctx)
72*387f9dfdSAndroid Build Coastguard Worker {
73*387f9dfdSAndroid Build Coastguard Worker 	return probe_entry(ctx, (const char *)ctx->args[0]);
74*387f9dfdSAndroid Build Coastguard Worker }
75*387f9dfdSAndroid Build Coastguard Worker 
76*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_exit_statfs")
handle_statfs_return(struct trace_event_raw_sys_exit * ctx)77*387f9dfdSAndroid Build Coastguard Worker int handle_statfs_return(struct trace_event_raw_sys_exit *ctx)
78*387f9dfdSAndroid Build Coastguard Worker {
79*387f9dfdSAndroid Build Coastguard Worker 	return probe_return(ctx, (int)ctx->ret);
80*387f9dfdSAndroid Build Coastguard Worker }
81*387f9dfdSAndroid Build Coastguard Worker 
82*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_enter_newstat")
handle_newstat_entry(struct trace_event_raw_sys_enter * ctx)83*387f9dfdSAndroid Build Coastguard Worker int handle_newstat_entry(struct trace_event_raw_sys_enter *ctx)
84*387f9dfdSAndroid Build Coastguard Worker {
85*387f9dfdSAndroid Build Coastguard Worker 	return probe_entry(ctx, (const char *)ctx->args[0]);
86*387f9dfdSAndroid Build Coastguard Worker }
87*387f9dfdSAndroid Build Coastguard Worker 
88*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_exit_newstat")
handle_newstat_return(struct trace_event_raw_sys_exit * ctx)89*387f9dfdSAndroid Build Coastguard Worker int handle_newstat_return(struct trace_event_raw_sys_exit *ctx)
90*387f9dfdSAndroid Build Coastguard Worker {
91*387f9dfdSAndroid Build Coastguard Worker 	return probe_return(ctx, (int)ctx->ret);
92*387f9dfdSAndroid Build Coastguard Worker }
93*387f9dfdSAndroid Build Coastguard Worker 
94*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_enter_statx")
handle_statx_entry(struct trace_event_raw_sys_enter * ctx)95*387f9dfdSAndroid Build Coastguard Worker int handle_statx_entry(struct trace_event_raw_sys_enter *ctx)
96*387f9dfdSAndroid Build Coastguard Worker {
97*387f9dfdSAndroid Build Coastguard Worker 	return probe_entry(ctx, (const char *)ctx->args[1]);
98*387f9dfdSAndroid Build Coastguard Worker }
99*387f9dfdSAndroid Build Coastguard Worker 
100*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_exit_statx")
handle_statx_return(struct trace_event_raw_sys_exit * ctx)101*387f9dfdSAndroid Build Coastguard Worker int handle_statx_return(struct trace_event_raw_sys_exit *ctx)
102*387f9dfdSAndroid Build Coastguard Worker {
103*387f9dfdSAndroid Build Coastguard Worker 	return probe_return(ctx, (int)ctx->ret);
104*387f9dfdSAndroid Build Coastguard Worker }
105*387f9dfdSAndroid Build Coastguard Worker 
106*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_enter_newfstatat")
handle_newfstatat_entry(struct trace_event_raw_sys_enter * ctx)107*387f9dfdSAndroid Build Coastguard Worker int handle_newfstatat_entry(struct trace_event_raw_sys_enter *ctx)
108*387f9dfdSAndroid Build Coastguard Worker {
109*387f9dfdSAndroid Build Coastguard Worker 	return probe_entry(ctx, (const char *)ctx->args[1]);
110*387f9dfdSAndroid Build Coastguard Worker }
111*387f9dfdSAndroid Build Coastguard Worker 
112*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_exit_newfstatat")
handle_newfstatat_return(struct trace_event_raw_sys_exit * ctx)113*387f9dfdSAndroid Build Coastguard Worker int handle_newfstatat_return(struct trace_event_raw_sys_exit *ctx)
114*387f9dfdSAndroid Build Coastguard Worker {
115*387f9dfdSAndroid Build Coastguard Worker 	return probe_return(ctx, (int)ctx->ret);
116*387f9dfdSAndroid Build Coastguard Worker }
117*387f9dfdSAndroid Build Coastguard Worker 
118*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_enter_newlstat")
handle_newlstat_entry(struct trace_event_raw_sys_enter * ctx)119*387f9dfdSAndroid Build Coastguard Worker int handle_newlstat_entry(struct trace_event_raw_sys_enter *ctx)
120*387f9dfdSAndroid Build Coastguard Worker {
121*387f9dfdSAndroid Build Coastguard Worker 	return probe_entry(ctx, (const char *)ctx->args[0]);
122*387f9dfdSAndroid Build Coastguard Worker }
123*387f9dfdSAndroid Build Coastguard Worker 
124*387f9dfdSAndroid Build Coastguard Worker SEC("tracepoint/syscalls/sys_exit_newlstat")
handle_newlstat_return(struct trace_event_raw_sys_exit * ctx)125*387f9dfdSAndroid Build Coastguard Worker int handle_newlstat_return(struct trace_event_raw_sys_exit *ctx)
126*387f9dfdSAndroid Build Coastguard Worker {
127*387f9dfdSAndroid Build Coastguard Worker 	return probe_return(ctx, (int)ctx->ret);
128*387f9dfdSAndroid Build Coastguard Worker }
129*387f9dfdSAndroid Build Coastguard Worker 
130*387f9dfdSAndroid Build Coastguard Worker char LICENSE[] SEC("license") = "GPL";
131