diff options
Diffstat (limited to 'kernel/monitor_kernel_task.h')
| -rw-r--r-- | kernel/monitor_kernel_task.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/kernel/monitor_kernel_task.h b/kernel/monitor_kernel_task.h new file mode 100644 index 0000000..62e501c --- /dev/null +++ b/kernel/monitor_kernel_task.h @@ -0,0 +1,98 @@ +#include <linux/kernfs.h> +#include <linux/sched.h> + +#define CGROUP_NAME_LEN 32 // max length of cgroup name +#define TASK_COMM_LEN 16 // max length of task name + +#define BACKTRACE_DEPTH2 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 + +// 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 + */ + unsigned long user_mode; + char comm[TASK_COMM_LEN]; +} task_detail; + +typedef struct { + unsigned long stack[BACKTRACE_DEPTH2]; +} kern_stack_detail; + +typedef struct { + struct pt_regs regs; + unsigned long ip; + unsigned long bp; + unsigned long sp; + unsigned long stack[BACKTRACE_DEPTH2]; +} user_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 +} variable_monitor_task; + +typedef struct { + struct rcu_head rcu_head; + pid_t pid; + struct mm_struct *mm; + char cgroup_buf[256]; + char argv[256]; +} mm_info; + +typedef struct { + struct radix_tree_root mm_tree; + spinlock_t mm_tree_lock; +} mm_tree; + +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_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 + +// orig_X +struct sched_class *orig_idle_sched_class; +int (*orig_get_task_type)(struct sched_entity *se); +int (*orig_kernfs_name)(struct kernfs_node *kn, char *buf, size_t buflen); +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); + |
