From: Vyacheslav Cherkashin Date: Wed, 10 Apr 2013 16:05:48 +0000 (+0400) Subject: [REFACTOR] remove installed probe on do_exit() X-Git-Tag: Tizen_SDK_2.3~552 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f5ae4bd96002e8a23fec30d541746415a45606d3;p=kernel%2Fswap-modules.git [REFACTOR] remove installed probe on do_exit() --- diff --git a/driver/probes_manager.c b/driver/probes_manager.c index 8f0f5aa..58e7210 100644 --- a/driver/probes_manager.c +++ b/driver/probes_manager.c @@ -39,10 +39,8 @@ unsigned long pf_addr; unsigned long cp_addr; unsigned long mr_addr; -unsigned long exit_addr; unsigned long unmap_addr; kernel_probe_t *pf_probe = NULL; -kernel_probe_t *exit_probe = NULL; unsigned int probes_flags = 0; int @@ -70,12 +68,6 @@ probes_manager_init (void) return -EINVAL; } - exit_addr = swap_ksyms("do_exit"); - if (exit_addr == 0) { - EPRINTF("Cannot find address for do_exit function!"); - return -EINVAL; - } - unmap_addr = swap_ksyms("do_munmap"); if (unmap_addr == 0) { EPRINTF("Cannot find address for do_munmap function!"); @@ -96,9 +88,7 @@ static int register_kernel_jprobe (kernel_probe_t * probe) { int result; - if( ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) || - ((probe == exit_probe) && (us_proc_probes & US_PROC_EXIT_INSTLD))) - { + if ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) { return 0; // probe is already registered } result = dbi_register_jprobe (&probe->jprobe); @@ -113,8 +103,7 @@ register_kernel_jprobe (kernel_probe_t * probe) static int unregister_kernel_jprobe (kernel_probe_t * probe) { - if( ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) || - ((probe == exit_probe) && (us_proc_probes & US_PROC_EXIT_INSTLD)) ) { + if ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) { return 0; // probe is necessary for user space instrumentation } dbi_unregister_jprobe (&probe->jprobe); @@ -125,8 +114,7 @@ static int register_kernel_retprobe (kernel_probe_t * probe) { int result; - if( ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) || - ((probe == exit_probe) && (us_proc_probes & US_PROC_EXIT_INSTLD)) ) { + if ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) { return 0; // probe is already registered } @@ -143,8 +131,7 @@ register_kernel_retprobe (kernel_probe_t * probe) static int unregister_kernel_retprobe (kernel_probe_t * probe) { - if( ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) || - ((probe == exit_probe) && (us_proc_probes & US_PROC_EXIT_INSTLD)) ) { + if ((probe == pf_probe) && (us_proc_probes & US_PROC_PF_INSTLD)) { return 0; // probe is necessary for user space instrumentation } dbi_unregister_kretprobe (&probe->retprobe); @@ -225,21 +212,11 @@ add_probe (unsigned long addr) } pprobe = &pf_probe; } - else if (addr == exit_addr) { - probes_flags |= PROBE_FLAG_EXIT_INSTLD; - if (us_proc_probes & US_PROC_EXIT_INSTLD) - { - return 0; - } - pprobe = &exit_probe; - } result = add_probe_to_list (addr, pprobe); if (result) { if (addr == pf_addr) probes_flags &= ~PROBE_FLAG_PF_INSTLD; - else if (addr == exit_addr) - probes_flags &= ~PROBE_FLAG_EXIT_INSTLD; } return result; } @@ -253,9 +230,6 @@ int reset_probes(void) if (p->addr == pf_addr) { probes_flags &= ~PROBE_FLAG_PF_INSTLD; pf_probe = NULL; - } else if (p->addr == exit_addr) { - probes_flags &= ~PROBE_FLAG_EXIT_INSTLD; - exit_probe = NULL; } hlist_del(node); kfree(p); @@ -265,9 +239,6 @@ int reset_probes(void) if (p->addr == pf_addr) { probes_flags &= ~PROBE_FLAG_PF_INSTLD; pf_probe = NULL; - } else if (p->addr == exit_addr) { - probes_flags &= ~PROBE_FLAG_EXIT_INSTLD; - exit_probe = NULL; } hlist_del(node); kfree(p); @@ -295,14 +266,6 @@ remove_probe (unsigned long addr) } pf_probe = NULL; } - else if (addr == exit_addr) { - probes_flags &= ~PROBE_FLAG_EXIT_INSTLD; - if (us_proc_probes & US_PROC_EXIT_INSTLD) - { - return 0; - } - exit_probe = NULL; - } result = remove_probe_from_list (addr); @@ -345,13 +308,6 @@ def_jprobe_event_handler (unsigned long arg1, unsigned long arg2, unsigned long skip = 1; #endif /* CONFIG_X86 */ } - else if (exit_probe == probe) - { - if (us_proc_probes & US_PROC_EXIT_INSTLD) - do_exit_probe_pre_code(); - if (!(probes_flags & PROBE_FLAG_EXIT_INSTLD)) - skip = 1; - } if (!skip) pack_event_info (KS_PROBE_ID, RECORD_ENTRY, "pxxxxxx", probe->addr, arg1, arg2, arg3, arg4, arg5, arg6); @@ -371,11 +327,6 @@ def_retprobe_event_handler (struct kretprobe_instance *pi, struct pt_regs *regs, if (!(probes_flags & PROBE_FLAG_PF_INSTLD)) skip = 1; } - else if (exit_probe == probe) - { - if (!(probes_flags & PROBE_FLAG_EXIT_INSTLD)) - skip = 1; - } if (!skip) { ret_val = regs_return_value(regs); diff --git a/driver/probes_manager.h b/driver/probes_manager.h index 2163c90..8c7a0a6 100644 --- a/driver/probes_manager.h +++ b/driver/probes_manager.h @@ -55,18 +55,15 @@ int install_kern_otg_probe(unsigned long addr, extern unsigned long pf_addr; extern unsigned long cp_addr; extern unsigned long mr_addr; -extern unsigned long exit_addr; extern unsigned long unmap_addr; extern kernel_probe_t *pf_probe; -extern kernel_probe_t *exit_probe; extern unsigned int probes_flags; #if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) extern spinlock_t ec_probe_spinlock; #endif /* LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 38) */ enum { - PROBE_FLAG_PF_INSTLD = (1 << 0), - PROBE_FLAG_EXIT_INSTLD = (1 << 3) + PROBE_FLAG_PF_INSTLD = (1 << 0) }; #endif // !defined(__PROBES_MANAGER_H__) diff --git a/driver/storage.c b/driver/storage.c index e5df3e6..ffa63d5 100644 --- a/driver/storage.c +++ b/driver/storage.c @@ -1129,8 +1129,7 @@ void pack_task_event_info(struct task_struct *task, probe_id_t probe_id, va_start(args, fmt); addr = get_probe_func_addr(fmt, args); va_end(args); - if( ((addr == pf_addr) && !(probes_flags & PROBE_FLAG_PF_INSTLD)) || - ((addr == exit_addr) && !(probes_flags & PROBE_FLAG_EXIT_INSTLD)) ) { + if ((addr == pf_addr) && !(probes_flags & PROBE_FLAG_PF_INSTLD)) { return; } } diff --git a/driver/us_proc_inst.c b/driver/us_proc_inst.c index 927be03..0c13d54 100644 --- a/driver/us_proc_inst.c +++ b/driver/us_proc_inst.c @@ -433,11 +433,6 @@ int deinst_usr_space_proc (void) /* uninstall jprobe with 'mm_release' */ dbi_unregister_jprobe(&mr_jprobe); - iRet = uninstall_kernel_probe (exit_addr, US_PROC_EXIT_INSTLD, - 0, &exit_probe); - if (iRet) - EPRINTF ("uninstall_kernel_probe(do_exit) result=%d!", iRet); - /* uninstall jprobe with 'do_munmap' */ dbi_unregister_jprobe(&unmap_jprobe); @@ -591,13 +586,7 @@ int inst_usr_space_proc (void) EPRINTF ("install_kernel_probe(do_page_fault) result=%d!", ret); return ret; } - // enable 'do_exit' probe to detect for remove task_struct - ret = install_kernel_probe (exit_addr, US_PROC_EXIT_INSTLD, 0, &exit_probe); - if (ret != 0) - { - EPRINTF ("install_kernel_probe(do_exit) result=%d!", ret); - return ret; - } + /* install kretprobe on 'copy_process' */ cp_kretprobe.kp.addr = cp_addr; ret = dbi_register_kretprobe(&cp_kretprobe); @@ -953,13 +942,6 @@ void do_page_fault_ret_pre_code (void) EXPORT_SYMBOL_GPL(do_page_fault_ret_pre_code); - -void do_exit_probe_pre_code (void) -{ - // TODO: remove task -} -EXPORT_SYMBOL_GPL(do_exit_probe_pre_code); - void print_vma(struct mm_struct *mm) { struct vm_area_struct *vma; diff --git a/driver/us_proc_inst.h b/driver/us_proc_inst.h index 7b39b31..14dfdaf 100644 --- a/driver/us_proc_inst.h +++ b/driver/us_proc_inst.h @@ -32,16 +32,12 @@ extern int deinst_usr_space_proc (void); extern void do_page_fault_j_pre_code(unsigned long addr, unsigned int fsr, struct pt_regs *regs); extern void do_page_fault_ret_pre_code (void); -/* Detects when target process exits. */ -extern void do_exit_probe_pre_code (void); - extern int us_proc_probes; extern pid_t gl_nNotifyTgid; enum { - US_PROC_PF_INSTLD = (1 << 0), - US_PROC_EXIT_INSTLD = (1 << 3) + US_PROC_PF_INSTLD = (1 << 0) }; /* forward declarations */