diff options
author | alc <alc@FreeBSD.org> | 2004-08-29 20:14:10 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2004-08-29 20:14:10 +0000 |
commit | 0dc141e15d469a4e1d98ae569c93ec19776cf780 (patch) | |
tree | 9eb9ed9c5e0d50d4b8f5a60e5907741e904a3c93 /sys/vm | |
parent | 24bab9daefa9d7a81dc39692a8f59807d9a8bf67 (diff) | |
download | FreeBSD-src-0dc141e15d469a4e1d98ae569c93ec19776cf780.zip FreeBSD-src-0dc141e15d469a4e1d98ae569c93ec19776cf780.tar.gz |
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.
Diffstat (limited to 'sys/vm')
-rw-r--r-- | sys/vm/vm_object.c | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c index 8ed952e..e697790 100644 --- a/sys/vm/vm_object.c +++ b/sys/vm/vm_object.c @@ -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 @@ shadowlookup: 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 @@ shadowlookup: 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 @@ shadowlookup: 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); } /* |