diff options
author | jeff <jeff@FreeBSD.org> | 2005-05-03 11:11:26 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2005-05-03 11:11:26 +0000 |
commit | d62d255d2ea2767f48fe126356b4d374c9fe5c9f (patch) | |
tree | e7c405360a92533611914356fd2cfc62c504f4e1 /sys/vm/vm_fault.c | |
parent | 2b167167e26f6c1a9f95c7656d37b3c0465913e7 (diff) | |
download | FreeBSD-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.c | 13 |
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, |