diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2010-05-13 20:26:16 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2010-05-13 20:26:16 +0000 |
| commit | 1f93868d76bb8084bba7e49761d3f8f3f10145d1 (patch) | |
| tree | 5f57a391bdaa1b82853430ec88f3e945c8f2d9d2 | |
| parent | ef7b0ac47b0990b42a5576e5eb5249ca0b4fe658 (diff) | |
Notes
| -rw-r--r-- | sys/vm/swap_pager.c | 6 | ||||
| -rw-r--r-- | sys/vm/vm_object.c | 15 |
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), |
