From 3bafcccc692967583513acfa653785ea48547885 Mon Sep 17 00:00:00 2001 From: kib Date: Fri, 18 Jun 2010 09:25:00 +0000 Subject: [PATCH] MFC r208340: When waiting for the busy page, do not unlock the object unless unlock cannot be avoided. git-svn-id: svn://svn.freebsd.org/base/stable/8@209290 ccf9f872-aa2e-dd11-9fc8-001c23d0bc1f --- sys/vm/vm_fault.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index a8ff435f4..a05b48b88 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -361,9 +361,13 @@ RetryFault:; */ if ((fs.m->oflags & VPO_BUSY) || fs.m->busy) { vm_page_unlock_queues(); - VM_OBJECT_UNLOCK(fs.object); if (fs.object != fs.first_object) { - VM_OBJECT_LOCK(fs.first_object); + if (!VM_OBJECT_TRYLOCK( + fs.first_object)) { + VM_OBJECT_UNLOCK(fs.object); + VM_OBJECT_LOCK(fs.first_object); + VM_OBJECT_LOCK(fs.object); + } vm_page_lock_queues(); vm_page_free(fs.first_m); vm_page_unlock_queues(); @@ -372,7 +376,6 @@ RetryFault:; fs.first_m = NULL; } unlock_map(&fs); - VM_OBJECT_LOCK(fs.object); if (fs.m == vm_page_lookup(fs.object, fs.pindex)) { vm_page_sleep_if_busy(fs.m, TRUE, -- 2.45.0