summaryrefslogtreecommitdiff
path: root/sys/kern/vfs_subr.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/kern/vfs_subr.c')
-rw-r--r--sys/kern/vfs_subr.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/kern/vfs_subr.c b/sys/kern/vfs_subr.c
index e132627dda8d..113cb61144a3 100644
--- a/sys/kern/vfs_subr.c
+++ b/sys/kern/vfs_subr.c
@@ -582,7 +582,7 @@ vlrureclaim(struct mount *mp)
}
MNT_IUNLOCK(mp);
vholdl(vp);
- if (VOP_LOCK(vp, LK_INTERLOCK|LK_EXCLUSIVE|LK_NOWAIT, td)) {
+ if (VOP_LOCK(vp, LK_INTERLOCK|LK_EXCLUSIVE, td)) {
vdrop(vp);
MNT_ILOCK(mp);
continue;
@@ -680,11 +680,19 @@ vnlru_proc(void)
done = 0;
mtx_lock(&mountlist_mtx);
for (mp = TAILQ_FIRST(&mountlist); mp != NULL; mp = nmp) {
+ int vfsunlocked;
if (vfs_busy(mp, LK_NOWAIT, &mountlist_mtx, td)) {
nmp = TAILQ_NEXT(mp, mnt_list);
continue;
}
+ if (!VFS_NEEDSGIANT(mp)) {
+ mtx_unlock(&Giant);
+ vfsunlocked = 1;
+ } else
+ vfsunlocked = 0;
done += vlrureclaim(mp);
+ if (vfsunlocked)
+ mtx_lock(&Giant);
mtx_lock(&mountlist_mtx);
nmp = TAILQ_NEXT(mp, mnt_list);
vfs_unbusy(mp, td);
@@ -700,7 +708,8 @@ vnlru_proc(void)
#endif
vnlru_nowhere++;
tsleep(vnlruproc, PPAUSE, "vlrup", hz * 3);
- }
+ } else
+ uio_yield();
}
}