summaryrefslogtreecommitdiff
path: root/source/module/monitor_trace.h
blob: 1878077015b7120f0b864e316b4c72a0c3cb11fa (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
#ifndef MODULE_MONITOR_TRACE_H
#define MODULE_MONITOR_TRACE_H

#include <linux/kernfs.h>
#include <linux/sched.h>

#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

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_num;
  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
   */
  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 {
  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

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 */