Date: Tue, 5 Feb 2013 00:09:33 +0000 (UTC) From: Attilio Rao <attilio@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r246338 - user/attilio/vmc-playground/sys/vm Message-ID: <201302050009.r1509Xf4044090@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
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);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201302050009.r1509Xf4044090>