diff options
| author | Yang Wei <[email protected]> | 2022-01-13 14:55:04 +0800 |
|---|---|---|
| committer | Yang Wei <[email protected]> | 2022-01-13 15:07:46 +0800 |
| commit | 0e17a70ddc73aad0ed190757c6f1b1e68c3e53b4 (patch) | |
| tree | d652539a1fd3e6c74c067ab896bd88a62a48d97b /SOURCE | |
| parent | ff33d3677d3f0d28544db4d0e86b61bc0a52df3a (diff) | |
diagnose-tools: 初始化模块时一次性vmalloc申请diag_percpu_context,避免在频繁vmalloc申请出现模块加载慢问题
Diffstat (limited to 'SOURCE')
| -rw-r--r-- | SOURCE/module/entry.c | 32 |
1 files changed, 18 insertions, 14 deletions
diff --git a/SOURCE/module/entry.c b/SOURCE/module/entry.c index 237efb2..268077d 100644 --- a/SOURCE/module/entry.c +++ b/SOURCE/module/entry.c @@ -70,6 +70,7 @@ static DECLARE_MUTEX(controller_sem); static DEFINE_SEMAPHORE(controller_sem); #endif +static char *diag_context_mem; struct diag_percpu_context *diag_percpu_context[NR_CPUS]; unsigned long diag_ignore_jump_check = 0; unsigned long open_syscall = 0; @@ -484,6 +485,7 @@ static int __init diagnosis_init(void) { int ret = 0; char cgroup_buf[256]; + int diag_context_size; int i; ret = diag_init_symbol(); @@ -503,11 +505,15 @@ static int __init diagnosis_init(void) ret = -ENOMEM; memset(diag_percpu_context, 0, NR_CPUS * sizeof(struct diag_percpu_context *)); + + diag_context_size = num_possible_cpus() * sizeof(struct diag_percpu_context); + diag_context_mem = vmalloc(diag_context_size); + if (!diag_context_mem) + goto out_context; + + memset(diag_context_mem, 0, diag_context_size); for (i = 0; i < num_possible_cpus(); i++) { - diag_percpu_context[i] = vmalloc(sizeof(struct diag_percpu_context)); - if (diag_percpu_context[i] == NULL) - goto out_percpu_context; - memset(diag_percpu_context[i], 0, sizeof(struct diag_percpu_context)); + diag_percpu_context[i] = (struct diag_percpu_context *)(diag_context_mem + i * sizeof(struct diag_percpu_context)); } ret = diag_linux_proc_init(); @@ -597,20 +603,18 @@ out_net: out_kern: diag_linux_proc_exit(); out_proc: - alidiagnose_symbols_exit(); -out_percpu_context: - for (i = 0; i < num_possible_cpus(); i++) { - if (diag_percpu_context[i] != NULL) - vfree(diag_percpu_context[i]); + if (diag_context_mem) { + vfree(diag_context_mem); + diag_context_mem = NULL; } +out_context: + alidiagnose_symbols_exit(); out: return ret; } static void __exit diagnosis_exit(void) { - int i; - printk("diagnose-tools in diagnosis_exit\n"); if (sys_enter_hooked) @@ -660,9 +664,9 @@ static void __exit diagnosis_exit(void) synchronize_sched(); - for (i = 0; i < num_possible_cpus(); i++) { - if (diag_percpu_context[i] != NULL) - vfree(diag_percpu_context[i]); + if (diag_context_mem) { + vfree(diag_context_mem); + diag_context_mem = NULL; } } |
