svn commit: r302343 - head/sys/vm

Konstantin Belousov kib at FreeBSD.org
Tue Jul 5 11:21:03 UTC 2016


Author: kib
Date: Tue Jul  5 11:21:02 2016
New Revision: 302343
URL: https://svnweb.freebsd.org/changeset/base/302343

Log:
  Clarify the vnode_destroy_vobject() logic handling for already terminated
  objects.
  
  Assert that there is no new waiters for the already terminated objects.
  Old waiters should have been notified by the termination calling
  vnode_pager_dealloc() (old/new are with regard of the lock acquisition
  interval).
  
  Only clear the vp->v_object for the case of already terminated object,
  since other branches call vnode_pager_dealloc(), which should clear
  the pointer.  Assert this.
  
  Tested by:	pho
  Reviewed by:	alc
  Sponsored by:	The FreeBSD Foundation
  MFC after:	2 weeks
  Approved by:	re (gjb)

Modified:
  head/sys/vm/vnode_pager.c

Modified: head/sys/vm/vnode_pager.c
==============================================================================
--- head/sys/vm/vnode_pager.c	Tue Jul  5 07:01:42 2016	(r302342)
+++ head/sys/vm/vnode_pager.c	Tue Jul  5 11:21:02 2016	(r302343)
@@ -169,10 +169,21 @@ vnode_destroy_vobject(struct vnode *vp)
 		/*
 		 * don't double-terminate the object
 		 */
-		if ((obj->flags & OBJ_DEAD) == 0)
+		if ((obj->flags & OBJ_DEAD) == 0) {
 			vm_object_terminate(obj);
-		else
+		} else {
+			/*
+			 * Waiters were already handled during object
+			 * termination.  The exclusive vnode lock hopefully
+			 * prevented new waiters from referencing the dying
+			 * object.
+			 */
+			KASSERT((obj->flags & OBJ_DISCONNECTWNT) == 0,
+			    ("OBJ_DISCONNECTWNT set obj %p flags %x",
+			    obj, obj->flags));
+			vp->v_object = NULL;
 			VM_OBJECT_WUNLOCK(obj);
+		}
 	} else {
 		/*
 		 * Woe to the process that tries to page now :-).
@@ -180,7 +191,7 @@ vnode_destroy_vobject(struct vnode *vp)
 		vm_pager_deallocate(obj);
 		VM_OBJECT_WUNLOCK(obj);
 	}
-	vp->v_object = NULL;
+	KASSERT(vp->v_object == NULL, ("vp %p obj %p", vp, vp->v_object));
 }
 
 


More information about the svn-src-all mailing list