xref: /linux/tools/testing/selftests/bpf/progs/profiler.h (revision cbecf716ca618fd44feda6bd9a64a8179d031fc5)
1*03d4d13fSAlexei Starovoitov // SPDX-License-Identifier: GPL-2.0
2*03d4d13fSAlexei Starovoitov /* Copyright (c) 2020 Facebook */
3*03d4d13fSAlexei Starovoitov #pragma once
4*03d4d13fSAlexei Starovoitov 
5*03d4d13fSAlexei Starovoitov #define TASK_COMM_LEN 16
6*03d4d13fSAlexei Starovoitov #define MAX_ANCESTORS 4
7*03d4d13fSAlexei Starovoitov #define MAX_PATH 256
8*03d4d13fSAlexei Starovoitov #define KILL_TARGET_LEN 64
9*03d4d13fSAlexei Starovoitov #define CTL_MAXNAME 10
10*03d4d13fSAlexei Starovoitov #define MAX_ARGS_LEN 4096
11*03d4d13fSAlexei Starovoitov #define MAX_FILENAME_LEN 512
12*03d4d13fSAlexei Starovoitov #define MAX_ENVIRON_LEN 8192
13*03d4d13fSAlexei Starovoitov #define MAX_PATH_DEPTH 32
14*03d4d13fSAlexei Starovoitov #define MAX_FILEPATH_LENGTH (MAX_PATH_DEPTH * MAX_PATH)
15*03d4d13fSAlexei Starovoitov #define MAX_CGROUPS_PATH_DEPTH 8
16*03d4d13fSAlexei Starovoitov 
17*03d4d13fSAlexei Starovoitov #define MAX_METADATA_PAYLOAD_LEN TASK_COMM_LEN
18*03d4d13fSAlexei Starovoitov 
19*03d4d13fSAlexei Starovoitov #define MAX_CGROUP_PAYLOAD_LEN \
20*03d4d13fSAlexei Starovoitov 	(MAX_PATH * 2 + (MAX_PATH * MAX_CGROUPS_PATH_DEPTH))
21*03d4d13fSAlexei Starovoitov 
22*03d4d13fSAlexei Starovoitov #define MAX_CAP_PAYLOAD_LEN (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN)
23*03d4d13fSAlexei Starovoitov 
24*03d4d13fSAlexei Starovoitov #define MAX_SYSCTL_PAYLOAD_LEN \
25*03d4d13fSAlexei Starovoitov 	(MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + CTL_MAXNAME + MAX_PATH)
26*03d4d13fSAlexei Starovoitov 
27*03d4d13fSAlexei Starovoitov #define MAX_KILL_PAYLOAD_LEN \
28*03d4d13fSAlexei Starovoitov 	(MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + TASK_COMM_LEN + \
29*03d4d13fSAlexei Starovoitov 	 KILL_TARGET_LEN)
30*03d4d13fSAlexei Starovoitov 
31*03d4d13fSAlexei Starovoitov #define MAX_EXEC_PAYLOAD_LEN \
32*03d4d13fSAlexei Starovoitov 	(MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + MAX_FILENAME_LEN + \
33*03d4d13fSAlexei Starovoitov 	 MAX_ARGS_LEN + MAX_ENVIRON_LEN)
34*03d4d13fSAlexei Starovoitov 
35*03d4d13fSAlexei Starovoitov #define MAX_FILEMOD_PAYLOAD_LEN \
36*03d4d13fSAlexei Starovoitov 	(MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + MAX_FILEPATH_LENGTH + \
37*03d4d13fSAlexei Starovoitov 	 MAX_FILEPATH_LENGTH)
38*03d4d13fSAlexei Starovoitov 
39*03d4d13fSAlexei Starovoitov enum data_type {
40*03d4d13fSAlexei Starovoitov 	INVALID_EVENT,
41*03d4d13fSAlexei Starovoitov 	EXEC_EVENT,
42*03d4d13fSAlexei Starovoitov 	FORK_EVENT,
43*03d4d13fSAlexei Starovoitov 	KILL_EVENT,
44*03d4d13fSAlexei Starovoitov 	SYSCTL_EVENT,
45*03d4d13fSAlexei Starovoitov 	FILEMOD_EVENT,
46*03d4d13fSAlexei Starovoitov 	MAX_DATA_TYPE_EVENT
47*03d4d13fSAlexei Starovoitov };
48*03d4d13fSAlexei Starovoitov 
49*03d4d13fSAlexei Starovoitov enum filemod_type {
50*03d4d13fSAlexei Starovoitov 	FMOD_OPEN,
51*03d4d13fSAlexei Starovoitov 	FMOD_LINK,
52*03d4d13fSAlexei Starovoitov 	FMOD_SYMLINK,
53*03d4d13fSAlexei Starovoitov };
54*03d4d13fSAlexei Starovoitov 
55*03d4d13fSAlexei Starovoitov struct ancestors_data_t {
56*03d4d13fSAlexei Starovoitov 	pid_t ancestor_pids[MAX_ANCESTORS];
57*03d4d13fSAlexei Starovoitov 	uint32_t ancestor_exec_ids[MAX_ANCESTORS];
58*03d4d13fSAlexei Starovoitov 	uint64_t ancestor_start_times[MAX_ANCESTORS];
59*03d4d13fSAlexei Starovoitov 	uint32_t num_ancestors;
60*03d4d13fSAlexei Starovoitov };
61*03d4d13fSAlexei Starovoitov 
62*03d4d13fSAlexei Starovoitov struct var_metadata_t {
63*03d4d13fSAlexei Starovoitov 	enum data_type type;
64*03d4d13fSAlexei Starovoitov 	pid_t pid;
65*03d4d13fSAlexei Starovoitov 	uint32_t exec_id;
66*03d4d13fSAlexei Starovoitov 	uid_t uid;
67*03d4d13fSAlexei Starovoitov 	gid_t gid;
68*03d4d13fSAlexei Starovoitov 	uint64_t start_time;
69*03d4d13fSAlexei Starovoitov 	uint32_t cpu_id;
70*03d4d13fSAlexei Starovoitov 	uint64_t bpf_stats_num_perf_events;
71*03d4d13fSAlexei Starovoitov 	uint64_t bpf_stats_start_ktime_ns;
72*03d4d13fSAlexei Starovoitov 	uint8_t comm_length;
73*03d4d13fSAlexei Starovoitov };
74*03d4d13fSAlexei Starovoitov 
75*03d4d13fSAlexei Starovoitov struct cgroup_data_t {
76*03d4d13fSAlexei Starovoitov 	ino_t cgroup_root_inode;
77*03d4d13fSAlexei Starovoitov 	ino_t cgroup_proc_inode;
78*03d4d13fSAlexei Starovoitov 	uint64_t cgroup_root_mtime;
79*03d4d13fSAlexei Starovoitov 	uint64_t cgroup_proc_mtime;
80*03d4d13fSAlexei Starovoitov 	uint16_t cgroup_root_length;
81*03d4d13fSAlexei Starovoitov 	uint16_t cgroup_proc_length;
82*03d4d13fSAlexei Starovoitov 	uint16_t cgroup_full_length;
83*03d4d13fSAlexei Starovoitov 	int cgroup_full_path_root_pos;
84*03d4d13fSAlexei Starovoitov };
85*03d4d13fSAlexei Starovoitov 
86*03d4d13fSAlexei Starovoitov struct var_sysctl_data_t {
87*03d4d13fSAlexei Starovoitov 	struct var_metadata_t meta;
88*03d4d13fSAlexei Starovoitov 	struct cgroup_data_t cgroup_data;
89*03d4d13fSAlexei Starovoitov 	struct ancestors_data_t ancestors_info;
90*03d4d13fSAlexei Starovoitov 	uint8_t sysctl_val_length;
91*03d4d13fSAlexei Starovoitov 	uint16_t sysctl_path_length;
92*03d4d13fSAlexei Starovoitov 	char payload[MAX_SYSCTL_PAYLOAD_LEN];
93*03d4d13fSAlexei Starovoitov };
94*03d4d13fSAlexei Starovoitov 
95*03d4d13fSAlexei Starovoitov struct var_kill_data_t {
96*03d4d13fSAlexei Starovoitov 	struct var_metadata_t meta;
97*03d4d13fSAlexei Starovoitov 	struct cgroup_data_t cgroup_data;
98*03d4d13fSAlexei Starovoitov 	struct ancestors_data_t ancestors_info;
99*03d4d13fSAlexei Starovoitov 	pid_t kill_target_pid;
100*03d4d13fSAlexei Starovoitov 	int kill_sig;
101*03d4d13fSAlexei Starovoitov 	uint32_t kill_count;
102*03d4d13fSAlexei Starovoitov 	uint64_t last_kill_time;
103*03d4d13fSAlexei Starovoitov 	uint8_t kill_target_name_length;
104*03d4d13fSAlexei Starovoitov 	uint8_t kill_target_cgroup_proc_length;
105*03d4d13fSAlexei Starovoitov 	char payload[MAX_KILL_PAYLOAD_LEN];
106*03d4d13fSAlexei Starovoitov 	size_t payload_length;
107*03d4d13fSAlexei Starovoitov };
108*03d4d13fSAlexei Starovoitov 
109*03d4d13fSAlexei Starovoitov struct var_exec_data_t {
110*03d4d13fSAlexei Starovoitov 	struct var_metadata_t meta;
111*03d4d13fSAlexei Starovoitov 	struct cgroup_data_t cgroup_data;
112*03d4d13fSAlexei Starovoitov 	pid_t parent_pid;
113*03d4d13fSAlexei Starovoitov 	uint32_t parent_exec_id;
114*03d4d13fSAlexei Starovoitov 	uid_t parent_uid;
115*03d4d13fSAlexei Starovoitov 	uint64_t parent_start_time;
116*03d4d13fSAlexei Starovoitov 	uint16_t bin_path_length;
117*03d4d13fSAlexei Starovoitov 	uint16_t cmdline_length;
118*03d4d13fSAlexei Starovoitov 	uint16_t environment_length;
119*03d4d13fSAlexei Starovoitov 	char payload[MAX_EXEC_PAYLOAD_LEN];
120*03d4d13fSAlexei Starovoitov };
121*03d4d13fSAlexei Starovoitov 
122*03d4d13fSAlexei Starovoitov struct var_fork_data_t {
123*03d4d13fSAlexei Starovoitov 	struct var_metadata_t meta;
124*03d4d13fSAlexei Starovoitov 	pid_t parent_pid;
125*03d4d13fSAlexei Starovoitov 	uint32_t parent_exec_id;
126*03d4d13fSAlexei Starovoitov 	uint64_t parent_start_time;
127*03d4d13fSAlexei Starovoitov 	char payload[MAX_METADATA_PAYLOAD_LEN];
128*03d4d13fSAlexei Starovoitov };
129*03d4d13fSAlexei Starovoitov 
130*03d4d13fSAlexei Starovoitov struct var_filemod_data_t {
131*03d4d13fSAlexei Starovoitov 	struct var_metadata_t meta;
132*03d4d13fSAlexei Starovoitov 	struct cgroup_data_t cgroup_data;
133*03d4d13fSAlexei Starovoitov 	enum filemod_type fmod_type;
134*03d4d13fSAlexei Starovoitov 	unsigned int dst_flags;
135*03d4d13fSAlexei Starovoitov 	uint32_t src_device_id;
136*03d4d13fSAlexei Starovoitov 	uint32_t dst_device_id;
137*03d4d13fSAlexei Starovoitov 	ino_t src_inode;
138*03d4d13fSAlexei Starovoitov 	ino_t dst_inode;
139*03d4d13fSAlexei Starovoitov 	uint16_t src_filepath_length;
140*03d4d13fSAlexei Starovoitov 	uint16_t dst_filepath_length;
141*03d4d13fSAlexei Starovoitov 	char payload[MAX_FILEMOD_PAYLOAD_LEN];
142*03d4d13fSAlexei Starovoitov };
143*03d4d13fSAlexei Starovoitov 
144*03d4d13fSAlexei Starovoitov struct profiler_config_struct {
145*03d4d13fSAlexei Starovoitov 	bool fetch_cgroups_from_bpf;
146*03d4d13fSAlexei Starovoitov 	ino_t cgroup_fs_inode;
147*03d4d13fSAlexei Starovoitov 	ino_t cgroup_login_session_inode;
148*03d4d13fSAlexei Starovoitov 	uint64_t kill_signals_mask;
149*03d4d13fSAlexei Starovoitov 	ino_t inode_filter;
150*03d4d13fSAlexei Starovoitov 	uint32_t stale_info_secs;
151*03d4d13fSAlexei Starovoitov 	bool use_variable_buffers;
152*03d4d13fSAlexei Starovoitov 	bool read_environ_from_exec;
153*03d4d13fSAlexei Starovoitov 	bool enable_cgroup_v1_resolver;
154*03d4d13fSAlexei Starovoitov };
155*03d4d13fSAlexei Starovoitov 
156*03d4d13fSAlexei Starovoitov struct bpf_func_stats_data {
157*03d4d13fSAlexei Starovoitov 	uint64_t time_elapsed_ns;
158*03d4d13fSAlexei Starovoitov 	uint64_t num_executions;
159*03d4d13fSAlexei Starovoitov 	uint64_t num_perf_events;
160*03d4d13fSAlexei Starovoitov };
161*03d4d13fSAlexei Starovoitov 
162*03d4d13fSAlexei Starovoitov struct bpf_func_stats_ctx {
163*03d4d13fSAlexei Starovoitov 	uint64_t start_time_ns;
164*03d4d13fSAlexei Starovoitov 	struct bpf_func_stats_data* bpf_func_stats_data_val;
165*03d4d13fSAlexei Starovoitov };
166*03d4d13fSAlexei Starovoitov 
167*03d4d13fSAlexei Starovoitov enum bpf_function_id {
168*03d4d13fSAlexei Starovoitov 	profiler_bpf_proc_sys_write,
169*03d4d13fSAlexei Starovoitov 	profiler_bpf_sched_process_exec,
170*03d4d13fSAlexei Starovoitov 	profiler_bpf_sched_process_exit,
171*03d4d13fSAlexei Starovoitov 	profiler_bpf_sys_enter_kill,
172*03d4d13fSAlexei Starovoitov 	profiler_bpf_do_filp_open_ret,
173*03d4d13fSAlexei Starovoitov 	profiler_bpf_sched_process_fork,
174*03d4d13fSAlexei Starovoitov 	profiler_bpf_vfs_link,
175*03d4d13fSAlexei Starovoitov 	profiler_bpf_vfs_symlink,
176*03d4d13fSAlexei Starovoitov 	profiler_bpf_max_function_id
177*03d4d13fSAlexei Starovoitov };
178