System maps are prohibited from mapping vnode-backed objects. Take
advantage of this restriction to avoid acquiring and releasing Giant when wiring pages within a system map. In collaboration with: tegge@
This commit is contained in:
parent
cf7b3b6562
commit
5e4bdb57cb
@ -172,7 +172,7 @@ _unlock_things(struct faultstate *fs, int dealloc)
|
|||||||
mtx_unlock(&Giant);
|
mtx_unlock(&Giant);
|
||||||
fs->vp = NULL;
|
fs->vp = NULL;
|
||||||
}
|
}
|
||||||
if (dealloc)
|
if (dealloc && !fs->map->system_map)
|
||||||
VM_UNLOCK_GIANT();
|
VM_UNLOCK_GIANT();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -291,11 +291,14 @@ RetryFault:;
|
|||||||
*
|
*
|
||||||
* XXX vnode_pager_lock() can block without releasing the map lock.
|
* XXX vnode_pager_lock() can block without releasing the map lock.
|
||||||
*/
|
*/
|
||||||
mtx_lock(&Giant);
|
if (!fs.map->system_map)
|
||||||
|
mtx_lock(&Giant);
|
||||||
VM_OBJECT_LOCK(fs.first_object);
|
VM_OBJECT_LOCK(fs.first_object);
|
||||||
vm_object_reference_locked(fs.first_object);
|
vm_object_reference_locked(fs.first_object);
|
||||||
fs.vp = vnode_pager_lock(fs.first_object);
|
fs.vp = vnode_pager_lock(fs.first_object);
|
||||||
if (debug_mpsafevm)
|
KASSERT(fs.vp == NULL || !fs.map->system_map,
|
||||||
|
("vm_fault: vnode-backed object mapped by system map"));
|
||||||
|
if (debug_mpsafevm && !fs.map->system_map)
|
||||||
mtx_unlock(&Giant);
|
mtx_unlock(&Giant);
|
||||||
vm_object_pip_add(fs.first_object, 1);
|
vm_object_pip_add(fs.first_object, 1);
|
||||||
|
|
||||||
@ -369,7 +372,8 @@ RetryFault:;
|
|||||||
if (!vm_page_sleep_if_busy(fs.m, TRUE, "vmpfw"))
|
if (!vm_page_sleep_if_busy(fs.m, TRUE, "vmpfw"))
|
||||||
vm_page_unlock_queues();
|
vm_page_unlock_queues();
|
||||||
atomic_add_int(&cnt.v_intrans, 1);
|
atomic_add_int(&cnt.v_intrans, 1);
|
||||||
VM_UNLOCK_GIANT();
|
if (!fs.map->system_map)
|
||||||
|
VM_UNLOCK_GIANT();
|
||||||
vm_object_deallocate(fs.first_object);
|
vm_object_deallocate(fs.first_object);
|
||||||
goto RetryFault;
|
goto RetryFault;
|
||||||
}
|
}
|
||||||
@ -1026,13 +1030,9 @@ vm_fault_wire(vm_map_t map, vm_offset_t start, vm_offset_t end,
|
|||||||
* read-only sections.
|
* read-only sections.
|
||||||
*/
|
*/
|
||||||
for (va = start; va < end; va += PAGE_SIZE) {
|
for (va = start; va < end; va += PAGE_SIZE) {
|
||||||
if (map->system_map)
|
|
||||||
mtx_lock(&Giant);
|
|
||||||
rv = vm_fault(map, va,
|
rv = vm_fault(map, va,
|
||||||
user_wire ? VM_PROT_READ : VM_PROT_READ | VM_PROT_WRITE,
|
user_wire ? VM_PROT_READ : VM_PROT_READ | VM_PROT_WRITE,
|
||||||
user_wire ? VM_FAULT_USER_WIRE : VM_FAULT_CHANGE_WIRING);
|
user_wire ? VM_FAULT_USER_WIRE : VM_FAULT_CHANGE_WIRING);
|
||||||
if (map->system_map)
|
|
||||||
mtx_unlock(&Giant);
|
|
||||||
if (rv) {
|
if (rv) {
|
||||||
if (va != start)
|
if (va != start)
|
||||||
vm_fault_unwire(map, start, va, fictitious);
|
vm_fault_unwire(map, start, va, fictitious);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user