try to fix workqueue bug
This commit is contained in:
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
void cancel_all_hrTimer(void);
|
||||
|
||||
// for work
|
||||
void cancel_all_work(void);
|
||||
void cancel_destory_all_work(void);
|
||||
Reference in New Issue
Block a user