

Signed-off-by: Andrew Morton <akpm@osdl.org>
Index: linux-2.6.8-rc1/mm/memory.c
===================================================================
--- linux-2.6.8-rc1.orig/mm/memory.c	2004-07-15 02:41:41.000000000 +1000
+++ linux-2.6.8-rc1/mm/memory.c	2004-07-15 10:03:31.429426327 +1000
@@ -706,6 +706,7 @@
 {
 	int i;
 	unsigned int flags;
+	int nr_pages = 0;
 
 	/* 
 	 * Require read or write permissions.
@@ -766,6 +767,13 @@
 		do {
 			struct page *map;
 			int lookup_write = write;
+
+			if ((++nr_pages & 63) == 0) {
+				spin_unlock(&mm->page_table_lock);
+				cpu_relax();
+				spin_lock(&mm->page_table_lock);
+			}
+
 			while (!(map = follow_page(mm, start, lookup_write))) {
 				/*
 				 * Shortcut for anonymous pages. We don't want
