summaryrefslogtreecommitdiff
path: root/kernel/fork.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/fork.c')
-rw-r--r--kernel/fork.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/kernel/fork.c b/kernel/fork.c
index 380c1bafe75c..cbf4a12aab4d 100644
--- a/kernel/fork.c
+++ b/kernel/fork.c
@@ -364,6 +364,13 @@ static int copy_mm(unsigned long clone_flags, struct task_struct * tsk)
if (clone_flags & CLONE_VM) {
atomic_inc(&oldmm->mm_users);
mm = oldmm;
+ /*
+ * There are cases where the PTL is held to ensure no
+ * new threads start up in user mode using an mm, which
+ * allows optimizing out ipis; the tlb_gather_mmu code
+ * is an example.
+ */
+ spin_unlock_wait(&oldmm->page_table_lock);
goto good_mm;
}