Author: kib
Date: Sun Feb  8 20:30:51 2009
New Revision: 188333
URL: http://svn.freebsd.org/changeset/base/188333

Log:
  In vm_map_sync(), do not call vm_object_sync() while holding map lock.
  Reference object, drop the map lock, and then call vm_object_sync().
  The object sync might require vnode lock for OBJT_VNODE type objects.
  
  Reviewed by:  tegge
  Tested by:    pho

Modified:
  head/sys/vm/vm_map.c

Modified: head/sys/vm/vm_map.c
==============================================================================
--- head/sys/vm/vm_map.c        Sun Feb  8 20:29:37 2009        (r188332)
+++ head/sys/vm/vm_map.c        Sun Feb  8 20:30:51 2009        (r188333)
@@ -2304,6 +2304,7 @@ vm_map_sync(
        vm_size_t size;
        vm_object_t object;
        vm_ooffset_t offset;
+       unsigned int last_timestamp;
 
        vm_map_lock_read(map);
        VM_MAP_RANGE_CHECK(map, start, end);
@@ -2338,8 +2339,7 @@ vm_map_sync(
         * Make a second pass, cleaning/uncaching pages from the indicated
         * objects as we go.
         */
-       for (current = entry; current != &map->header && current->start < end;
-           current = current->next) {
+       for (current = entry; current != &map->header && current->start < end;) 
{
                offset = current->offset + (start - current->start);
                size = (end <= current->end ? end : current->end) - start;
                if (current->eflags & MAP_ENTRY_IS_SUB_MAP) {
@@ -2359,8 +2359,16 @@ vm_map_sync(
                } else {
                        object = current->object.vm_object;
                }
+               vm_object_reference(object);
+               last_timestamp = map->timestamp;
+               vm_map_unlock_read(map);
                vm_object_sync(object, offset, size, syncio, invalidate);
                start += size;
+               vm_object_deallocate(object);
+               vm_map_lock_read(map);
+               if (last_timestamp == map->timestamp ||
+                   !vm_map_lookup_entry(map, start, &current))
+                       current = current->next;
        }
 
        vm_map_unlock_read(map);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to