summaryrefslogtreecommitdiffstats
path: root/sys/vm
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2004-08-29 20:14:10 +0000
committeralc <alc@FreeBSD.org>2004-08-29 20:14:10 +0000
commit0dc141e15d469a4e1d98ae569c93ec19776cf780 (patch)
tree9eb9ed9c5e0d50d4b8f5a60e5907741e904a3c93 /sys/vm
parent24bab9daefa9d7a81dc39692a8f59807d9a8bf67 (diff)
downloadFreeBSD-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.c16
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);
}
/*
OpenPOWER on IntegriCloud