summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2015-11-27 01:16:35 +0000
committerkib <kib@FreeBSD.org>2015-11-27 01:16:35 +0000
commit3cb64bd1cedb85352b1ef883f83dec1ad91b24ce (patch)
treecbdd05bd54f698c70d4e78f7755124ab48b92ff1 /sys
parent691fa69119786b8e59490f25b6e419f7fe6fdc07 (diff)
downloadFreeBSD-src-3cb64bd1cedb85352b1ef883f83dec1ad91b24ce.zip
FreeBSD-src-3cb64bd1cedb85352b1ef883f83dec1ad91b24ce.tar.gz
Move the comment about resident pages preventing vnode from leaving
active list, into the header comment for vdrop(), which is the function that decides whether to leave the vnode on the list. Note that dirty page write-out in vinactive() is asynchronous. Discussed with: alc Sponsored by: The FreeBSD Foundation MFC after: 1 week
Diffstat (limited to 'sys')
-rw-r--r--sys/kern/vfs_subr.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index 9d0a227..5421e4d 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -2618,6 +2618,10 @@ _vhold(struct vnode *vp, bool locked)
* Drop the hold count of the vnode. If this is the last reference to
* the vnode we place it on the free list unless it has been vgone'd
* (marked VI_DOOMED) in which case we will free it.
+ *
+ * Because the vnode vm object keeps a hold reference on the vnode if
+ * there is at least one resident non-cached page, the vnode cannot
+ * leave the active list without the page cleanup done.
*/
void
_vdrop(struct vnode *vp, bool locked)
@@ -2744,11 +2748,13 @@ vinactive(struct vnode *vp, struct thread *td)
VI_UNLOCK(vp);
/*
* Before moving off the active list, we must be sure that any
- * modified pages are on the vnode's dirty list since these will
- * no longer be checked once the vnode is on the inactive list.
- * Because the vnode vm object keeps a hold reference on the vnode
- * if there is at least one resident non-cached page, the vnode
- * cannot leave the active list without the page cleanup done.
+ * modified pages are converted into the vnode's dirty
+ * buffers, since these will no longer be checked once the
+ * vnode is on the inactive list.
+ *
+ * The write-out of the dirty pages is asynchronous. At the
+ * point that VOP_INACTIVE() is called, there could still be
+ * pending I/O and dirty pages in the object.
*/
obj = vp->v_object;
if (obj != NULL && (obj->flags & OBJ_MIGHTBEDIRTY) != 0) {
OpenPOWER on IntegriCloud