summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2010-05-13 20:26:16 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2010-05-13 20:26:16 +0000
commit1f93868d76bb8084bba7e49761d3f8f3f10145d1 (patch)
tree5f57a391bdaa1b82853430ec88f3e945c8f2d9d2
parentef7b0ac47b0990b42a5576e5eb5249ca0b4fe658 (diff)
Notes
-rw-r--r--sys/vm/swap_pager.c6
-rw-r--r--sys/vm/vm_object.c15
2 files changed, 10 insertions, 11 deletions
diff --git a/sys/vm/swap_pager.c b/sys/vm/swap_pager.c
index 1725df73d999..a804466c0088 100644
--- a/sys/vm/swap_pager.c
+++ b/sys/vm/swap_pager.c
@@ -1105,8 +1105,7 @@ swap_pager_getpages(vm_object_t object, vm_page_t *m, int count, int reqpage)
* happen. Note that blk, iblk & jblk can be SWAPBLK_NONE, but the
* loops are set up such that the case(s) are handled implicitly.
*
- * The swp_*() calls must be made at splvm(). vm_page_free() does
- * not need to be, but it will go a little faster if it is.
+ * The swp_*() calls must be made with the object locked.
*/
blk = swp_pager_meta_ctl(mreq->object, mreq->pindex, 0);
@@ -1216,9 +1215,6 @@ swap_pager_getpages(vm_object_t object, vm_page_t *m, int count, int reqpage)
VM_OBJECT_LOCK(object);
while ((mreq->oflags & VPO_SWAPINPROG) != 0) {
mreq->oflags |= VPO_WANTED;
- vm_page_lock_queues();
- vm_page_flag_set(mreq, PG_REFERENCED);
- vm_page_unlock_queues();
PCPU_INC(cnt.v_intrans);
if (msleep(mreq, VM_OBJECT_MTX(object), PSWP, "swread", hz*20)) {
printf(
diff --git a/sys/vm/vm_object.c b/sys/vm/vm_object.c
index 399cb10a1f91..7e4dbc853507 100644
--- a/sys/vm/vm_object.c
+++ b/sys/vm/vm_object.c
@@ -1205,12 +1205,19 @@ shadowlookup:
goto unlock_tobject;
}
if ((m->oflags & VPO_BUSY) || m->busy) {
- vm_page_flag_set(m, PG_REFERENCED);
+ if (advise == MADV_WILLNEED)
+ /*
+ * Reference the page before unlocking and
+ * sleeping so that the page daemon is less
+ * likely to reclaim it.
+ */
+ vm_page_flag_set(m, PG_REFERENCED);
vm_page_unlock_queues();
if (object != tobject)
VM_OBJECT_UNLOCK(object);
m->oflags |= VPO_WANTED;
- msleep(m, VM_OBJECT_MTX(tobject), PDROP | PVM, "madvpo", 0);
+ msleep(m, VM_OBJECT_MTX(tobject), PDROP | PVM, "madvpo",
+ 0);
VM_OBJECT_LOCK(object);
goto relookup;
}
@@ -1415,7 +1422,6 @@ retry:
* not be changed by this operation.
*/
if ((m->oflags & VPO_BUSY) || m->busy) {
- vm_page_flag_set(m, PG_REFERENCED);
vm_page_unlock_queues();
VM_OBJECT_UNLOCK(new_object);
m->oflags |= VPO_WANTED;
@@ -1553,9 +1559,6 @@ vm_object_backing_scan(vm_object_t object, int op)
}
} else if (op & OBSC_COLLAPSE_WAIT) {
if ((p->oflags & VPO_BUSY) || p->busy) {
- vm_page_lock_queues();
- vm_page_flag_set(p, PG_REFERENCED);
- vm_page_unlock_queues();
VM_OBJECT_UNLOCK(object);
p->oflags |= VPO_WANTED;
msleep(p, VM_OBJECT_MTX(backing_object),