diff -urNp init-race-ref/arch/alpha/mm/fault.c init-race/arch/alpha/mm/fault.c
--- init-race-ref/arch/alpha/mm/fault.c	Wed May 29 18:38:59 2002
+++ init-race/arch/alpha/mm/fault.c	Wed May 29 18:39:45 2002
@@ -147,13 +147,12 @@ good_area:
 	 * the fault.
 	 */
 	fault = handle_mm_fault(mm, vma, address, cause > 0);
-	up_read(&mm->mmap_sem);
-
 	if (fault < 0)
 		goto out_of_memory;
 	if (fault == 0)
 		goto do_sigbus;
 
+	up_read(&mm->mmap_sem);
 	return;
 
 /*
@@ -197,9 +196,9 @@ no_context:
 out_of_memory:
 	if (current->pid == 1) {
 		yield();
-		down_read(&mm->mmap_sem);
 		goto survive;
 	}
+	up_read(&mm->mmap_sem);
 	printk(KERN_ALERT "VM: killing process %s(%d)\n",
 	       current->comm, current->pid);
 	if (!user_mode(regs))
@@ -207,6 +206,7 @@ out_of_memory:
 	do_exit(SIGKILL);
 
 do_sigbus:
+	up_read(&mm->mmap_sem);
 	/*
 	 * Send a sigbus, regardless of whether we were in kernel
 	 * or user mode.
diff -urNp init-race-ref/arch/i386/mm/fault.c init-race/arch/i386/mm/fault.c
--- init-race-ref/arch/i386/mm/fault.c	Wed May 29 18:38:59 2002
+++ init-race/arch/i386/mm/fault.c	Wed May 29 18:40:23 2002
@@ -341,9 +341,9 @@ out_of_memory:
 	up_read(&mm->mmap_sem);
 	if (tsk->pid == 1) {
 		yield();
-		down_read(&mm->mmap_sem);
 		goto survive;
 	}
+	up_read(&mm->mmap_sem);
 	printk("VM: killing process %s\n", tsk->comm);
 	if (error_code & 4)
 		do_exit(SIGKILL);
diff -urNp init-race-ref/arch/ia64/mm/fault.c init-race/arch/ia64/mm/fault.c
--- init-race-ref/arch/ia64/mm/fault.c	Wed May 29 18:38:59 2002
+++ init-race/arch/ia64/mm/fault.c	Wed May 29 18:40:59 2002
@@ -194,12 +194,11 @@ ia64_do_page_fault (unsigned long addres
 	return;
 
   out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (current->pid == 1) {
 		yield();
-		down_read(&mm->mmap_sem);
 		goto survive;
 	}
+	up_read(&mm->mmap_sem);
 	printk("VM: killing process %s\n", current->comm);
 	if (user_mode(regs))
 		do_exit(SIGKILL);
diff -urNp init-race-ref/arch/ppc/mm/fault.c init-race/arch/ppc/mm/fault.c
--- init-race-ref/arch/ppc/mm/fault.c	Wed May 29 18:38:59 2002
+++ init-race/arch/ppc/mm/fault.c	Wed May 29 18:42:00 2002
@@ -196,12 +196,11 @@ bad_area:
  * us unable to handle the page fault gracefully.
  */
 out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (current->pid == 1) {
 		yield();
-		down_read(&mm->mmap_sem);
 		goto survive;
 	}
+	up_read(&mm->mmap_sem);
 	printk("VM: killing process %s\n", current->comm);
 	if (user_mode(regs))
 		do_exit(SIGKILL);
diff -urNp init-race-ref/arch/s390/mm/fault.c init-race/arch/s390/mm/fault.c
--- init-race-ref/arch/s390/mm/fault.c	Wed May 29 18:38:59 2002
+++ init-race/arch/s390/mm/fault.c	Wed May 29 18:42:22 2002
@@ -288,12 +288,11 @@ no_context:
  * us unable to handle the page fault gracefully.
 */
 out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (tsk->pid == 1) {
 		yield();
-		down_read(&mm->mmap_sem);
 		goto survive;
 	}
+	up_read(&mm->mmap_sem);
 	printk("VM: killing process %s\n", tsk->comm);
 	if (regs->psw.mask & PSW_PROBLEM_STATE)
 		do_exit(SIGKILL);
diff -urNp init-race-ref/arch/s390x/mm/fault.c init-race/arch/s390x/mm/fault.c
--- init-race-ref/arch/s390x/mm/fault.c	Wed May 29 18:38:59 2002
+++ init-race/arch/s390x/mm/fault.c	Wed May 29 18:42:39 2002
@@ -288,12 +288,11 @@ no_context:
  * us unable to handle the page fault gracefully.
 */
 out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (tsk->pid == 1) {
 		yield();
-		down_read(&mm->mmap_sem);
 		goto survive;
 	}
+	up_read(&mm->mmap_sem);
 	printk("VM: killing process %s\n", tsk->comm);
 	if (regs->psw.mask & PSW_PROBLEM_STATE)
 		do_exit(SIGKILL);
diff -urNp init-race-ref/arch/x86_64/mm/fault.c init-race/arch/x86_64/mm/fault.c
--- init-race-ref/arch/x86_64/mm/fault.c	Wed May 29 18:39:02 2002
+++ init-race/arch/x86_64/mm/fault.c	Wed May 29 18:39:11 2002
@@ -144,7 +144,6 @@ asmlinkage void do_page_fault(struct pt_
 	if (in_interrupt() || !mm)
 		goto no_context;
 
-again:
 	down_read(&mm->mmap_sem);
 
 	vma = find_vma(mm, address);
@@ -184,6 +183,7 @@ good_area:
 				goto bad_area;
 	}
 
+survive:
 	/*
 	 * If for any reason at all we couldn't handle the fault,
 	 * make sure we exit gracefully rather than endlessly redo
@@ -263,12 +263,12 @@ no_context:
  * us unable to handle the page fault gracefully.
  */
 out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (current->pid == 1) { 
 		tsk->policy |= SCHED_YIELD;
 		schedule();
-		goto again;
+		goto survive;
 	}
+	up_read(&mm->mmap_sem);
 	printk("VM: killing process %s\n", tsk->comm);
 	if (error_code & 4)
 		do_exit(SIGKILL);