Author: kib
Date: Sun Aug 16 20:57:02 2020
New Revision: 364286
URL: https://svnweb.freebsd.org/changeset/base/364286

Log:
  vm_object: allow paging_in_progress to be acquired after object termination.
  
  The vm objects are type-stable, and can be accessed even after the
  last reference is dropped, or in case of vnode objects, after vgone()
  destroyed it as well.
  
  Stop asserting that pip == 0 after vm_object_terminate() waited for
  existing owners to drop it, we only want to drain them before setting
  OBJ_DEAD flag.  Also stop asserting pip == 0 in object destructor.
  
  Update comments explaining the interaction between paging_in_progress
  and termination.
  
  Reviewed by:  markj
  Tested by:    pho
  Sponsored by: The FreeBSD Foundation
  Differential revision:        https://reviews.freebsd.org/D25968

Modified:
  head/sys/vm/vm_object.c

Modified: head/sys/vm/vm_object.c
==============================================================================
--- head/sys/vm/vm_object.c     Sun Aug 16 20:52:24 2020        (r364285)
+++ head/sys/vm/vm_object.c     Sun Aug 16 20:57:02 2020        (r364286)
@@ -192,9 +192,6 @@ vm_object_zdtor(void *mem, int size, void *arg)
            ("object %p has reservations",
            object));
 #endif
-       KASSERT(blockcount_read(&object->paging_in_progress) == 0,
-           ("object %p paging_in_progress = %d",
-           object, blockcount_read(&object->paging_in_progress)));
        KASSERT(!vm_object_busied(object),
            ("object %p busy = %d", object, blockcount_read(&object->busy)));
        KASSERT(object->resident_page_count == 0,
@@ -294,6 +291,9 @@ vm_object_init(void)
         * The lock portion of struct vm_object must be type stable due
         * to vm_pageout_fallback_object_lock locking a vm object
         * without holding any references to it.
+        *
+        * paging_in_progress is valid always.  Lockless references to
+        * the objects may acquire pip and then check OBJ_DEAD.
         */
        obj_zone = uma_zcreate("VM OBJECT", sizeof (struct vm_object), NULL,
 #ifdef INVARIANTS
@@ -936,12 +936,13 @@ vm_object_terminate(vm_object_t object)
            ("terminating shadow obj %p", object));
 
        /*
-        * wait for the pageout daemon to be done with the object
+        * Wait for the pageout daemon and other current users to be
+        * done with the object.  Note that new paging_in_progress
+        * users can come after this wait, but they must check
+        * OBJ_DEAD flag set (without unlocking the object), and avoid
+        * the object being terminated.
         */
        vm_object_pip_wait(object, "objtrm");
-
-       KASSERT(!blockcount_read(&object->paging_in_progress),
-           ("vm_object_terminate: pageout in progress"));
 
        KASSERT(object->ref_count == 0,
            ("vm_object_terminate: object with references, ref_count=%d",
_______________________________________________
svn-src-all@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to