[FIX] call schedule() in atomic context
authorVyacheslav Cherkashin <v.cherkashin@samsung.com>
Wed, 20 Nov 2013 08:28:59 +0000 (12:28 +0400)
committerGerrit Code Review <gerrit@gerrit.vlan144.tizendev.org>
Wed, 27 Nov 2013 12:58:16 +0000 (12:58 +0000)
Change-Id: Iec346d746331c5db38c358ef7ed99616d936feeb
Signed-off-by: Vyacheslav Cherkashin <v.cherkashin@samsung.com>
us_manager/pf/pf_group.c
us_manager/sspt/sspt_proc.c
us_manager/sspt/sspt_proc.h

index c3f4b2e..fcab09c 100644 (file)
@@ -289,6 +289,7 @@ void call_mm_release(struct task_struct *task)
 
        proc = sspt_proc_get_by_task(task);
        if (proc)
+               /* TODO: uninstall_proc - is not atomic context */
                uninstall_proc(proc);
 }
 
@@ -335,15 +336,8 @@ static void on_each_uninstall_proc(struct sspt_proc *proc, void *data)
 
 void uninstall_all(void)
 {
-       int tmp_oops_in_progress;
-
-       tmp_oops_in_progress = oops_in_progress;
-       oops_in_progress = 1;
-
-       on_each_proc(on_each_uninstall_proc, NULL);
-
-       oops_in_progress = tmp_oops_in_progress;
-
+       wait_proc_lock();
+       on_each_proc_no_lock(on_each_uninstall_proc, NULL);
        clean_pfg();
 }
 
index cb4ef72..a0525a5 100644 (file)
@@ -115,18 +115,29 @@ struct sspt_proc *sspt_proc_get_by_task(struct task_struct *task)
 }
 EXPORT_SYMBOL_GPL(sspt_proc_get_by_task);
 
-void on_each_proc(void (*func)(struct sspt_proc *, void *), void *data)
+void on_each_proc_no_lock(void (*func)(struct sspt_proc *, void *), void *data)
 {
        struct sspt_proc *proc, *tmp;
 
-       spin_lock(&proc_lock);
        list_for_each_entry_safe(proc, tmp, &proc_probes_list, list) {
                func(proc, data);
        }
+}
+
+void on_each_proc(void (*func)(struct sspt_proc *, void *), void *data)
+{
+       spin_lock(&proc_lock);
+       on_each_proc_no_lock(func, data);
        spin_unlock(&proc_lock);
 }
 EXPORT_SYMBOL_GPL(on_each_proc);
 
+void wait_proc_lock(void)
+{
+       spin_lock(&proc_lock);
+       spin_unlock(&proc_lock);
+}
+
 struct sspt_proc *sspt_proc_get_by_task_or_new(struct task_struct *task,
                                               void *priv)
 {
index 8bfd2a9..5f98644 100644 (file)
@@ -51,7 +51,10 @@ struct sspt_proc {
 struct sspt_proc *sspt_proc_create(struct task_struct *task, void *priv);
 void sspt_proc_free(struct sspt_proc *proc);
 
+void on_each_proc_no_lock(void (*func)(struct sspt_proc *, void *),
+                         void *data);
 void on_each_proc(void (*func)(struct sspt_proc *, void *), void *data);
+void wait_proc_lock(void);
 
 struct sspt_proc *sspt_proc_get_by_task(struct task_struct *task);
 struct sspt_proc *sspt_proc_get_by_task_or_new(struct task_struct *task,