svn commit: r351478 - head/sys/vm

Konstantin Belousov kib at FreeBSD.org
Sun Aug 25 13:26:07 UTC 2019


Author: kib
Date: Sun Aug 25 13:26:06 2019
New Revision: 351478
URL: https://svnweb.freebsd.org/changeset/base/351478

Log:
  Move OBJT_VNODE specific code from vm_object_terminate() to
  vnode_destroy_vobject().
  
  Reviewed by:	alc, jeff (previous version), markj
  Tested by:	pho
  Sponsored by:	The FreeBSD Foundation
  MFC after:	1 week
  Differential revision:	https://reviews.freebsd.org/D21357

Modified:
  head/sys/vm/vm_object.c
  head/sys/vm/vnode_pager.c

Modified: head/sys/vm/vm_object.c
==============================================================================
--- head/sys/vm/vm_object.c	Sun Aug 25 07:50:44 2019	(r351477)
+++ head/sys/vm/vm_object.c	Sun Aug 25 13:26:06 2019	(r351478)
@@ -653,9 +653,10 @@ doterm:
 		 * recursion due to the terminate having to sync data
 		 * to disk.
 		 */
-		if ((object->flags & OBJ_DEAD) == 0)
+		if ((object->flags & OBJ_DEAD) == 0) {
+			vm_object_set_flag(object, OBJ_DEAD);
 			vm_object_terminate(object);
-		else
+		} else
 			VM_OBJECT_WUNLOCK(object);
 		object = temp;
 	}
@@ -746,35 +747,9 @@ vm_object_terminate_pages(vm_object_t object)
 void
 vm_object_terminate(vm_object_t object)
 {
-
 	VM_OBJECT_ASSERT_WLOCKED(object);
-
-	/*
-	 * Make sure no one uses us.
-	 */
-	vm_object_set_flag(object, OBJ_DEAD);
-
-	/*
-	 * Clean and free the pages, as appropriate. All references to the
-	 * object are gone, so we don't need to lock it.
-	 */
-	if (object->type == OBJT_VNODE) {
-		struct vnode *vp = (struct vnode *)object->handle;
-
-		/*
-		 * Clean pages and flush buffers.
-		 */
-		vm_object_page_clean(object, 0, 0, OBJPC_SYNC);
-		VM_OBJECT_WUNLOCK(object);
-
-		vinvalbuf(vp, V_SAVE, 0, 0);
-
-		BO_LOCK(&vp->v_bufobj);
-		vp->v_bufobj.bo_flag |= BO_DEAD;
-		BO_UNLOCK(&vp->v_bufobj);
-
-		VM_OBJECT_WLOCK(object);
-	}
+	KASSERT((object->flags & OBJ_DEAD) != 0,
+	    ("terminating non-dead obj %p", object));
 
 	/*
 	 * wait for the pageout daemon to be done with the object

Modified: head/sys/vm/vnode_pager.c
==============================================================================
--- head/sys/vm/vnode_pager.c	Sun Aug 25 07:50:44 2019	(r351477)
+++ head/sys/vm/vnode_pager.c	Sun Aug 25 13:26:06 2019	(r351478)
@@ -200,6 +200,21 @@ vnode_destroy_vobject(struct vnode *vp)
 		 * don't double-terminate the object
 		 */
 		if ((obj->flags & OBJ_DEAD) == 0) {
+			vm_object_set_flag(obj, OBJ_DEAD);
+
+			/*
+			 * Clean pages and flush buffers.
+			 */
+			vm_object_page_clean(obj, 0, 0, OBJPC_SYNC);
+			VM_OBJECT_WUNLOCK(obj);
+
+			vinvalbuf(vp, V_SAVE, 0, 0);
+
+			BO_LOCK(&vp->v_bufobj);
+			vp->v_bufobj.bo_flag |= BO_DEAD;
+			BO_UNLOCK(&vp->v_bufobj);
+
+			VM_OBJECT_WLOCK(obj);
 			vm_object_terminate(obj);
 		} else {
 			/*


More information about the svn-src-head mailing list