mirror of
https://git.FreeBSD.org/src.git
synced 2025-02-04 17:15:50 +00:00
Relax the vm object locking. Use a read lock.
Sponsored by: EMC / Isilon Storage Division
This commit is contained in:
parent
74d2e02b85
commit
66c392df53
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=251423
@ -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);
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user