svn commit: r187701 - user/alc/zerocopy/sys/vm

Alan Cox alc at FreeBSD.org
Sun Jan 25 16:52:10 PST 2009


Author: alc
Date: Mon Jan 26 00:52:09 2009
New Revision: 187701
URL: http://svn.freebsd.org/changeset/base/187701

Log:
  Retire the page-based copy-on-write mechanism.

Modified:
  user/alc/zerocopy/sys/vm/vm_fault.c
  user/alc/zerocopy/sys/vm/vm_page.c
  user/alc/zerocopy/sys/vm/vm_page.h

Modified: user/alc/zerocopy/sys/vm/vm_fault.c
==============================================================================
--- user/alc/zerocopy/sys/vm/vm_fault.c	Sun Jan 25 23:08:47 2009	(r187700)
+++ user/alc/zerocopy/sys/vm/vm_fault.c	Mon Jan 26 00:52:09 2009	(r187701)
@@ -330,25 +330,6 @@ RetryFault:;
 		 */
 		fs.m = vm_page_lookup(fs.object, fs.pindex);
 		if (fs.m != NULL) {
-			/* 
-			 * check for page-based copy on write.
-			 * We check fs.object == fs.first_object so
-			 * as to ensure the legacy COW mechanism is
-			 * used when the page in question is part of
-			 * a shadow object.  Otherwise, vm_page_cowfault()
-			 * removes the page from the backing object, 
-			 * which is not what we want.
-			 */
-			vm_page_lock_queues();
-			if ((fs.m->cow) && 
-			    (fault_type & VM_PROT_WRITE) &&
-			    (fs.object == fs.first_object)) {
-				vm_page_cowfault(fs.m);
-				vm_page_unlock_queues();
-				unlock_and_deallocate(&fs);
-				goto RetryFault;
-			}
-
 			/*
 			 * Wait/Retry if the page is busy.  We have to do this
 			 * if the page is busy via either VPO_BUSY or 
@@ -366,7 +347,6 @@ RetryFault:;
 			 * to pmap it.
 			 */
 			if ((fs.m->oflags & VPO_BUSY) || fs.m->busy) {
-				vm_page_unlock_queues();
 				VM_OBJECT_UNLOCK(fs.object);
 				if (fs.object != fs.first_object) {
 					VM_OBJECT_LOCK(fs.first_object);
@@ -398,6 +378,7 @@ RetryFault:;
 				vm_object_deallocate(fs.first_object);
 				goto RetryFault;
 			}
+			vm_page_lock_queues();
 			vm_pageq_remove(fs.m);
 			vm_page_unlock_queues();
 

Modified: user/alc/zerocopy/sys/vm/vm_page.c
==============================================================================
--- user/alc/zerocopy/sys/vm/vm_page.c	Sun Jan 25 23:08:47 2009	(r187700)
+++ user/alc/zerocopy/sys/vm/vm_page.c	Mon Jan 26 00:52:09 2009	(r187701)
@@ -2033,98 +2033,6 @@ vm_page_test_dirty(vm_page_t m)
 	}
 }
 
-int so_zerocp_fullpage = 0;
-
-/*
- *	Replace the given page with a copy.  The copied page assumes
- *	the portion of the given page's "wire_count" that is not the
- *	responsibility of this copy-on-write mechanism.
- *
- *	The object containing the given page must have a non-zero
- *	paging-in-progress count and be locked.
- */
-void
-vm_page_cowfault(vm_page_t m)
-{
-	vm_page_t mnew;
-	vm_object_t object;
-	vm_pindex_t pindex;
-
-	object = m->object;
-	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
-	KASSERT(object->paging_in_progress != 0,
-	    ("vm_page_cowfault: object %p's paging-in-progress count is zero.",
-	    object)); 
-	pindex = m->pindex;
-
- retry_alloc:
-	pmap_remove_all(m);
-	vm_page_remove(m);
-	mnew = vm_page_alloc(object, pindex, VM_ALLOC_NORMAL | VM_ALLOC_NOBUSY);
-	if (mnew == NULL) {
-		vm_page_insert(m, object, pindex);
-		vm_page_unlock_queues();
-		VM_OBJECT_UNLOCK(object);
-		VM_WAIT;
-		VM_OBJECT_LOCK(object);
-		if (m == vm_page_lookup(object, pindex)) {
-			vm_page_lock_queues();
-			goto retry_alloc;
-		} else {
-			/*
-			 * Page disappeared during the wait.
-			 */
-			vm_page_lock_queues();
-			return;
-		}
-	}
-
-	if (m->cow == 0) {
-		/* 
-		 * check to see if we raced with an xmit complete when 
-		 * waiting to allocate a page.  If so, put things back 
-		 * the way they were 
-		 */
-		vm_page_free(mnew);
-		vm_page_insert(m, object, pindex);
-	} else { /* clear COW & copy page */
-		if (!so_zerocp_fullpage)
-			pmap_copy_page(m, mnew);
-		mnew->valid = VM_PAGE_BITS_ALL;
-		vm_page_dirty(mnew);
-		mnew->wire_count = m->wire_count - m->cow;
-		m->wire_count = m->cow;
-	}
-}
-
-void 
-vm_page_cowclear(vm_page_t m)
-{
-
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
-	if (m->cow) {
-		m->cow--;
-		/* 
-		 * let vm_fault add back write permission  lazily
-		 */
-	} 
-	/*
-	 *  sf_buf_free() will free the page, so we needn't do it here
-	 */ 
-}
-
-int
-vm_page_cowsetup(vm_page_t m)
-{
-
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
-	if (m->cow == USHRT_MAX - 1)
-		return (EBUSY);
-	m->cow++;
-	pmap_remove_write(m);
-	return (0);
-}
-
 #include "opt_ddb.h"
 #ifdef DDB
 #include <sys/kernel.h>

Modified: user/alc/zerocopy/sys/vm/vm_page.h
==============================================================================
--- user/alc/zerocopy/sys/vm/vm_page.h	Sun Jan 25 23:08:47 2009	(r187700)
+++ user/alc/zerocopy/sys/vm/vm_page.h	Mon Jan 26 00:52:09 2009	(r187701)
@@ -115,7 +115,6 @@ struct vm_page {
 	u_short	flags;			/* see below */
 	uint8_t	order;			/* index of the buddy queue */
 	uint8_t pool;
-	u_short cow;			/* page cow mapping count */
 	u_int wire_count;		/* wired down maps refs (P) */
 	short hold_count;		/* page hold count */
 	u_short oflags;			/* page flags (O) */
@@ -335,9 +334,6 @@ int vm_page_bits (int, int);
 void vm_page_zero_invalid(vm_page_t m, boolean_t setvalid);
 void vm_page_free_toq(vm_page_t m);
 void vm_page_zero_idle_wakeup(void);
-void vm_page_cowfault (vm_page_t);
-int vm_page_cowsetup(vm_page_t);
-void vm_page_cowclear (vm_page_t);
 
 /*
  *	vm_page_sleep_if_busy:


More information about the svn-src-user mailing list