Author: alc
Date: Wed Jun  5 17:00:10 2013
New Revision: 251423
URL: http://svnweb.freebsd.org/changeset/base/251423

Log:
  Relax the vm object locking.  Use a read lock.
  
  Sponsored by: EMC / Isilon Storage Division

Modified:
  head/sys/compat/linprocfs/linprocfs.c
  head/sys/dev/hwpmc/hwpmc_mod.c
  head/sys/fs/procfs/procfs_map.c

Modified: head/sys/compat/linprocfs/linprocfs.c
==============================================================================
--- head/sys/compat/linprocfs/linprocfs.c       Wed Jun  5 16:12:50 2013        
(r251422)
+++ head/sys/compat/linprocfs/linprocfs.c       Wed Jun  5 17:00:10 2013        
(r251423)
@@ -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);

Modified: head/sys/dev/hwpmc/hwpmc_mod.c
==============================================================================
--- head/sys/dev/hwpmc/hwpmc_mod.c      Wed Jun  5 16:12:50 2013        
(r251422)
+++ head/sys/dev/hwpmc/hwpmc_mod.c      Wed Jun  5 17:00:10 2013        
(r251423)
@@ -1672,7 +1672,7 @@ pmc_log_process_mappings(struct pmc_owne
                }
 
                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_owne
                 */
                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_owne
                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_owne
                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_owne
                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);

Modified: head/sys/fs/procfs/procfs_map.c
==============================================================================
--- head/sys/fs/procfs/procfs_map.c     Wed Jun  5 16:12:50 2013        
(r251422)
+++ head/sys/fs/procfs/procfs_map.c     Wed Jun  5 17:00:10 2013        
(r251423)
@@ -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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to