This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
zhangyang-variable-monitor/source/module/monitor_trace.h

154 lines
4.8 KiB
C
Raw Normal View History

2023-11-26 22:56:16 -05:00
#ifndef MODULE_MONITOR_TRACE_H
#define MODULE_MONITOR_TRACE_H
2023-11-16 13:17:49 +08:00
#include <linux/kernfs.h>
#include <linux/sched.h>
2023-11-17 00:37:01 -05:00
2023-11-16 17:39:26 +08:00
#include "../buffer/variant_buffer.h"
2023-11-16 13:17:49 +08:00
#define CGROUP_NAME_LEN 32 // max length of cgroup name
#define TASK_COMM_LEN 16 // max length of task name
2023-11-16 17:39:26 +08:00
#define BACKTRACE_DEPTH 30 // max depth of backtrace
2023-11-16 13:17:49 +08:00
#define PROCESS_CHAINS_COUNT 10 // max count of process chains
#define PROCESS_ARGV_LEN 128 // max length of process argv
2023-12-12 04:05:56 -05:00
#define MAX_NAME_LEN (127) // max name length
2023-11-17 00:37:01 -05:00
#define TIMER_MAX_WATCH_NUM (32) // A timer max watch number at once time
2023-11-22 21:16:27 -05:00
#define DIAG_USER_STACK_SIZE (16 * 1024)
2023-11-27 20:59:18 -05:00
// dump type
#define VARIABLE_MONITOR_RECORD_TYPE 0x0
#define VARIABLE_MONITOR_TASK_TYPE 0x1
2023-12-06 05:03:44 -05:00
#define VARIABLE_MONITOR_TASK_TYPE_SYSTEM 0x2
2023-11-27 20:59:18 -05:00
2023-11-17 00:37:01 -05:00
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
2023-12-12 04:05:56 -05:00
long long true_value; // target true value
2023-11-17 00:37:01 -05:00
} threshold;
typedef struct {
int et_type;
unsigned long id;
unsigned long long tv;
2023-12-13 03:17:52 -05:00
int threshold_over_count;
2023-11-17 00:37:01 -05:00
threshold threshold_record[TIMER_MAX_WATCH_NUM];
} variable_monitor_record;
2023-11-16 13:17:49 +08:00
// 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
2023-12-14 02:22:17 -05:00
* may not be accurate
2023-11-16 13:17:49 +08:00
*/
unsigned long user_mode;
char comm[TASK_COMM_LEN];
2023-11-27 15:16:35 +08:00
} task_detail; // task brief
2023-11-16 13:17:49 +08:00
typedef struct {
2023-11-16 17:39:26 +08:00
unsigned long stack[BACKTRACE_DEPTH];
2023-11-27 15:16:35 +08:00
} kern_stack_detail; // kernel stack
2023-11-16 13:17:49 +08:00
2023-11-27 03:17:38 -05:00
// 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
2023-11-16 13:17:49 +08:00
2023-11-22 21:16:27 -05:00
typedef struct {
struct pt_regs regs;
unsigned long ip;
2023-11-27 15:16:35 +08:00
unsigned long bp;
unsigned long sp;
unsigned long stack_size;
unsigned long stack[DIAG_USER_STACK_SIZE / sizeof(unsigned long)];
2023-11-22 21:16:27 -05:00
} raw_stack_detail;
2023-11-16 13:17:49 +08:00
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;
2023-11-27 20:59:18 -05:00
task_detail task; // brief
2023-11-27 03:17:38 -05:00
// user_stack_detail user_stack; // user stack
2023-11-16 13:17:49 +08:00
kern_stack_detail kern_stack; // kernel stack
proc_chains_detail proc_chains; // process chains argv
2023-11-23 04:45:35 -05:00
raw_stack_detail raw_stack;
2023-11-27 15:16:35 +08:00
} variable_monitor_task; // main struct
2023-11-16 13:17:49 +08:00
2023-12-06 05:03:44 -05:00
typedef struct {
int et_type;
unsigned long id;
unsigned long long tv;
2023-12-12 04:05:56 -05:00
task_detail task; // brief
kern_stack_detail kern_stack; // kernel stack
} variable_monitor_task_system;
2023-12-06 05:03:44 -05:00
2023-11-16 13:17:49 +08:00
typedef struct {
struct radix_tree_root mm_tree;
spinlock_t mm_tree_lock;
} mm_tree;
2023-11-16 18:26:49 +08:00
extern mm_tree mm_tree_struct;
extern struct diag_variant_buffer load_monitor_variant_buffer; // Global buffer
2023-12-12 04:05:56 -05:00
extern struct diag_variant_buffer stand_alone_buffer; // for single work
2023-11-16 17:39:26 +08:00
2023-11-16 13:17:49 +08:00
void diag_task_brief(struct task_struct *tsk,
task_detail *detail); // get task brief
2023-11-27 03:17:38 -05:00
// void diag_task_user_stack(struct task_struct *tsk,
// user_stack_detail *detail); // get task user stack
2023-11-27 15:16:35 +08:00
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
2023-11-16 13:17:49 +08:00
void dump_proc_chains_argv(
int style, struct task_struct *tsk, mm_tree *mm_tree,
proc_chains_detail *detail); // get process chains argv
2023-11-19 20:30:48 -05:00
// print
// void diag_printf_kern_stack(kern_stack_detail *kern_stack);
// void diag_printf_kern_stack(kern_stack_detail *kern_stack, int reverse);
2023-11-16 13:17:49 +08:00
// orig_X
2023-11-16 17:39:26 +08:00
extern struct sched_class *orig_idle_sched_class;
extern int (*orig_get_task_type)(struct sched_entity *se);
2023-11-17 00:37:01 -05:00
extern int (*orig_kernfs_name)(struct kernfs_node *kn, char *buf,
size_t buflen);
2023-11-16 17:39:26 +08:00
extern int (*orig_access_remote_vm)(struct mm_struct *mm, unsigned long addr,
2023-11-17 00:37:01 -05:00
void *buf, int len, unsigned int gup_flags);
2023-11-16 13:17:49 +08:00
extern unsigned int (*orig_stack_trace_save_tsk)(struct task_struct *task,
unsigned long *store,
unsigned int size,
unsigned int skipnr);
2023-11-22 22:53:42 -05:00
extern struct task_struct *(*orig_find_task_by_vpid)(pid_t nr);
2023-11-26 22:56:16 -05:00
#endif /* MODULE_MONITOR_TRACE_H */