Author: alc
Date: Sun May 2 20:46:17 2010
New Revision: 207540
URL: http://svn.freebsd.org/changeset/base/207540
Log:
Defer the acquisition of the page and page queues locks in
vm_pageout_object_deactivate_pages().
Modified:
head/sys/vm/vm_pageout.c
Modified: head/sys/vm/vm_pageout.c
==============================================================================
--- head/sys/vm/vm_pageout.c Sun May 2 20:24:25 2010 (r207539)
+++ head/sys/vm/vm_pageout.c Sun May 2 20:46:17 2010 (r207540)
@@ -540,6 +540,7 @@ vm_pageout_object_deactivate_pages(pmap,
for (object = first_object;; object = backing_object) {
if (pmap_resident_count(pmap) <= desired)
goto unlock_return;
+ VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
if (object->type == OBJT_PHYS || object->paging_in_progress)
goto unlock_return;
@@ -551,19 +552,18 @@ vm_pageout_object_deactivate_pages(pmap,
*/
p = TAILQ_FIRST(&object->memq);
while (p != NULL) {
- vm_page_lock(p);
- vm_page_lock_queues();
- if (pmap_resident_count(pmap) <= desired) {
- vm_page_unlock_queues();
- vm_page_unlock(p);
+ if (pmap_resident_count(pmap) <= desired)
goto unlock_return;
- }
next = TAILQ_NEXT(p, listq);
+ if ((p->oflags & VPO_BUSY) != 0 || p->busy != 0) {
+ p = next;
+ continue;
+ }
+ vm_page_lock(p);
+ vm_page_lock_queues();
cnt.v_pdpages++;
if (p->wire_count != 0 ||
p->hold_count != 0 ||
- p->busy != 0 ||
- (p->oflags & VPO_BUSY) ||
!pmap_page_exists_quick(pmap, p)) {
vm_page_unlock_queues();
vm_page_unlock(p);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"