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_timer.h
John Doe a880fd3b32 fix init work bug
kernel_wtimer_num to volatile
2023-12-01 11:19:07 +00:00

65 lines
2.7 KiB
C

#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
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);