diff options
author | alc <alc@FreeBSD.org> | 2004-08-21 19:20:21 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2004-08-21 19:20:21 +0000 |
commit | bdaf27d7e6b238b81fb5ccdbfd6632eac40c4750 (patch) | |
tree | 3457a956972395da03a7a13951b167b89ec640af | |
parent | d421a19d6e45fca61d9d2eb22b91ad19b52e2d39 (diff) | |
download | FreeBSD-src-bdaf27d7e6b238b81fb5ccdbfd6632eac40c4750.zip FreeBSD-src-bdaf27d7e6b238b81fb5ccdbfd6632eac40c4750.tar.gz |
Further reduce the use of Giant by vm_fault(): Giant is held only when
manipulating a vnode, e.g., calling vput(). This reduces contention for
Giant during many copy-on-write faults, resulting in some additional
speedup on SMPs.
Note: debug_mpsafevm must be enabled for this optimization to take effect.
-rw-r--r-- | sys/vm/vm_fault.c | 7 |
1 files changed, 3 insertions, 4 deletions
diff --git a/sys/vm/vm_fault.c b/sys/vm/vm_fault.c index 1fa921d..1f6fd0b 100644 --- a/sys/vm/vm_fault.c +++ b/sys/vm/vm_fault.c @@ -167,9 +167,9 @@ _unlock_things(struct faultstate *fs, int dealloc) } unlock_map(fs); if (fs->vp != NULL) { + mtx_lock(&Giant); vput(fs->vp); - if (debug_mpsafevm) - mtx_unlock(&Giant); + mtx_unlock(&Giant); fs->vp = NULL; } if (dealloc) @@ -295,8 +295,7 @@ RetryFault:; VM_OBJECT_LOCK(fs.first_object); vm_object_reference_locked(fs.first_object); fs.vp = vnode_pager_lock(fs.first_object); - if (fs.vp == NULL && debug_mpsafevm) - mtx_unlock(&Giant); + mtx_unlock(&Giant); vm_object_pip_add(fs.first_object, 1); fs.lookup_still_valid = TRUE; |