--- 2.4.19pre7aa1/arch/alpha/mm/fault.c.~1~	Fri Apr 19 19:40:02 2002
+++ 2.4.19pre7aa1/arch/alpha/mm/fault.c	Fri Apr 19 19:45:18 2002
@@ -147,13 +147,12 @@
 	 * 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;
 
 /*
@@ -198,9 +197,9 @@
 	if (current->pid == 1) {
 		current->policy |= SCHED_YIELD;
 		schedule();
-		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))
@@ -208,6 +207,7 @@
 	do_exit(SIGKILL);
 
 do_sigbus:
+	up_read(&mm->mmap_sem);
 	/*
 	 * Send a sigbus, regardless of whether we were in kernel
 	 * or user mode.
--- 2.4.19pre7aa1/arch/i386/mm/fault.c.~1~	Fri Apr 19 19:40:03 2002
+++ 2.4.19pre7aa1/arch/i386/mm/fault.c	Fri Apr 19 19:43:08 2002
@@ -339,13 +339,12 @@
  * us unable to handle the page fault gracefully.
  */
 out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (tsk->pid == 1) {
 		tsk->policy |= SCHED_YIELD;
 		schedule();
-		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);
--- 2.4.19pre7aa1/arch/ia64/mm/fault.c.~1~	Fri Apr 19 19:40:02 2002
+++ 2.4.19pre7aa1/arch/ia64/mm/fault.c	Fri Apr 19 19:46:18 2002
@@ -194,13 +194,12 @@
 	return;
 
   out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (current->pid == 1) {
 		current->policy |= SCHED_YIELD;
 		schedule();
-		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);
--- 2.4.19pre7aa1/arch/ppc/mm/fault.c.~1~	Fri Apr 19 19:40:02 2002
+++ 2.4.19pre7aa1/arch/ppc/mm/fault.c	Fri Apr 19 19:43:43 2002
@@ -196,13 +196,12 @@
  * us unable to handle the page fault gracefully.
  */
 out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (current->pid == 1) {
 		current->policy |= SCHED_YIELD;
 		schedule();
-		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);
--- 2.4.19pre7aa1/arch/s390/mm/fault.c.~1~	Fri Apr 19 19:40:02 2002
+++ 2.4.19pre7aa1/arch/s390/mm/fault.c	Fri Apr 19 19:45:45 2002
@@ -288,13 +288,12 @@
  * us unable to handle the page fault gracefully.
 */
 out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (tsk->pid == 1) {
 		tsk->policy |= SCHED_YIELD;
 		schedule();
-		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);
--- 2.4.19pre7aa1/arch/s390x/mm/fault.c.~1~	Fri Apr 19 19:40:02 2002
+++ 2.4.19pre7aa1/arch/s390x/mm/fault.c	Fri Apr 19 19:45:54 2002
@@ -288,13 +288,12 @@
  * us unable to handle the page fault gracefully.
 */
 out_of_memory:
-	up_read(&mm->mmap_sem);
 	if (tsk->pid == 1) {
 		tsk->policy |= SCHED_YIELD;
 		schedule();
-		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);
--- 2.4.19pre7aa1/arch/x86_64/mm/fault.c.~1~	Fri Apr 19 19:40:08 2002
+++ 2.4.19pre7aa1/arch/x86_64/mm/fault.c	Fri Apr 19 19:43:27 2002
@@ -263,13 +263,12 @@
  * 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();
-		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);