kernel: is_current_single_threaded: don't use ->mmap_sem
[safe/jmp/linux-2.6] / lib / is_single_threaded.c
index 4340109..bd2bea9 100644 (file)
@@ -22,8 +22,6 @@ bool current_is_single_threaded(void)
        struct task_struct *p, *t;
        bool ret;
 
-       might_sleep();
-
        if (atomic_read(&task->signal->live) != 1)
                return false;
 
@@ -31,7 +29,6 @@ bool current_is_single_threaded(void)
                return true;
 
        ret = false;
-       down_write(&mm->mmap_sem);
        rcu_read_lock();
        for_each_process(p) {
                if (unlikely(p->flags & PF_KTHREAD))
@@ -45,12 +42,17 @@ bool current_is_single_threaded(void)
                                goto found;
                        if (likely(t->mm))
                                break;
+                       /*
+                        * t->mm == NULL. Make sure next_thread/next_task
+                        * will see other CLONE_VM tasks which might be
+                        * forked before exiting.
+                        */
+                       smp_rmb();
                } while_each_thread(p, t);
        }
        ret = true;
 found:
        rcu_read_unlock();
-       up_write(&mm->mmap_sem);
 
        return ret;
 }