#ifndef MODULE_MONITOR_TRACE_H #define MODULE_MONITOR_TRACE_H #include #include #include "../buffer/variant_buffer.h" #define CGROUP_NAME_LEN 32 // max length of cgroup name #define TASK_COMM_LEN 16 // max length of task name #define BACKTRACE_DEPTH 30 // max depth of backtrace #define PROCESS_CHAINS_COUNT 10 // max count of process chains #define PROCESS_ARGV_LEN 128 // max length of process argv #define MAX_NAME_LEN (127) // max name length #define TIMER_MAX_WATCH_NUM (32) // A timer max watch number at once time #define DIAG_USER_STACK_SIZE (16 * 1024) // dump type #define VARIABLE_MONITOR_RECORD_TYPE 0x0 #define VARIABLE_MONITOR_TASK_TYPE 0x1 #define VARIABLE_MONITOR_TASK_TYPE_SYSTEM 0x2 typedef struct { pid_t task_id; // current process id char name[MAX_NAME_LEN + 1]; // name void *ptr; // virtual address long long threshold; // threshold value long long true_value; // target true value } threshold; typedef struct { int et_type; unsigned long id; unsigned long long tv; int threshold_over_count; threshold threshold_record[TIMER_MAX_WATCH_NUM]; } variable_monitor_record; // from // https://github.com/alibaba/diagnose-tools/blob/8cd905a1c17f2201e460a2d607413a1303757a32/SOURCE/uapi/ali_diagnose.h typedef struct { char cgroup_buf[CGROUP_NAME_LEN]; char cgroup_cpuset[CGROUP_NAME_LEN]; int pid; int tgid; int container_pid; int container_tgid; long state; int task_type; unsigned long syscallno; /** * 0->user 1->sys 2->idle */ unsigned long sys_task; /** * 1->user mode 0->sys mode -1->unknown * may not be accurate */ unsigned long user_mode; char comm[TASK_COMM_LEN]; } task_detail; // task brief typedef struct { unsigned long stack[BACKTRACE_DEPTH]; } kern_stack_detail; // kernel stack // typedef struct { // struct pt_regs regs; // unsigned long ip; // unsigned long bp; // unsigned long sp; // unsigned long stack[BACKTRACE_DEPTH]; // } user_stack_detail; // user stack typedef struct { struct pt_regs regs; unsigned long ip; unsigned long bp; unsigned long sp; unsigned long stack_size; unsigned long stack[DIAG_USER_STACK_SIZE / sizeof(unsigned long)]; } raw_stack_detail; typedef struct { unsigned int full_argv[PROCESS_CHAINS_COUNT]; // char chains[PROCESS_CHAINS_COUNT][PROCESS_ARGV_LEN]; // process chains argv unsigned int tgid[PROCESS_CHAINS_COUNT]; // process chains tgid } proc_chains_detail; // most important struct typedef struct { int et_type; unsigned long id; unsigned long long tv; task_detail task; // brief // user_stack_detail user_stack; // user stack kern_stack_detail kern_stack; // kernel stack proc_chains_detail proc_chains; // process chains argv raw_stack_detail raw_stack; } variable_monitor_task; // main struct typedef struct { int et_type; unsigned long id; unsigned long long tv; task_detail task; // brief kern_stack_detail kern_stack; // kernel stack } variable_monitor_task_system; typedef struct { struct radix_tree_root mm_tree; spinlock_t mm_tree_lock; } mm_tree; extern mm_tree mm_tree_struct; extern struct diag_variant_buffer load_monitor_variant_buffer; // Global buffer extern struct diag_variant_buffer stand_alone_buffer; // for single work void diag_task_brief(struct task_struct *tsk, task_detail *detail); // get task brief // void diag_task_user_stack(struct task_struct *tsk, // user_stack_detail *detail); // get task user stack void diag_task_raw_stack(struct task_struct *tsk, raw_stack_detail *detail); // get task raw stack unsigned int diag_task_kern_stack(struct task_struct *tsk, kern_stack_detail *detail); // get task kernel stack void dump_proc_chains_argv( int style, struct task_struct *tsk, mm_tree *mm_tree, proc_chains_detail *detail); // get process chains argv // print // void diag_printf_kern_stack(kern_stack_detail *kern_stack); // void diag_printf_kern_stack(kern_stack_detail *kern_stack, int reverse); // orig_X extern struct sched_class *orig_idle_sched_class; extern int (*orig_get_task_type)(struct sched_entity *se); extern int (*orig_kernfs_name)(struct kernfs_node *kn, char *buf, size_t buflen); extern int (*orig_access_remote_vm)(struct mm_struct *mm, unsigned long addr, void *buf, int len, unsigned int gup_flags); extern unsigned int (*orig_stack_trace_save_tsk)(struct task_struct *task, unsigned long *store, unsigned int size, unsigned int skipnr); extern struct task_struct *(*orig_find_task_by_vpid)(pid_t nr); #endif /* MODULE_MONITOR_TRACE_H */