Index: sys/kern/vfs_subr.c =================================================================== --- sys/kern/vfs_subr.c (revision 244045) +++ sys/kern/vfs_subr.c (working copy) @@ -4718,8 +4718,8 @@ __mnt_vnode_next_active(struct vnode **mvp, struct if (should_yield()) kern_yield(PRI_UNCHANGED); MNT_ILOCK(mp); + mtx_lock(&vnode_free_list_mtx); restart: - mtx_lock(&vnode_free_list_mtx); KASSERT((*mvp)->v_mount == mp, ("marker vnode mount list mismatch")); vp = TAILQ_NEXT(*mvp, v_actfreelist); while (vp != NULL) { @@ -4728,8 +4728,13 @@ restart: continue; } if (!VI_TRYLOCK(vp)) { - mtx_unlock(&vnode_free_list_mtx); - kern_yield(PRI_UNCHANGED); + if (should_yield()) { + mtx_unlock(&vnode_free_list_mtx); + MNT_IUNLOCK(mp); + kern_yield(PRI_UNCHANGED); + MNT_ILOCK(mp); + mtx_lock(&vnode_free_list_mtx); + } goto restart; } if (vp->v_mount == mp && vp->v_type != VMARKER && @@ -4763,12 +4768,11 @@ __mnt_vnode_first_active(struct vnode **mvp, struc struct vnode *vp, *nvp; *mvp = malloc(sizeof(struct vnode), M_VNODE_MARKER, M_WAITOK | M_ZERO); + (*mvp)->v_type = VMARKER; MNT_ILOCK(mp); MNT_REF(mp); - (*mvp)->v_type = VMARKER; - + mtx_lock(&vnode_free_list_mtx); restart: - mtx_lock(&vnode_free_list_mtx); vp = TAILQ_FIRST(&mp->mnt_activevnodelist); while (vp != NULL) { if (vp->v_type == VMARKER) { @@ -4776,8 +4780,15 @@ restart: continue; } if (!VI_TRYLOCK(vp)) { - mtx_unlock(&vnode_free_list_mtx); - kern_yield(PRI_UNCHANGED); + if (should_yield()) { + mtx_unlock(&vnode_free_list_mtx); + MNT_REL(mp); + MNT_IUNLOCK(mp); + kern_yield(PRI_UNCHANGED); + MNT_ILOCK(mp); + MNT_REF(mp); + mtx_lock(&vnode_free_list_mtx); + } goto restart; } if (vp->v_mount == mp && vp->v_type != VMARKER &&