From: Anatolii Nikulin Date: Fri, 17 Jun 2016 07:57:30 +0000 (+0300) Subject: [FIX] modules loading for kernel 4.4 X-Git-Tag: submit/tizen/20161124.145503~27 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=refs%2Fchanges%2F71%2F75271%2F4;p=kernel%2Fswap-modules.git [FIX] modules loading for kernel 4.4 Change-Id: I97bd9063f19ccead6579440f8f263190c34fa578 Signed-off-by: Anatolii Nikulin --- diff --git a/kprobe/swap_kprobes_deps.c b/kprobe/swap_kprobes_deps.c index 22561e9..86ce257 100644 --- a/kprobe/swap_kprobes_deps.c +++ b/kprobe/swap_kprobes_deps.c @@ -76,7 +76,20 @@ static inline void swap_kunmap_atomic(void *kvaddr) } #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 36) */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) +DECLARE_MOD_FUNC_DEP(do_mmap, unsigned long, struct file *file, + unsigned long addr, unsigned long len, unsigned long prot, + unsigned long flags, vm_flags_t vm_flags, + unsigned long pgoff, unsigned long *populate); +DECLARE_MOD_DEP_WRAPPER(swap_do_mmap, + unsigned long, + struct file *file, unsigned long addr, + unsigned long len, unsigned long prot, + unsigned long flags, vm_flags_t vm_flags, + unsigned long pgoff, unsigned long *populate) +IMP_MOD_DEP_WRAPPER(do_mmap, file, addr, len, + prot, flags, vm_flags, pgoff, populate) +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) DECLARE_MOD_FUNC_DEP(do_mmap_pgoff, unsigned long, struct file *file, unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long pgoff, @@ -101,7 +114,9 @@ DECLARE_MOD_DEP_WRAPPER(swap_do_mmap_pgoff, IMP_MOD_DEP_WRAPPER(do_mmap_pgoff, file, addr, len, prot, flags, pgoff) #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) +EXPORT_SYMBOL_GPL(swap_do_mmap); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) EXPORT_SYMBOL_GPL(swap_do_mmap_pgoff); #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) */ @@ -136,6 +151,7 @@ static DECLARE_MOD_FUNC_DEP(handle_mm_fault, int, struct mm_struct *mm, unsigned int flags); #endif /* LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30) */ +#ifdef __HAVE_ARCH_GATE_AREA #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) static DECLARE_MOD_FUNC_DEP(get_gate_vma, struct vm_area_struct *, struct mm_struct *mm); @@ -144,7 +160,6 @@ static DECLARE_MOD_FUNC_DEP(get_gate_vma, struct vm_area_struct *, struct task_struct *tsk); #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ -#ifdef __HAVE_ARCH_GATE_AREA #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) DECLARE_MOD_FUNC_DEP(in_gate_area, int, struct mm_struct *mm, unsigned long addr); @@ -152,13 +167,13 @@ DECLARE_MOD_FUNC_DEP(in_gate_area, int, struct mm_struct *mm, DECLARE_MOD_FUNC_DEP(in_gate_area, int, struct task_struct *task, unsigned long addr); #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ -#endif /* __HAVE_ARCH_GATE_AREA */ #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) static DECLARE_MOD_FUNC_DEP(in_gate_area_no_mm, int, unsigned long addr); #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ static DECLARE_MOD_FUNC_DEP(in_gate_area_no_task, int, unsigned long addr); #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ +#endif /* __HAVE_ARCH_GATE_AREA */ #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) static DECLARE_MOD_FUNC_DEP(follow_page_mask, \ @@ -228,17 +243,22 @@ DECLARE_MOD_DEP_WRAPPER(swap_handle_mm_fault, } #endif /* LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 30) */ +struct vm_area_struct *swap_get_gate_vma(struct mm_struct *mm) +{ +#ifdef __HAVE_ARCH_GATE_AREA #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) -DECLARE_MOD_DEP_WRAPPER(swap_get_gate_vma, - struct vm_area_struct *, - struct mm_struct *mm) IMP_MOD_DEP_WRAPPER(get_gate_vma, mm) #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ -DECLARE_MOD_DEP_WRAPPER(swap_get_gate_vma, - struct vm_area_struct *, - struct task_struct *tsk) IMP_MOD_DEP_WRAPPER(get_gate_vma, tsk) #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ +#else /* __HAVE_ARCH_GATE_AREA */ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) + return get_gate_vma(mm); +#else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ + return get_gate_vma(tsk); +#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ +#endif /* __HAVE_ARCH_GATE_AREA */ +} #ifdef CONFIG_HUGETLB_PAGE @@ -309,6 +329,7 @@ static inline int swap_in_gate_area(struct task_struct *task, } +#ifdef __HAVE_ARCH_GATE_AREA #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) DECLARE_MOD_DEP_WRAPPER(swap_in_gate_area_no_mm, int, unsigned long addr) IMP_MOD_DEP_WRAPPER(in_gate_area_no_mm, addr) @@ -316,14 +337,23 @@ IMP_MOD_DEP_WRAPPER(in_gate_area_no_mm, addr) DECLARE_MOD_DEP_WRAPPER(swap_in_gate_area_no_task, int, unsigned long addr) IMP_MOD_DEP_WRAPPER(in_gate_area_no_task, addr) #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ +#endif /* __HAVE_ARCH_GATE_AREA */ static inline int swap_in_gate_area_no_xxx(unsigned long addr) { +#ifdef __HAVE_ARCH_GATE_AREA #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) return swap_in_gate_area_no_mm(addr); #else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ return swap_in_gate_area_no_task(addr); #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ +#else /* __HAVE_ARCH_GATE_AREA */ +#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) + return in_gate_area_no_mm(addr); +#else /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ + return in_gate_area_no_task(addr); +#endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ +#endif /* __HAVE_ARCH_GATE_AREA */ } DECLARE_MOD_DEP_WRAPPER(swap__flush_anon_page, @@ -369,7 +399,6 @@ int init_module_dependencies(void) #endif /* copy_to_user_page */ INIT_MOD_DEP_VAR(find_extend_vma, find_extend_vma); - INIT_MOD_DEP_VAR(get_gate_vma, get_gate_vma); #ifdef CONFIG_HUGETLB_PAGE INIT_MOD_DEP_VAR(follow_hugetlb_page, follow_hugetlb_page); @@ -377,6 +406,13 @@ int init_module_dependencies(void) #ifdef __HAVE_ARCH_GATE_AREA INIT_MOD_DEP_VAR(in_gate_area, in_gate_area); + INIT_MOD_DEP_VAR(get_gate_vma, get_gate_vma); + +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) + INIT_MOD_DEP_VAR(in_gate_area_no_mm, in_gate_area_no_mm); +#else /* (LINUX_VERSION_CODE > KERNEL_VERSION(3, 9, 0)) */ + INIT_MOD_DEP_VAR(in_gate_area_no_task, in_gate_area_no_task); +#endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(3, 9, 0)) */ #endif #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) @@ -390,10 +426,6 @@ int init_module_dependencies(void) #ifndef is_zero_pfn swap_zero_pfn = page_to_pfn(ZERO_PAGE(0)); #endif /* is_zero_pfn */ - - INIT_MOD_DEP_VAR(in_gate_area_no_mm, in_gate_area_no_mm); -#else /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)) */ - INIT_MOD_DEP_VAR(in_gate_area_no_task, in_gate_area_no_task); #endif /* (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38)) */ #if defined(ARCH_HAS_FLUSH_ANON_PAGE) && defined(CONFIG_ARM) @@ -411,7 +443,9 @@ int init_module_dependencies(void) #else /*2.6.16 */ INIT_MOD_DEP_VAR(put_task_struct, __put_task_struct_cb); #endif -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) + INIT_MOD_DEP_VAR(do_mmap, do_mmap); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) INIT_MOD_DEP_VAR(do_mmap_pgoff, do_mmap_pgoff); #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3, 5, 0) */ diff --git a/kprobe/swap_kprobes_deps.h b/kprobe/swap_kprobes_deps.h index f34a54e..54ab644 100644 --- a/kprobe/swap_kprobes_deps.h +++ b/kprobe/swap_kprobes_deps.h @@ -142,7 +142,12 @@ int access_process_vm_atomic(struct task_struct *tsk, unsigned long addr, access_process_vm_atomic(tsk, addr, buf, len, 1) int page_present(struct mm_struct *mm, unsigned long addr); -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) +unsigned long swap_do_mmap(struct file *file, unsigned long addr, + unsigned long len, unsigned long prot, + unsigned long flags, vm_flags_t vm_flags, + unsigned long pgoff, unsigned long *populate); +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) unsigned long swap_do_mmap_pgoff(struct file *file, unsigned long addr, unsigned long len, unsigned long prot, unsigned long flags, unsigned long pgoff, diff --git a/loader/loader_module.c b/loader/loader_module.c index 8b46f5f..ff9e125 100644 --- a/loader/loader_module.c +++ b/loader/loader_module.c @@ -397,7 +397,11 @@ static int mmap_ret_handler(struct kretprobe_instance *ri, } static struct kretprobe mmap_rp = { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) + .kp.symbol_name = "do_mmap", +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */ .kp.symbol_name = "do_mmap_pgoff", +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */ .data_size = sizeof(struct mmap_priv), .entry_handler = mmap_entry_handler, .handler = mmap_ret_handler diff --git a/loader/loader_pd.c b/loader/loader_pd.c index 0ee9ebe..418453f 100644 --- a/loader/loader_pd.c +++ b/loader/loader_pd.c @@ -134,8 +134,8 @@ static struct pd_t *__create_pd(void) return NULL; down_write(¤t->mm->mmap_sem); - page = swap_do_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_WRITE, - MAP_ANONYMOUS | MAP_PRIVATE, 0); + page = __swap_do_mmap(NULL, 0, PAGE_SIZE, PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, 0); up_write(¤t->mm->mmap_sem); if (IS_ERR_VALUE(page)) { printk(KERN_ERR LOADER_PREFIX diff --git a/task_ctx/task_ctx.c b/task_ctx/task_ctx.c index 2bbd046..fb12f1d 100644 --- a/task_ctx/task_ctx.c +++ b/task_ctx/task_ctx.c @@ -264,7 +264,11 @@ static int taskctx_once(void) if (swap_signal_wake_up_state == NULL) goto not_found; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0) + sym = "get_signal"; +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)) */ sym = "get_signal_to_deliver"; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0)) */ sig_kprobe.addr = swap_ksyms(sym); if (sig_kprobe.addr == 0) goto not_found; diff --git a/us_manager/helper.c b/us_manager/helper.c index e8e6dc0..47e813a 100644 --- a/us_manager/helper.c +++ b/us_manager/helper.c @@ -827,12 +827,20 @@ int once_helper(void) if (unmap_kretprobe.kp.addr == 0) goto not_found; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) + sym = "do_mmap"; +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */ sym = "do_mmap_pgoff"; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */ mmap_kretprobe.kp.addr = swap_ksyms(sym); if (mmap_kretprobe.kp.addr == 0) goto not_found; +#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0) + sym = "__set_task_comm"; +#else /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */ sym = "set_task_comm"; +#endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)) */ comm_kretprobe.kp.addr = swap_ksyms(sym); if (comm_kretprobe.kp.addr == 0) goto not_found; diff --git a/us_manager/us_manager_common.h b/us_manager/us_manager_common.h index f190be2..4400e31 100644 --- a/us_manager/us_manager_common.h +++ b/us_manager/us_manager_common.h @@ -33,12 +33,20 @@ #include -static inline unsigned long swap_do_mmap(struct file *filp, unsigned long addr, - unsigned long len, unsigned long prot, - unsigned long flag, - unsigned long offset) +static inline unsigned long __swap_do_mmap(struct file *filp, + unsigned long addr, + unsigned long len, + unsigned long prot, + unsigned long flag, + unsigned long offset) { -#if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) +#if LINUX_VERSION_CODE > KERNEL_VERSION(4, 3, 0) + unsigned long populate; + + return swap_do_mmap(filp, addr, len, prot, + flag, 0, offset, &populate); + +#elif LINUX_VERSION_CODE >= KERNEL_VERSION(3, 9, 0) unsigned long populate; return swap_do_mmap_pgoff(filp, addr, len, prot, diff --git a/us_manager/us_slot_manager.c b/us_manager/us_slot_manager.c index 536d349..a48972f 100644 --- a/us_manager/us_slot_manager.c +++ b/us_manager/us_slot_manager.c @@ -39,8 +39,9 @@ static void *sm_alloc_us(struct slot_manager *sm) { unsigned long addr; - addr = swap_do_mmap(NULL, 0, PAGE_SIZE, PROT_EXEC|PROT_READ|PROT_WRITE, - MAP_ANONYMOUS|MAP_PRIVATE, 0); + addr = __swap_do_mmap(NULL, 0, PAGE_SIZE, + PROT_EXEC | PROT_READ | PROT_WRITE, + MAP_ANONYMOUS | MAP_PRIVATE, 0); return (void *)addr; }