diff --git a/source/module/monitor_kernel_lib.c b/source/module/monitor_kernel_lib.c index ade2616..f485a1d 100644 --- a/source/module/monitor_kernel_lib.c +++ b/source/module/monitor_kernel_lib.c @@ -305,6 +305,17 @@ int start_watch_variable(watch_arg warg) { return 0; } +void init_work_all_hrTimer(void) { + int i = 0; + kernel_watch_timer *timer = NULL; + for (i = 0; i < kernel_wtimer_num; i++) { + timer = &(kernel_wtimer_list[i]); + // init work + INIT_WORK(&timer->wk, diag_task_info_work); + } + // printk(KERN_INFO "HrTimer work init,module keep %d hrtimer for now\n", kernel_wtimer_num); +} + /** * @brief clear watch with pid * @@ -315,6 +326,7 @@ void clear_watch(pid_t pid) { cancel_all_hrTimer(); // just in case del_all_kwarg_by_pid(pid); // delete all kwarg with pid free_page_list(pid); // free page with pid + init_work_all_hrTimer(); start_all_hrTimer(); // restart timer } @@ -342,11 +354,11 @@ enum hrtimer_restart check_variable_cb(struct hrtimer *timer) { if (j > 0) // if any threshold reached { k_watch_timer->threshold_num = j; + // highpri_wq + queue_work(system_highpri_wq, &k_watch_timer->wk); // restart timer after 5s hrtimer_forward(timer, timer->base->get_time(), ktime_set(dump_reset_sec, 0)); //! todo - // highpri_wq - queue_work(system_highpri_wq, &k_watch_timer->wk); } else { // keep frequency hrtimer_forward(timer, timer->base->get_time(), k_watch_timer->kt); diff --git a/source/module/monitor_timer.c b/source/module/monitor_timer.c index 2eb768f..d669b76 100644 --- a/source/module/monitor_timer.c +++ b/source/module/monitor_timer.c @@ -3,7 +3,7 @@ // Global variable kernel_watch_timer kernel_wtimer_list[MAX_TIMER_NUM] = { 0}; // all kernel_watch_timer -int kernel_wtimer_num = 0; // current kernel_watch_timer number +volatile int kernel_wtimer_num = 0; // 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 @@ -18,15 +18,19 @@ unsigned char del_all_kwarg_by_pid(pid_t pid) { kernel_watch_timer *timer = NULL; printk(KERN_INFO "del kwarg..."); - + // printk(KERN_INFO "del kwarg kernel_wtimer_num:%d", kernel_wtimer_num); for (i = 0; i < kernel_wtimer_num; i++) { + // printk(KERN_INFO "del watch i:%d", i); timer = &(kernel_wtimer_list[i]); timer_del_watch_by_pid(timer, pid); } + // printk(KERN_INFO "del kwarg kernel_wtimer_num:%d", kernel_wtimer_num); for (i = 0; i < kernel_wtimer_num; i++) { + // printk(KERN_INFO "del timer i:%d", i); timer = &(kernel_wtimer_list[i]); if (TIMER_NO_KWARG(timer)) // no available kwarg { + // printk(KERN_INFO "del timer empty %d", i); // cancel and destroy timer.work // make sure empty timer has no work active cancel_work_sync(&timer->wk); diff --git a/source/module/monitor_timer.h b/source/module/monitor_timer.h index 910fdcf..43c2e10 100644 --- a/source/module/monitor_timer.h +++ b/source/module/monitor_timer.h @@ -43,7 +43,7 @@ typedef struct { // Global variable extern kernel_watch_timer kernel_wtimer_list[MAX_TIMER_NUM]; // all kernel_watch_timer -extern int kernel_wtimer_num; // current kernel_watch_timer number +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