Move the acquisition and release of the lock on the object at the head of

the shadow chain outside of the loop in vm_object_madvise(), reducing the
number of times that this lock is acquired and released.
This commit is contained in:
Alan Cox 2004-08-29 20:14:10 +00:00
parent eb6000e2f3
commit 9b98b79683
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=134496

View file

@ -1064,6 +1064,7 @@ vm_object_madvise(vm_object_t object, vm_pindex_t pindex, int count, int advise)
if (object == NULL)
return;
VM_OBJECT_LOCK(object);
end = pindex + count;
/*
* Locate and adjust resident pages
@ -1072,7 +1073,6 @@ vm_object_madvise(vm_object_t object, vm_pindex_t pindex, int count, int advise)
relookup:
tobject = object;
tpindex = pindex;
VM_OBJECT_LOCK(tobject);
shadowlookup:
/*
* MADV_FREE only operates on OBJT_DEFAULT or OBJT_SWAP pages
@ -1100,7 +1100,8 @@ vm_object_madvise(vm_object_t object, vm_pindex_t pindex, int count, int advise)
goto unlock_tobject;
VM_OBJECT_LOCK(backing_object);
tpindex += OFF_TO_IDX(tobject->backing_object_offset);
VM_OBJECT_UNLOCK(tobject);
if (tobject != object)
VM_OBJECT_UNLOCK(tobject);
tobject = backing_object;
goto shadowlookup;
}
@ -1118,8 +1119,13 @@ vm_object_madvise(vm_object_t object, vm_pindex_t pindex, int count, int advise)
vm_page_unlock_queues();
goto unlock_tobject;
}
if (vm_page_sleep_if_busy(m, TRUE, "madvpo")) {
if ((m->flags & PG_BUSY) || m->busy) {
vm_page_flag_set(m, PG_WANTED | PG_REFERENCED);
if (object != tobject)
VM_OBJECT_UNLOCK(object);
VM_OBJECT_UNLOCK(tobject);
msleep(m, &vm_page_queue_mtx, PDROP | PVM, "madvpo", 0);
VM_OBJECT_LOCK(object);
goto relookup;
}
if (advise == MADV_WILLNEED) {
@ -1151,8 +1157,10 @@ vm_object_madvise(vm_object_t object, vm_pindex_t pindex, int count, int advise)
if (advise == MADV_FREE && tobject->type == OBJT_SWAP)
swap_pager_freespace(tobject, tpindex, 1);
unlock_tobject:
VM_OBJECT_UNLOCK(tobject);
if (tobject != object)
VM_OBJECT_UNLOCK(tobject);
}
VM_OBJECT_UNLOCK(object);
}
/*