From 761dbeb66fb4bcbdf2fb4b4357d152310d6c53c1 Mon Sep 17 00:00:00 2001 From: Jeff Roberson Date: Tue, 15 Mar 2005 14:14:09 +0000 Subject: [PATCH] - In vm_page_insert() hold the backing vnode when the first page is inserted. - In vm_page_remove() drop the backing vnode when the last page is removed. - Don't check the vnode to see if it must be reclaimed on every call to vm_page_free_toq() as we only check it now when it is actually required. This saves us two lock operations per call. Sponsored by: Isilon Systems, Inc. --- sys/vm/vm_page.c | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c index d9a84673c3a..2e3211fce69 100644 --- a/sys/vm/vm_page.c +++ b/sys/vm/vm_page.c @@ -575,6 +575,11 @@ vm_page_insert(vm_page_t m, vm_object_t object, vm_pindex_t pindex) * show that the object has one more resident page. */ object->resident_page_count++; + /* + * Hold the vnode until the last page is released. + */ + if (object->resident_page_count == 1 && object->type == OBJT_VNODE) + vhold((struct vnode *)object->handle); /* * Since we are inserting a new and possibly dirty page, @@ -630,6 +635,11 @@ vm_page_remove(vm_page_t m) */ object->resident_page_count--; object->generation++; + /* + * The vnode may now be recycled. + */ + if (object->resident_page_count == 0 && object->type == OBJT_VNODE) + vdrop((struct vnode *)object->handle); m->object = NULL; } @@ -995,7 +1005,6 @@ void vm_page_free_toq(vm_page_t m) { struct vpgqueues *pq; - vm_object_t object = m->object; mtx_assert(&vm_page_queue_mtx, MA_OWNED); cnt.v_tfree++; @@ -1039,24 +1048,6 @@ vm_page_free_toq(vm_page_t m) panic("vm_page_free: freeing wired page"); } - /* - * If we've exhausted the object's resident pages we want to free - * it up. - */ - if (object && - (object->type == OBJT_VNODE) && - ((object->flags & OBJ_DEAD) == 0) - ) { - struct vnode *vp = (struct vnode *)object->handle; - - if (vp) { - VI_LOCK(vp); - if (VSHOULDFREE(vp)) - vfree(vp); - VI_UNLOCK(vp); - } - } - /* * Clear the UNMANAGED flag when freeing an unmanaged page. */