summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2013-06-05 17:00:10 +0000
committeralc <alc@FreeBSD.org>2013-06-05 17:00:10 +0000
commitb4fae704741d01b4c64b7b2668b5381c67811ccc (patch)
treef830c4874762a4e17862e90abf6836c133a47055
parent5d26938b1d35cf753994309c70a0ef31b8302288 (diff)
downloadFreeBSD-src-b4fae704741d01b4c64b7b2668b5381c67811ccc.zip
FreeBSD-src-b4fae704741d01b4c64b7b2668b5381c67811ccc.tar.gz
Relax the vm object locking. Use a read lock.
Sponsored by: EMC / Isilon Storage Division
-rw-r--r--sys/compat/linprocfs/linprocfs.c8
-rw-r--r--sys/dev/hwpmc/hwpmc_mod.c20
-rw-r--r--sys/fs/procfs/procfs_map.c10
3 files changed, 19 insertions, 19 deletions
diff --git a/sys/compat/linprocfs/linprocfs.c b/sys/compat/linprocfs/linprocfs.c
index a49a9bc..28b683a 100644
--- a/sys/compat/linprocfs/linprocfs.c
+++ b/sys/compat/linprocfs/linprocfs.c
@@ -1031,9 +1031,9 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
e_end = entry->end;
obj = entry->object.vm_object;
for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) {
- VM_OBJECT_WLOCK(tobj);
+ VM_OBJECT_RLOCK(tobj);
if (lobj != obj)
- VM_OBJECT_WUNLOCK(lobj);
+ VM_OBJECT_RUNLOCK(lobj);
lobj = tobj;
}
last_timestamp = map->timestamp;
@@ -1049,11 +1049,11 @@ linprocfs_doprocmaps(PFS_FILL_ARGS)
else
vp = NULL;
if (lobj != obj)
- VM_OBJECT_WUNLOCK(lobj);
+ VM_OBJECT_RUNLOCK(lobj);
flags = obj->flags;
ref_count = obj->ref_count;
shadow_count = obj->shadow_count;
- VM_OBJECT_WUNLOCK(obj);
+ VM_OBJECT_RUNLOCK(obj);
if (vp) {
vn_fullpath(td, vp, &name, &freename);
vn_lock(vp, LK_SHARED | LK_RETRY);
diff --git a/sys/dev/hwpmc/hwpmc_mod.c b/sys/dev/hwpmc/hwpmc_mod.c
index eec33a3..150c69a 100644
--- a/sys/dev/hwpmc/hwpmc_mod.c
+++ b/sys/dev/hwpmc/hwpmc_mod.c
@@ -1672,7 +1672,7 @@ pmc_log_process_mappings(struct pmc_owner *po, struct proc *p)
}
obj = entry->object.vm_object;
- VM_OBJECT_WLOCK(obj);
+ VM_OBJECT_RLOCK(obj);
/*
* Walk the backing_object list to find the base
@@ -1680,9 +1680,9 @@ pmc_log_process_mappings(struct pmc_owner *po, struct proc *p)
*/
for (lobj = tobj = obj; tobj != NULL; tobj = tobj->backing_object) {
if (tobj != obj)
- VM_OBJECT_WLOCK(tobj);
+ VM_OBJECT_RLOCK(tobj);
if (lobj != obj)
- VM_OBJECT_WUNLOCK(lobj);
+ VM_OBJECT_RUNLOCK(lobj);
lobj = tobj;
}
@@ -1692,14 +1692,14 @@ pmc_log_process_mappings(struct pmc_owner *po, struct proc *p)
if (lobj == NULL) {
PMCDBG(LOG,OPS,2, "hwpmc: lobj unexpectedly NULL! pid=%d "
"vm_map=%p vm_obj=%p\n", p->p_pid, map, obj);
- VM_OBJECT_WUNLOCK(obj);
+ VM_OBJECT_RUNLOCK(obj);
continue;
}
if (lobj->type != OBJT_VNODE || lobj->handle == NULL) {
if (lobj != obj)
- VM_OBJECT_WUNLOCK(lobj);
- VM_OBJECT_WUNLOCK(obj);
+ VM_OBJECT_RUNLOCK(lobj);
+ VM_OBJECT_RUNLOCK(obj);
continue;
}
@@ -1711,8 +1711,8 @@ pmc_log_process_mappings(struct pmc_owner *po, struct proc *p)
if (entry->start == last_end && lobj->handle == last_vp) {
last_end = entry->end;
if (lobj != obj)
- VM_OBJECT_WUNLOCK(lobj);
- VM_OBJECT_WUNLOCK(obj);
+ VM_OBJECT_RUNLOCK(lobj);
+ VM_OBJECT_RUNLOCK(obj);
continue;
}
@@ -1734,9 +1734,9 @@ pmc_log_process_mappings(struct pmc_owner *po, struct proc *p)
vp = lobj->handle;
vref(vp);
if (lobj != obj)
- VM_OBJECT_WUNLOCK(lobj);
+ VM_OBJECT_RUNLOCK(lobj);
- VM_OBJECT_WUNLOCK(obj);
+ VM_OBJECT_RUNLOCK(obj);
freepath = NULL;
pmc_getfilename(vp, &fullpath, &freepath);
diff --git a/sys/fs/procfs/procfs_map.c b/sys/fs/procfs/procfs_map.c
index 542c8fe..eae70229 100644
--- a/sys/fs/procfs/procfs_map.c
+++ b/sys/fs/procfs/procfs_map.c
@@ -132,7 +132,7 @@ procfs_doprocmap(PFS_FILL_ARGS)
privateresident = 0;
obj = entry->object.vm_object;
if (obj != NULL) {
- VM_OBJECT_WLOCK(obj);
+ VM_OBJECT_RLOCK(obj);
if (obj->shadow_count == 1)
privateresident = obj->resident_page_count;
}
@@ -148,9 +148,9 @@ procfs_doprocmap(PFS_FILL_ARGS)
for (lobj = tobj = obj; tobj; tobj = tobj->backing_object) {
if (tobj != obj)
- VM_OBJECT_WLOCK(tobj);
+ VM_OBJECT_RLOCK(tobj);
if (lobj != obj)
- VM_OBJECT_WUNLOCK(lobj);
+ VM_OBJECT_RUNLOCK(lobj);
lobj = tobj;
}
last_timestamp = map->timestamp;
@@ -181,12 +181,12 @@ procfs_doprocmap(PFS_FILL_ARGS)
break;
}
if (lobj != obj)
- VM_OBJECT_WUNLOCK(lobj);
+ VM_OBJECT_RUNLOCK(lobj);
flags = obj->flags;
ref_count = obj->ref_count;
shadow_count = obj->shadow_count;
- VM_OBJECT_WUNLOCK(obj);
+ VM_OBJECT_RUNLOCK(obj);
if (vp != NULL) {
vn_fullpath(td, vp, &fullpath, &freepath);
vrele(vp);
OpenPOWER on IntegriCloud