summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorJohn Doe <[email protected]>2023-12-11 07:48:30 +0000
committerJohn Doe <[email protected]>2023-12-11 07:48:30 +0000
commit894a10c48642d4f2948a7f5ef0ec3e8a8bfbb5ab (patch)
tree0267f61f6ec4963d74aa627deb60f9208c4e17af /source
parent40b3cb2a6036f42028170378de216197cc1d8998 (diff)
try to fix workqueue bug
Diffstat (limited to 'source')
-rw-r--r--source/module/monitor_kernel_lib.c7
-rw-r--r--source/module/monitor_timer.c23
-rw-r--r--source/module/monitor_timer.h6
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