mirror of
https://github.com/freebsd/freebsd-src
synced 2024-10-15 12:54:27 +00:00
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:
parent
eb6000e2f3
commit
9b98b79683
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=134496
|
@ -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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue