[FIX] race condition, when stopped US instrumentation 24/18724/2
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Sat, 29 Mar 2014 16:36:33 +0000 (20:36 +0400)
committerDmitry Kovalenko <d.kovalenko@samsung.com>
Thu, 3 Apr 2014 04:16:33 +0000 (21:16 -0700)
Change-Id: I2f2a85b1b1c6b53215f0990e19ccc32df2f1eb7a
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
us_manager/helper.c
us_manager/helper.h
us_manager/pf/pf_group.c
us_manager/us_manager.c

index 2ba98ef..4de32a5 100644 (file)
@@ -321,11 +321,14 @@ unregister_unmap:
        return ret;
 }
 
-void unregister_helper(void)
+void unregister_helper_top(void)
 {
        /* uninstall kretprobe with 'handle_mm_fault' */
        dbi_unregister_kretprobe(&mf_kretprobe);
+}
 
+void unregister_helper_bottom(void)
+{
        /* uninstall kretprobe with 'do_mmap_pgoff' */
        dbi_unregister_kretprobe(&mmap_kretprobe);
 
index 62c37e0..d893371 100644 (file)
@@ -36,6 +36,7 @@ int init_helper(void);
 void uninit_helper(void);
 
 int register_helper(void);
-void unregister_helper(void);
+void unregister_helper_top(void);
+void unregister_helper_bottom(void);
 
 #endif /* _HELPER_H */
index fafd699..b8f01df 100644 (file)
@@ -276,7 +276,6 @@ void uninstall_proc(struct sspt_proc *proc)
        struct task_struct *task = proc->task;
        struct pf_group *pfg;
        struct pl_struct *pls;
-       int i;
 
        list_for_each_entry(pfg, &pfg_list, list) {
                pls = find_pl_struct(pfg, task);
@@ -287,15 +286,7 @@ void uninstall_proc(struct sspt_proc *proc)
        }
 
        task_lock(task);
-       for (i = 0; task->mm == NULL; ++i) {
-               task_unlock(task);
-               if (i >= 10)
-                       BUG();
-
-               schedule();
-               task_lock(task);
-       }
-
+       BUG_ON(task->mm == NULL);
        sspt_proc_uninstall(proc, task, US_UNREGS_PROBE);
        task_unlock(task);
 
index 5fe353e..8c5f3f2 100644 (file)
@@ -43,8 +43,9 @@ static enum status_type status = ST_OFF;
 
 static void do_usm_stop(void)
 {
-       unregister_helper();
+       unregister_helper_top();
        uninstall_all();
+       unregister_helper_bottom();
        sspt_proc_free_all();
 }