mirror of
https://github.com/opnsense/src.git
synced 2026-05-28 04:12:45 -04:00
- 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.
This commit is contained in:
parent
1bf9ee92ff
commit
761dbeb66f
1 changed files with 10 additions and 19 deletions
|
|
@ -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.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Reference in a new issue