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