diff --git a/src/toa.c b/src/toa.c index 2942674..82382f9 100644 --- a/src/toa.c +++ b/src/toa.c @@ -1,3 +1,4 @@ +#include #include "toa.h" /* @@ -7,6 +8,9 @@ unsigned long sk_data_ready_addr = 0; +typedef unsigned long (*kallsyms_lookup_name_fun_t)(const char *name); +static kallsyms_lookup_name_fun_t kallsyms_lookup_name_fun; + /* * Statistics of toa in proc /proc/net/toa_stats */ @@ -23,6 +27,23 @@ struct toa_stats_entry toa_stats[] = { struct toa_stat_mib *ext_stats; +static int toa_get_kallsyms_lookup_name_addr(void) +{ + static struct kprobe kp = { + .symbol_name = "kallsyms_lookup_name", + }; + + if (register_kprobe(&kp) < 0) + return -1; + + if (!kallsyms_lookup_name_fun) { + kallsyms_lookup_name_fun = (kallsyms_lookup_name_fun_t)kp.addr; + } + unregister_kprobe(&kp); + + return 0; +} + #if defined(CONFIG_ARM64) /* * ARM64 interface @@ -41,7 +62,7 @@ static pte_t *lookup_address(unsigned long address, unsigned int *level) pte_t *ptep; unsigned long addr = address; - unsigned long init_mm = kallsyms_lookup_name("init_mm"); + unsigned long init_mm = kallsyms_lookup_name_fun("init_mm"); if (!init_mm) { TOA_INFO("CPU [%u] lookup_address init_mm null\n", smp_processor_id()); return NULL; @@ -52,7 +73,7 @@ static pte_t *lookup_address(unsigned long address, unsigned int *level) if (pgd_none(READ_ONCE(*pgdp))) return NULL; - pudp = pud_offset(pgdp, addr); + pudp = pud_offset((p4d_t *)pgdp, addr); pud = READ_ONCE(*pudp); if (pud_none(pud)) return NULL; @@ -522,6 +543,14 @@ static int toa_stats_seq_open(struct inode *inode, struct file *file) return single_open(file, toa_stats_show, NULL); } +#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,5,0) +static const struct proc_ops toa_stats_fops = { + .proc_open = toa_stats_seq_open, + .proc_read = seq_read, + .proc_lseek = seq_lseek, + .proc_release = single_release, +}; +#else static const struct file_operations toa_stats_fops = { .owner = THIS_MODULE, .open = toa_stats_seq_open, @@ -529,6 +558,7 @@ static const struct file_operations toa_stats_fops = { .llseek = seq_lseek, .release = single_release, }; +#endif /* * TOA module init and destory @@ -538,6 +568,13 @@ static const struct file_operations toa_stats_fops = { static int __init toa_init(void) { + int ret = -1; + + ret = toa_get_kallsyms_lookup_name_addr(); + if (ret < 0) { + return 1; + } + /* alloc statistics array for toa */ ext_stats = alloc_percpu(struct toa_stat_mib); if (NULL == ext_stats) @@ -547,7 +584,7 @@ toa_init(void) /* get the address of function sock_def_readable * so later we can know whether the sock is for rpc, tux or others */ - sk_data_ready_addr = kallsyms_lookup_name("sock_def_readable"); + sk_data_ready_addr = kallsyms_lookup_name_fun("sock_def_readable"); TOA_INFO("CPU [%u] sk_data_ready_addr = " "kallsyms_lookup_name(sock_def_readable) = %lu\n", smp_processor_id(), sk_data_ready_addr);