summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_fault.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2004-12-15 19:55:05 +0000
committeralc <alc@FreeBSD.org>2004-12-15 19:55:05 +0000
commitede2fb9751ccd8ce53c764a80e9c92cf19817e80 (patch)
tree04c4387210403e2f15960fa9ce72542103f52ac1 /sys/vm/vm_fault.c
parentb9999a1836b74c6d5710f20cd8f2e3e6e51ef007 (diff)
downloadFreeBSD-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/vm/vm_fault.c')
-rw-r--r--sys/vm/vm_fault.c10
1 files changed, 2 insertions, 8 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 4bd82f4..6fac17c 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -973,23 +973,17 @@ vm_fault_prefault(pmap_t pmap, vm_offset_t addra, vm_map_entry_t entry)
VM_OBJECT_UNLOCK(lobject);
break;
}
- vm_page_lock_queues();
if (((m->valid & VM_PAGE_BITS_ALL) == VM_PAGE_BITS_ALL) &&
(m->busy == 0) &&
(m->flags & (PG_BUSY | PG_FICTITIOUS)) == 0) {
if ((m->queue - m->pc) == PQ_CACHE) {
+ vm_page_lock_queues();
vm_page_deactivate(m);
+ vm_page_unlock_queues();
}
- vm_page_busy(m);
- vm_page_unlock_queues();
- VM_OBJECT_UNLOCK(lobject);
mpte = pmap_enter_quick(pmap, addr, m, mpte);
- VM_OBJECT_LOCK(lobject);
- vm_page_lock_queues();
- vm_page_wakeup(m);
}
- vm_page_unlock_queues();
VM_OBJECT_UNLOCK(lobject);
}
}
OpenPOWER on IntegriCloud