[REFACTOR] remove installed probe on do_exit()
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 10 Apr 2013 16:05:48 +0000 (20:05 +0400)
committerVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 10 Apr 2013 17:14:50 +0000 (21:14 +0400)
driver/probes_manager.c
driver/probes_manager.h
driver/storage.c
driver/us_proc_inst.c
driver/us_proc_inst.h

index 8f0f5aa..58e7210 100644 (file)
 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);
index 2163c90..8c7a0a6 100644 (file)
@@ -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__)
index e5df3e6..ffa63d5 100644 (file)
@@ -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;
                }
        }
index 927be03..0c13d54 100644 (file)
@@ -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;
index 7b39b31..14dfdaf 100644 (file)
@@ -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 */