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