svn commit: r246338 - user/attilio/vmc-playground/sys/vm

Attilio Rao attilio at FreeBSD.org
Tue Feb 5 00:09:34 UTC 2013


Author: attilio
Date: Tue Feb  5 00:09:33 2013
New Revision: 246338
URL: http://svnweb.freebsd.org/changeset/base/246338

Log:
  Reduce diffs against HEAD:
  - Reimplement vm_page_cache_transfer() properly
  - Remove vm_page_cache_rename() as a subsequent change

Modified:
  user/attilio/vmc-playground/sys/vm/vm_object.c
  user/attilio/vmc-playground/sys/vm/vm_page.c
  user/attilio/vmc-playground/sys/vm/vm_page.h

Modified: user/attilio/vmc-playground/sys/vm/vm_object.c
==============================================================================
--- user/attilio/vmc-playground/sys/vm/vm_object.c	Mon Feb  4 23:24:04 2013	(r246337)
+++ user/attilio/vmc-playground/sys/vm/vm_object.c	Tue Feb  5 00:09:33 2013	(r246338)
@@ -1302,7 +1302,7 @@ vm_object_split(vm_map_entry_t entry)
 {
 	vm_page_t m, m_next;
 	vm_object_t orig_object, new_object, source;
-	vm_pindex_t idx, offidxstart, start;
+	vm_pindex_t idx, offidxstart;
 	vm_size_t size;
 
 	orig_object = entry->object.vm_object;
@@ -1413,18 +1413,9 @@ retry:
 		 * should still be OBJT_DEFAULT and orig_object should not
 		 * contain any cached pages within the specified range.
 		 */
-		if (!vm_object_cache_is_empty(orig_object)) {
-			start = offidxstart;
-			mtx_lock(&vm_page_queue_free_mtx);
-			while ((m = vm_radix_lookup_ge(&orig_object->cache,
-			    start)) != NULL) {
-				if (m->pindex >= (offidxstart + size))
-					break;
-				idx = m->pindex - offidxstart;
-				vm_page_cache_rename(m, new_object, idx);
-			}
-			mtx_unlock(&vm_page_queue_free_mtx);
-		}
+		if (!vm_object_cache_is_empty(orig_object))
+			vm_page_cache_transfer(orig_object, offidxstart,
+			    new_object);
 	}
 	VM_OBJECT_UNLOCK(orig_object);
 	TAILQ_FOREACH(m, &new_object->memq, listq)

Modified: user/attilio/vmc-playground/sys/vm/vm_page.c
==============================================================================
--- user/attilio/vmc-playground/sys/vm/vm_page.c	Mon Feb  4 23:24:04 2013	(r246337)
+++ user/attilio/vmc-playground/sys/vm/vm_page.c	Tue Feb  5 00:09:33 2013	(r246338)
@@ -1064,23 +1064,45 @@ vm_page_cache_free(vm_page_t m)
 }
 
 /*
- *	Attempt to rename a cached page from one object to another.  If
- *	it fails the cached page is freed.
+ *	Transfer all of the cached pages with offset greater than or
+ *	equal to 'offidxstart' from the original object's cache to the
+ *	new object's cache.  However, any cached pages with offset
+ *	greater than or equal to the new object's size are kept in the
+ *	original object.  Initially, the new object's cache must be
+ *	empty.  Offset 'offidxstart' in the original object must
+ *	correspond to offset zero in the new object.
+ *
+ *	The new object must be locked.
  */
 void
-vm_page_cache_rename(vm_page_t m, vm_object_t new_object, vm_pindex_t idx)
+vm_page_cache_transfer(vm_object_t orig_object, vm_pindex_t offidxstart,
+    vm_object_t new_object)
 {
-	vm_object_t orig_object;
+	vm_page_t m;
 
-	orig_object = m->object;
-	VM_OBJECT_LOCK_ASSERT(orig_object, MA_OWNED);
+	/*
+	 * Insertion into an object's collection of cached pages
+	 * requires the object to be locked.  In contrast, removal does
+	 * not.
+	 */
 	VM_OBJECT_LOCK_ASSERT(new_object, MA_OWNED);
-	mtx_assert(&vm_page_queue_free_mtx, MA_OWNED);
-	vm_radix_remove(&orig_object->cache, m->pindex);
-	if (vm_radix_insert(&new_object->cache, idx, m) != 0)
-		panic("vm_page_cache_rename: failed vm_radix_insert");
-	m->object = new_object;
-	m->pindex = idx;
+	VM_OBJECT_LOCK_ASSERT(orig_object, MA_OWNED);
+	KASSERT(vm_object_cache_is_empty(new_object),
+	    ("vm_page_cache_transfer: object %p has cached pages",
+	    new_object));
+	mtx_lock(&vm_page_queue_free_mtx);
+	while ((m = vm_radix_lookup_ge(&orig_object->cache,
+	    offidxstart)) != NULL) {
+		if ((m->pindex - offidxstart) >= new_object->size)
+			break;
+		vm_radix_remove(&orig_object->cache, m->pindex);
+		if (vm_radix_insert(&new_object->cache,
+		    m->pindex - offidxstart, m) != 0)
+			panic("vm_page_cache_transfer: failed vm_radix_insert");
+		m->object = new_object;
+		m->pindex -= offidxstart;
+	}
+	mtx_unlock(&vm_page_queue_free_mtx);
 }
 
 /*

Modified: user/attilio/vmc-playground/sys/vm/vm_page.h
==============================================================================
--- user/attilio/vmc-playground/sys/vm/vm_page.h	Mon Feb  4 23:24:04 2013	(r246337)
+++ user/attilio/vmc-playground/sys/vm/vm_page.h	Tue Feb  5 00:09:33 2013	(r246338)
@@ -376,8 +376,8 @@ vm_page_t vm_page_alloc_contig(vm_object
 vm_page_t vm_page_alloc_freelist(int, int);
 vm_page_t vm_page_grab (vm_object_t, vm_pindex_t, int);
 void vm_page_cache(vm_page_t);
+void vm_page_cache_transfer(vm_object_t, vm_pindex_t, vm_object_t);
 void vm_page_cache_free(vm_page_t);
-void vm_page_cache_rename(vm_page_t, vm_object_t, vm_pindex_t);
 int vm_page_try_to_cache (vm_page_t);
 int vm_page_try_to_free (vm_page_t);
 void vm_page_dontneed(vm_page_t);


More information about the svn-src-user mailing list