aboutsummaryrefslogtreecommitdiff
path: root/sys/vm/vm_page.c
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2010-05-06 16:39:43 +0000
committerAlan Cox <alc@FreeBSD.org>2010-05-06 16:39:43 +0000
commit7024db1d405527d9e5c78f5b075521e189bf04df (patch)
treedfc0fa6f0a9194a6c782ff3251e16f9d16a9aade /sys/vm/vm_page.c
parentb277fb56f9452b620776541c9a45bd6db2d3a7c8 (diff)
downloadsrc-7024db1d405527d9e5c78f5b075521e189bf04df.tar.gz
src-7024db1d405527d9e5c78f5b075521e189bf04df.zip
Push down the page queues lock inside of vm_page_free_toq() and
pmap_page_is_mapped() in preparation for removing page queues locking around calls to vm_page_free(). Setting aside the assertion that calls pmap_page_is_mapped(), vm_page_free_toq() now acquires and holds the page queues lock just long enough to actually add or remove the page from the paging queues. Update vm_page_unhold() to reflect the above change.
Notes
Notes: svn path=/head/; revision=207702
Diffstat (limited to 'sys/vm/vm_page.c')
-rw-r--r--sys/vm/vm_page.c23
1 files changed, 13 insertions, 10 deletions
diff --git a/sys/vm/vm_page.c b/sys/vm/vm_page.c
index cc34c1b857e5..9cbd2efa2585 100644
--- a/sys/vm/vm_page.c
+++ b/sys/vm/vm_page.c
@@ -563,11 +563,8 @@ vm_page_unhold(vm_page_t mem)
vm_page_lock_assert(mem, MA_OWNED);
--mem->hold_count;
KASSERT(mem->hold_count >= 0, ("vm_page_unhold: hold count < 0!!!"));
- if (mem->hold_count == 0 && VM_PAGE_INQUEUE2(mem, PQ_HOLD)) {
- vm_page_lock_queues();
+ if (mem->hold_count == 0 && VM_PAGE_INQUEUE2(mem, PQ_HOLD))
vm_page_free_toq(mem);
- vm_page_unlock_queues();
- }
}
/*
@@ -1448,10 +1445,11 @@ void
vm_page_free_toq(vm_page_t m)
{
- if (VM_PAGE_GETQUEUE(m) != PQ_NONE)
- mtx_assert(&vm_page_queue_mtx, MA_OWNED);
- KASSERT(!pmap_page_is_mapped(m),
- ("vm_page_free_toq: freeing mapped page %p", m));
+ if ((m->flags & PG_UNMANAGED) == 0) {
+ vm_page_lock_assert(m, MA_OWNED);
+ KASSERT(!pmap_page_is_mapped(m),
+ ("vm_page_free_toq: freeing mapped page %p", m));
+ }
PCPU_INC(cnt.v_tfree);
if (m->busy || VM_PAGE_IS_FREE(m)) {
@@ -1471,7 +1469,11 @@ vm_page_free_toq(vm_page_t m)
* callback routine until after we've put the page on the
* appropriate free queue.
*/
- vm_pageq_remove(m);
+ if (VM_PAGE_GETQUEUE(m) != PQ_NONE) {
+ vm_page_lock_queues();
+ vm_pageq_remove(m);
+ vm_page_unlock_queues();
+ }
vm_page_remove(m);
/*
@@ -1493,9 +1495,10 @@ vm_page_free_toq(vm_page_t m)
panic("vm_page_free: freeing wired page");
}
if (m->hold_count != 0) {
- vm_page_lock_assert(m, MA_OWNED);
m->flags &= ~PG_ZERO;
+ vm_page_lock_queues();
vm_page_enqueue(PQ_HOLD, m);
+ vm_page_unlock_queues();
} else {
/*
* Restore the default memory attribute to the page.