summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_fault.c
diff options
context:
space:
mode:
authorjeff <jeff@FreeBSD.org>2005-05-03 11:11:26 +0000
committerjeff <jeff@FreeBSD.org>2005-05-03 11:11:26 +0000
commitd62d255d2ea2767f48fe126356b4d374c9fe5c9f (patch)
treee7c405360a92533611914356fd2cfc62c504f4e1 /sys/vm/vm_fault.c
parent2b167167e26f6c1a9f95c7656d37b3c0465913e7 (diff)
downloadFreeBSD-src-d62d255d2ea2767f48fe126356b4d374c9fe5c9f.zip
FreeBSD-src-d62d255d2ea2767f48fe126356b4d374c9fe5c9f.tar.gz
- Add a new object flag "OBJ_NEEDSGIANT". We set this flag if the
underlying vnode requires Giant. - In vm_fault only acquire Giant if the underlying object has NEEDSGIANT set. - In vm_object_shadow inherit the NEEDSGIANT flag from the backing object.
Diffstat (limited to 'sys/vm/vm_fault.c')
-rw-r--r--sys/vm/vm_fault.c13
1 files changed, 9 insertions, 4 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c
index 2fc6a0e..0ef7212 100644
--- a/sys/vm/vm_fault.c
+++ b/sys/vm/vm_fault.c
@@ -290,14 +290,17 @@ RetryFault:;
*
* XXX vnode_pager_lock() can block without releasing the map lock.
*/
- if (!fs.map->system_map)
+ if (fs.first_object->flags & OBJ_NEEDGIANT)
mtx_lock(&Giant);
VM_OBJECT_LOCK(fs.first_object);
vm_object_reference_locked(fs.first_object);
fs.vp = vnode_pager_lock(fs.first_object);
KASSERT(fs.vp == NULL || !fs.map->system_map,
("vm_fault: vnode-backed object mapped by system map"));
- if (debug_mpsafevm && !fs.map->system_map)
+ KASSERT((fs.first_object->flags & OBJ_NEEDGIANT) == 0 ||
+ !fs.map->system_map,
+ ("vm_fault: Object requiring giant mapped by system map"));
+ if (fs.first_object->flags & OBJ_NEEDGIANT && debug_mpsafevm)
mtx_unlock(&Giant);
vm_object_pip_add(fs.first_object, 1);
@@ -378,10 +381,12 @@ RetryFault:;
}
unlock_map(&fs);
if (fs.vp != NULL) {
- mtx_lock(&Giant);
+ int vfslck;
+
+ vfslck = VFS_LOCK_GIANT(fs.vp->v_mount);
vput(fs.vp);
- mtx_unlock(&Giant);
fs.vp = NULL;
+ VFS_UNLOCK_GIANT(vfslck);
}
VM_OBJECT_LOCK(fs.object);
if (fs.m == vm_page_lookup(fs.object,
OpenPOWER on IntegriCloud