diff options
author | Alan Cox <alc@FreeBSD.org> | 2010-05-06 16:39:43 +0000 |
---|---|---|
committer | Alan Cox <alc@FreeBSD.org> | 2010-05-06 16:39:43 +0000 |
commit | 7024db1d405527d9e5c78f5b075521e189bf04df (patch) | |
tree | dfc0fa6f0a9194a6c782ff3251e16f9d16a9aade /sys/vm/vm_page.c | |
parent | b277fb56f9452b620776541c9a45bd6db2d3a7c8 (diff) | |
download | src-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.c | 23 |
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. |