Turn core_state->nr_threads into atomic_t and kill now unneeded
down_write(&mm->mmap_sem) in exit_mm().
Signed-off-by: Oleg Nesterov <oleg@tv-sign.ru>
Cc: Roland McGrath <roland@redhat.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
        }
        rcu_read_unlock();
 done:
-       core_state->nr_threads = nr;
+       atomic_set(&core_state->nr_threads, nr);
        return nr;
 }
 
 
 };
 
 struct core_state {
-       int nr_threads;
+       atomic_t nr_threads;
        struct completion startup;
 };
 
 
        down_read(&mm->mmap_sem);
        if (mm->core_state) {
                up_read(&mm->mmap_sem);
-               down_write(&mm->mmap_sem);
-               if (!--mm->core_state->nr_threads)
+
+               if (atomic_dec_and_test(&mm->core_state->nr_threads))
                        complete(&mm->core_state->startup);
-               up_write(&mm->mmap_sem);
 
                wait_for_completion(&mm->core_done);
                down_read(&mm->mmap_sem);