summaryrefslogtreecommitdiff
path: root/kernel/monitor_kernel_task.h
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/monitor_kernel_task.h')
-rw-r--r--kernel/monitor_kernel_task.h98
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);
+