summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Doe <[email protected]>2023-12-01 11:19:07 +0000
committerJohn Doe <[email protected]>2023-12-01 11:19:07 +0000
commita880fd3b320d58e5fa6c8894a41087f54ef694f3 (patch)
tree2a301c692adbea17a95fc850dea09ab0b1559a94
parent0d1f57f06ea5c63d17edd98355da3733345ecc01 (diff)
fix init work bug
kernel_wtimer_num to volatile
-rw-r--r--source/module/monitor_kernel_lib.c16
-rw-r--r--source/module/monitor_timer.c8
-rw-r--r--source/module/monitor_timer.h2
3 files changed, 21 insertions, 5 deletions
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