From 894a10c48642d4f2948a7f5ef0ec3e8a8bfbb5ab Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 11 Dec 2023 07:48:30 +0000 Subject: [PATCH] try to fix workqueue bug --- source/module/monitor_kernel_lib.c | 7 +++++-- source/module/monitor_timer.c | 23 +++++++++++++++++++++-- source/module/monitor_timer.h | 6 +++++- 3 files changed, 31 insertions(+), 5 deletions(-) diff --git a/source/module/monitor_kernel_lib.c b/source/module/monitor_kernel_lib.c index 0b18e4d..31feb67 100644 --- a/source/module/monitor_kernel_lib.c +++ b/source/module/monitor_kernel_lib.c @@ -153,10 +153,12 @@ static void push_tskinfo_22_buffer(variable_monitor_task *tsk_info, unsigned lon /// @param static void clear_all_watch(void) { printk(KERN_INFO "clear all watch variable\n"); - // unmap and release the page - free_all_page_list(); // cancel timer cancel_all_hrTimer(); + // stop and destory work + cancel_destory_all_work(); + // unmap and release the page + free_all_page_list(); // clear timer kernel_wtimer_num = 0; memset(kernel_wtimer_list, 0, sizeof(kernel_wtimer_list)); @@ -353,6 +355,7 @@ void init_work_all_hrTimer(void) { void clear_watch(pid_t pid) { printk(KERN_INFO "Clear pid: %d's watch variable\n", pid); cancel_all_hrTimer(); // just in case + cancel_all_work(); // del_all_kwarg_by_pid(pid); // delete all kwarg with pid free_page_list(pid); // free page with pid init_work_all_hrTimer(); diff --git a/source/module/monitor_timer.c b/source/module/monitor_timer.c index f23e330..705f97e 100644 --- a/source/module/monitor_timer.c +++ b/source/module/monitor_timer.c @@ -152,7 +152,7 @@ void start_all_hrTimer(void) { printk(KERN_INFO "HrTimer start,module keep %d hrtimer for now\n", kernel_wtimer_num); } -/// @brief cancel hrTimer +/// @brief cancel hrTimer and stop all work /// @param void cancel_all_hrTimer(void) { int i = 0; @@ -161,6 +161,25 @@ void cancel_all_hrTimer(void) { timer = &(kernel_wtimer_list[i]); TIMER_CANCEL(timer); } - printk(KERN_INFO "HrTimer cancel,module keep %d hrtimer for now\n", kernel_wtimer_num); +} + + +void cancel_all_work(void) { + int i = 0; + kernel_watch_timer *timer = NULL; + for (i = 0; i < kernel_wtimer_num; i++) { + timer = &(kernel_wtimer_list[i]); + cancel_work_sync(&timer->wk); + } +} + +void cancel_destory_all_work(void) { + int i = 0; + kernel_watch_timer *timer = NULL; + for (i = 0; i < kernel_wtimer_num; i++) { + timer = &(kernel_wtimer_list[i]); + cancel_work_sync(&timer->wk); + destroy_work_on_stack(&timer->wk); + } } \ No newline at end of file diff --git a/source/module/monitor_timer.h b/source/module/monitor_timer.h index 3fec723..25dc68d 100644 --- a/source/module/monitor_timer.h +++ b/source/module/monitor_timer.h @@ -63,4 +63,8 @@ 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); \ No newline at end of file +void cancel_all_hrTimer(void); + +// for work +void cancel_all_work(void); +void cancel_destory_all_work(void); \ No newline at end of file