103d4d13fSAlexei Starovoitov // SPDX-License-Identifier: GPL-2.0 203d4d13fSAlexei Starovoitov /* Copyright (c) 2020 Facebook */ 303d4d13fSAlexei Starovoitov #pragma once 403d4d13fSAlexei Starovoitov 503d4d13fSAlexei Starovoitov #define TASK_COMM_LEN 16 603d4d13fSAlexei Starovoitov #define MAX_ANCESTORS 4 703d4d13fSAlexei Starovoitov #define MAX_PATH 256 803d4d13fSAlexei Starovoitov #define KILL_TARGET_LEN 64 903d4d13fSAlexei Starovoitov #define CTL_MAXNAME 10 1003d4d13fSAlexei Starovoitov #define MAX_ARGS_LEN 4096 1103d4d13fSAlexei Starovoitov #define MAX_FILENAME_LEN 512 1203d4d13fSAlexei Starovoitov #define MAX_ENVIRON_LEN 8192 1303d4d13fSAlexei Starovoitov #define MAX_PATH_DEPTH 32 1403d4d13fSAlexei Starovoitov #define MAX_FILEPATH_LENGTH (MAX_PATH_DEPTH * MAX_PATH) 1503d4d13fSAlexei Starovoitov #define MAX_CGROUPS_PATH_DEPTH 8 1603d4d13fSAlexei Starovoitov 1703d4d13fSAlexei Starovoitov #define MAX_METADATA_PAYLOAD_LEN TASK_COMM_LEN 1803d4d13fSAlexei Starovoitov 1903d4d13fSAlexei Starovoitov #define MAX_CGROUP_PAYLOAD_LEN \ 2003d4d13fSAlexei Starovoitov (MAX_PATH * 2 + (MAX_PATH * MAX_CGROUPS_PATH_DEPTH)) 2103d4d13fSAlexei Starovoitov 2203d4d13fSAlexei Starovoitov #define MAX_CAP_PAYLOAD_LEN (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN) 2303d4d13fSAlexei Starovoitov 2403d4d13fSAlexei Starovoitov #define MAX_SYSCTL_PAYLOAD_LEN \ 2503d4d13fSAlexei Starovoitov (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + CTL_MAXNAME + MAX_PATH) 2603d4d13fSAlexei Starovoitov 2703d4d13fSAlexei Starovoitov #define MAX_KILL_PAYLOAD_LEN \ 2803d4d13fSAlexei Starovoitov (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + TASK_COMM_LEN + \ 2903d4d13fSAlexei Starovoitov KILL_TARGET_LEN) 3003d4d13fSAlexei Starovoitov 3103d4d13fSAlexei Starovoitov #define MAX_EXEC_PAYLOAD_LEN \ 3203d4d13fSAlexei Starovoitov (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + MAX_FILENAME_LEN + \ 3303d4d13fSAlexei Starovoitov MAX_ARGS_LEN + MAX_ENVIRON_LEN) 3403d4d13fSAlexei Starovoitov 3503d4d13fSAlexei Starovoitov #define MAX_FILEMOD_PAYLOAD_LEN \ 3603d4d13fSAlexei Starovoitov (MAX_METADATA_PAYLOAD_LEN + MAX_CGROUP_PAYLOAD_LEN + MAX_FILEPATH_LENGTH + \ 3703d4d13fSAlexei Starovoitov MAX_FILEPATH_LENGTH) 3803d4d13fSAlexei Starovoitov 3903d4d13fSAlexei Starovoitov enum data_type { 4003d4d13fSAlexei Starovoitov INVALID_EVENT, 4103d4d13fSAlexei Starovoitov EXEC_EVENT, 4203d4d13fSAlexei Starovoitov FORK_EVENT, 4303d4d13fSAlexei Starovoitov KILL_EVENT, 4403d4d13fSAlexei Starovoitov SYSCTL_EVENT, 4503d4d13fSAlexei Starovoitov FILEMOD_EVENT, 4603d4d13fSAlexei Starovoitov MAX_DATA_TYPE_EVENT 4703d4d13fSAlexei Starovoitov }; 4803d4d13fSAlexei Starovoitov 4903d4d13fSAlexei Starovoitov enum filemod_type { 5003d4d13fSAlexei Starovoitov FMOD_OPEN, 5103d4d13fSAlexei Starovoitov FMOD_LINK, 5203d4d13fSAlexei Starovoitov FMOD_SYMLINK, 5303d4d13fSAlexei Starovoitov }; 5403d4d13fSAlexei Starovoitov 5503d4d13fSAlexei Starovoitov struct ancestors_data_t { 5603d4d13fSAlexei Starovoitov pid_t ancestor_pids[MAX_ANCESTORS]; 5703d4d13fSAlexei Starovoitov uint32_t ancestor_exec_ids[MAX_ANCESTORS]; 5803d4d13fSAlexei Starovoitov uint64_t ancestor_start_times[MAX_ANCESTORS]; 5903d4d13fSAlexei Starovoitov uint32_t num_ancestors; 6003d4d13fSAlexei Starovoitov }; 6103d4d13fSAlexei Starovoitov 6203d4d13fSAlexei Starovoitov struct var_metadata_t { 6303d4d13fSAlexei Starovoitov enum data_type type; 6403d4d13fSAlexei Starovoitov pid_t pid; 6503d4d13fSAlexei Starovoitov uint32_t exec_id; 6603d4d13fSAlexei Starovoitov uid_t uid; 6703d4d13fSAlexei Starovoitov gid_t gid; 6803d4d13fSAlexei Starovoitov uint64_t start_time; 6903d4d13fSAlexei Starovoitov uint32_t cpu_id; 7003d4d13fSAlexei Starovoitov uint64_t bpf_stats_num_perf_events; 7103d4d13fSAlexei Starovoitov uint64_t bpf_stats_start_ktime_ns; 7203d4d13fSAlexei Starovoitov uint8_t comm_length; 7303d4d13fSAlexei Starovoitov }; 7403d4d13fSAlexei Starovoitov 7503d4d13fSAlexei Starovoitov struct cgroup_data_t { 7603d4d13fSAlexei Starovoitov ino_t cgroup_root_inode; 7703d4d13fSAlexei Starovoitov ino_t cgroup_proc_inode; 7803d4d13fSAlexei Starovoitov uint64_t cgroup_root_mtime; 7903d4d13fSAlexei Starovoitov uint64_t cgroup_proc_mtime; 8003d4d13fSAlexei Starovoitov uint16_t cgroup_root_length; 8103d4d13fSAlexei Starovoitov uint16_t cgroup_proc_length; 8203d4d13fSAlexei Starovoitov uint16_t cgroup_full_length; 8303d4d13fSAlexei Starovoitov int cgroup_full_path_root_pos; 8403d4d13fSAlexei Starovoitov }; 8503d4d13fSAlexei Starovoitov 8603d4d13fSAlexei Starovoitov struct var_sysctl_data_t { 8703d4d13fSAlexei Starovoitov struct var_metadata_t meta; 8803d4d13fSAlexei Starovoitov struct cgroup_data_t cgroup_data; 8903d4d13fSAlexei Starovoitov struct ancestors_data_t ancestors_info; 9003d4d13fSAlexei Starovoitov uint8_t sysctl_val_length; 9103d4d13fSAlexei Starovoitov uint16_t sysctl_path_length; 9203d4d13fSAlexei Starovoitov char payload[MAX_SYSCTL_PAYLOAD_LEN]; 9303d4d13fSAlexei Starovoitov }; 9403d4d13fSAlexei Starovoitov 9503d4d13fSAlexei Starovoitov struct var_kill_data_t { 9603d4d13fSAlexei Starovoitov struct var_metadata_t meta; 9703d4d13fSAlexei Starovoitov struct cgroup_data_t cgroup_data; 9803d4d13fSAlexei Starovoitov struct ancestors_data_t ancestors_info; 9903d4d13fSAlexei Starovoitov pid_t kill_target_pid; 10003d4d13fSAlexei Starovoitov int kill_sig; 10103d4d13fSAlexei Starovoitov uint32_t kill_count; 10203d4d13fSAlexei Starovoitov uint64_t last_kill_time; 10303d4d13fSAlexei Starovoitov uint8_t kill_target_name_length; 10403d4d13fSAlexei Starovoitov uint8_t kill_target_cgroup_proc_length; 10503d4d13fSAlexei Starovoitov char payload[MAX_KILL_PAYLOAD_LEN]; 10603d4d13fSAlexei Starovoitov size_t payload_length; 10703d4d13fSAlexei Starovoitov }; 10803d4d13fSAlexei Starovoitov 10903d4d13fSAlexei Starovoitov struct var_exec_data_t { 11003d4d13fSAlexei Starovoitov struct var_metadata_t meta; 11103d4d13fSAlexei Starovoitov struct cgroup_data_t cgroup_data; 11203d4d13fSAlexei Starovoitov pid_t parent_pid; 11303d4d13fSAlexei Starovoitov uint32_t parent_exec_id; 11403d4d13fSAlexei Starovoitov uid_t parent_uid; 11503d4d13fSAlexei Starovoitov uint64_t parent_start_time; 11603d4d13fSAlexei Starovoitov uint16_t bin_path_length; 11703d4d13fSAlexei Starovoitov uint16_t cmdline_length; 11803d4d13fSAlexei Starovoitov uint16_t environment_length; 11903d4d13fSAlexei Starovoitov char payload[MAX_EXEC_PAYLOAD_LEN]; 12003d4d13fSAlexei Starovoitov }; 12103d4d13fSAlexei Starovoitov 12203d4d13fSAlexei Starovoitov struct var_fork_data_t { 12303d4d13fSAlexei Starovoitov struct var_metadata_t meta; 12403d4d13fSAlexei Starovoitov pid_t parent_pid; 12503d4d13fSAlexei Starovoitov uint32_t parent_exec_id; 12603d4d13fSAlexei Starovoitov uint64_t parent_start_time; 12703d4d13fSAlexei Starovoitov char payload[MAX_METADATA_PAYLOAD_LEN]; 12803d4d13fSAlexei Starovoitov }; 12903d4d13fSAlexei Starovoitov 13003d4d13fSAlexei Starovoitov struct var_filemod_data_t { 13103d4d13fSAlexei Starovoitov struct var_metadata_t meta; 13203d4d13fSAlexei Starovoitov struct cgroup_data_t cgroup_data; 13303d4d13fSAlexei Starovoitov enum filemod_type fmod_type; 13403d4d13fSAlexei Starovoitov unsigned int dst_flags; 13503d4d13fSAlexei Starovoitov uint32_t src_device_id; 13603d4d13fSAlexei Starovoitov uint32_t dst_device_id; 13703d4d13fSAlexei Starovoitov ino_t src_inode; 13803d4d13fSAlexei Starovoitov ino_t dst_inode; 13903d4d13fSAlexei Starovoitov uint16_t src_filepath_length; 14003d4d13fSAlexei Starovoitov uint16_t dst_filepath_length; 14103d4d13fSAlexei Starovoitov char payload[MAX_FILEMOD_PAYLOAD_LEN]; 14203d4d13fSAlexei Starovoitov }; 14303d4d13fSAlexei Starovoitov 14403d4d13fSAlexei Starovoitov struct profiler_config_struct { 14503d4d13fSAlexei Starovoitov bool fetch_cgroups_from_bpf; 14603d4d13fSAlexei Starovoitov ino_t cgroup_fs_inode; 14703d4d13fSAlexei Starovoitov ino_t cgroup_login_session_inode; 14803d4d13fSAlexei Starovoitov uint64_t kill_signals_mask; 14903d4d13fSAlexei Starovoitov ino_t inode_filter; 15003d4d13fSAlexei Starovoitov uint32_t stale_info_secs; 15103d4d13fSAlexei Starovoitov bool use_variable_buffers; 15203d4d13fSAlexei Starovoitov bool read_environ_from_exec; 15303d4d13fSAlexei Starovoitov bool enable_cgroup_v1_resolver; 15403d4d13fSAlexei Starovoitov }; 15503d4d13fSAlexei Starovoitov 15603d4d13fSAlexei Starovoitov struct bpf_func_stats_data { 15703d4d13fSAlexei Starovoitov uint64_t time_elapsed_ns; 15803d4d13fSAlexei Starovoitov uint64_t num_executions; 15903d4d13fSAlexei Starovoitov uint64_t num_perf_events; 16003d4d13fSAlexei Starovoitov }; 16103d4d13fSAlexei Starovoitov 16203d4d13fSAlexei Starovoitov struct bpf_func_stats_ctx { 16303d4d13fSAlexei Starovoitov uint64_t start_time_ns; 16403d4d13fSAlexei Starovoitov struct bpf_func_stats_data* bpf_func_stats_data_val; 16503d4d13fSAlexei Starovoitov }; 16603d4d13fSAlexei Starovoitov 16703d4d13fSAlexei Starovoitov enum bpf_function_id { 16803d4d13fSAlexei Starovoitov profiler_bpf_proc_sys_write, 16903d4d13fSAlexei Starovoitov profiler_bpf_sched_process_exec, 17003d4d13fSAlexei Starovoitov profiler_bpf_sched_process_exit, 17103d4d13fSAlexei Starovoitov profiler_bpf_sys_enter_kill, 17203d4d13fSAlexei Starovoitov profiler_bpf_do_filp_open_ret, 17303d4d13fSAlexei Starovoitov profiler_bpf_sched_process_fork, 17403d4d13fSAlexei Starovoitov profiler_bpf_vfs_link, 17503d4d13fSAlexei Starovoitov profiler_bpf_vfs_symlink, 17603d4d13fSAlexei Starovoitov profiler_bpf_max_function_id 17703d4d13fSAlexei Starovoitov }; 178