summaryrefslogtreecommitdiff
path: root/source/module/monitor_timer.h
blob: 41090385a5c122ddfc32d7fd5b02e118d7c92be1 (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
#include <linux/hrtimer.h>
#include <linux/workqueue.h>

#define MAX_TIMER_NUM (128)      // max timer number
#define TIMER_MAX_WATCH_NUM (32) // A timer max watch number at once time
#define MAX_NAME_LEN (127)        // max name length

typedef struct {
  pid_t task_id;               // current process id
  char name[MAX_NAME_LEN + 1]; // name
  void *ptr;                   // virtual address
  int length_byte;             // byte
  long long threshold;         // threshold value
  unsigned char is_unsigned; // unsigned flag (true: unsigned, false: signed)
  unsigned char above_threshold;  // reverse flag (true: >, false: <)
  unsigned long time_ns;       // timer interval (ns)
} watch_arg;

typedef struct {
  pid_t task_id;               // current process id
  char name[MAX_NAME_LEN + 2]; // name, last char automatically add '\0'
  void *ptr;                   // user space virtual address
  void *kptr;                  // kernel address + offset
  int length_byte;             // byte
  long long threshold;         // threshold value
  long long true_value;        // target true value | available after reach threshold
  unsigned char is_unsigned; // unsigned flag (true: unsigned, false: signed)
  unsigned char above_threshold;  // reverse flag (true: >, false: <)
} kernel_watch_arg;

typedef struct {
  unsigned long long time_ns; // hrTimer time interval (ns)
  struct hrtimer hr_timer;    // hrTimer
  ktime_t kt;                 // hrTimer time
  unsigned sentinel;          // sentinel
  kernel_watch_arg
      k_watch_args[TIMER_MAX_WATCH_NUM]; // all watched kernel_watch_arg
  int threshold_num;                     // all over threshold number, 
                                         // 0 means no handle needed
  int threshold_buffer[TIMER_MAX_WATCH_NUM]; //
  struct work_struct wk;                     // for handle
} kernel_watch_timer;

// Global variable
extern kernel_watch_timer
    kernel_wtimer_list[MAX_TIMER_NUM]; // all kernel_watch_timer
extern volatile int kernel_wtimer_num;          // current kernel_watch_timer number

// EXPORT_SYMBOL(kernel_wtimer_list); // export kernel_watch_timer_list
// EXPORT_SYMBOL(kernel_wtimer_num);  // export kernel_watch_timer_num

unsigned char del_all_kwarg_by_pid(pid_t pid);

#define TIMER_START(timer)                                                     \
  (hrtimer_start(&timer->hr_timer, timer->kt, HRTIMER_MODE_REL))
#define TIMER_CANCEL(timer) (hrtimer_cancel(&timer->hr_timer))

// for timer
kernel_watch_timer *get_timer(unsigned long long time_ns);
unsigned char timer_add_watch(kernel_watch_timer *timer,
                              kernel_watch_arg k_watch_arg);
unsigned char timer_del_watch_by_pid(kernel_watch_timer *timer, pid_t pid);

extern enum hrtimer_restart check_variable_cb(struct hrtimer *timer); // callback
void start_all_hrTimer(void);
void cancel_all_hrTimer(void);

// for work
void init_work_all_hrTimer(void);
void cancel_all_work(void);
void cancel_destory_all_work(void);