diff options
author | kib <kib@FreeBSD.org> | 2010-05-20 08:51:01 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2010-05-20 08:51:01 +0000 |
commit | 598e4abcd1e7291691a6906cb11637667cef2c42 (patch) | |
tree | 08496ef41d0a9d2a07b970032716da083322353b /sys/vm/vm_fault.c | |
parent | 8acfbaefd7580ec675a702acfdf1f8f7edd6fd57 (diff) | |
download | FreeBSD-src-598e4abcd1e7291691a6906cb11637667cef2c42.zip FreeBSD-src-598e4abcd1e7291691a6906cb11637667cef2c42.tar.gz |
When waiting for the busy page, do not unlock the object unless unlock
cannot be avoided.
Reviewed by: alc
MFC after: 1 week
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r-- | sys/vm/vm_fault.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index c1132cb..f0a2095 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -340,9 +340,13 @@ RetryFault:; vm_page_flag_set(fs.m, PG_REFERENCED); vm_page_unlock_queues(); vm_page_unlock(fs.m); - 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(fs.first_m); vm_page_free(fs.first_m); vm_page_unlock(fs.first_m); @@ -351,7 +355,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, |