diff options
author | alc <alc@FreeBSD.org> | 2004-12-15 19:55:05 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2004-12-15 19:55:05 +0000 |
commit | ede2fb9751ccd8ce53c764a80e9c92cf19817e80 (patch) | |
tree | 04c4387210403e2f15960fa9ce72542103f52ac1 /sys/powerpc/aim | |
parent | b9999a1836b74c6d5710f20cd8f2e3e6e51ef007 (diff) | |
download | FreeBSD-src-ede2fb9751ccd8ce53c764a80e9c92cf19817e80.zip FreeBSD-src-ede2fb9751ccd8ce53c764a80e9c92cf19817e80.tar.gz |
In the common case, pmap_enter_quick() completes without sleeping.
In such cases, the busying of the page and the unlocking of the
containing object by vm_map_pmap_enter() and vm_fault_prefault() is
unnecessary overhead. To eliminate this overhead, this change
modifies pmap_enter_quick() so that it expects the object to be locked
on entry and it assumes the responsibility for busying the page and
unlocking the object if it must sleep. Note: alpha, amd64, i386 and
ia64 are the only implementations optimized by this change; arm,
powerpc, and sparc64 still conservatively busy the page and unlock the
object within every pmap_enter_quick() call.
Additionally, this change is the first case where we synchronize
access to the page's PG_BUSY flag and busy field using the containing
object's lock rather than the global page queues lock. (Modifications
to the page's PG_BUSY flag and busy field have asserted both locks for
several weeks, enabling an incremental transition.)
Diffstat (limited to 'sys/powerpc/aim')
-rw-r--r-- | sys/powerpc/aim/mmu_oea.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/sys/powerpc/aim/mmu_oea.c b/sys/powerpc/aim/mmu_oea.c index 5398d61..136e412 100644 --- a/sys/powerpc/aim/mmu_oea.c +++ b/sys/powerpc/aim/mmu_oea.c @@ -1048,9 +1048,17 @@ vm_page_t pmap_enter_quick(pmap_t pm, vm_offset_t va, vm_page_t m, vm_page_t mpte) { + vm_page_lock_queues(); + vm_page_busy(m); + vm_page_unlock_queues(); + VM_OBJECT_UNLOCK(m->object); mtx_lock(&Giant); pmap_enter(pm, va, m, VM_PROT_READ | VM_PROT_EXECUTE, FALSE); mtx_unlock(&Giant); + VM_OBJECT_LOCK(m->object); + vm_page_lock_queues(); + vm_page_wakeup(m); + vm_page_unlock_queues(); return (NULL); } |