Module Name:    src
Committed By:   ad
Date:           Mon Apr 20 21:39:05 UTC 2020

Modified Files:
        src/sys/kern: kern_pmf.c vfs_bio.c vfs_mount.c vfs_syscalls.c
        src/sys/rump/librump/rumpvfs: rump_vfs.c
        src/sys/sys: buf.h vfs_syscalls.h

Log Message:
Rename buf_syncwait() to vfs_syncwait(), and have it wait on v_numoutput
rather than BC_BUSY.  Removes the dependency on bufhash.


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/sys/kern/kern_pmf.c
cvs rdiff -u -r1.293 -r1.294 src/sys/kern/vfs_bio.c
cvs rdiff -u -r1.79 -r1.80 src/sys/kern/vfs_mount.c
cvs rdiff -u -r1.545 -r1.546 src/sys/kern/vfs_syscalls.c
cvs rdiff -u -r1.91 -r1.92 src/sys/rump/librump/rumpvfs/rump_vfs.c
cvs rdiff -u -r1.132 -r1.133 src/sys/sys/buf.h
cvs rdiff -u -r1.27 -r1.28 src/sys/sys/vfs_syscalls.h

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/kern/kern_pmf.c
diff -u src/sys/kern/kern_pmf.c:1.41 src/sys/kern/kern_pmf.c:1.42
--- src/sys/kern/kern_pmf.c:1.41	Sun Feb 23 20:08:35 2020
+++ src/sys/kern/kern_pmf.c	Mon Apr 20 21:39:05 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_pmf.c,v 1.41 2020/02/23 20:08:35 ad Exp $ */
+/* $NetBSD: kern_pmf.c,v 1.42 2020/04/20 21:39:05 ad Exp $ */
 
 /*-
  * Copyright (c) 2007 Jared D. McNeill <jmcne...@invisible.ca>
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_pmf.c,v 1.41 2020/02/23 20:08:35 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_pmf.c,v 1.42 2020/04/20 21:39:05 ad Exp $");
 
 #include <sys/types.h>
 #include <sys/param.h>
@@ -317,7 +317,7 @@ pmf_system_suspend(const pmf_qual_t *qua
 	if (doing_shutdown == 0 && panicstr == NULL) {
 		printf("Flushing disk caches: ");
 		do_sys_sync(&lwp0);
-		if (buf_syncwait() != 0)
+		if (vfs_syncwait() != 0)
 			printf("giving up\n");
 		else
 			printf("done\n");

Index: src/sys/kern/vfs_bio.c
diff -u src/sys/kern/vfs_bio.c:1.293 src/sys/kern/vfs_bio.c:1.294
--- src/sys/kern/vfs_bio.c:1.293	Sat Apr 11 14:48:19 2020
+++ src/sys/kern/vfs_bio.c	Mon Apr 20 21:39:05 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_bio.c,v 1.293 2020/04/11 14:48:19 jdolecek Exp $	*/
+/*	$NetBSD: vfs_bio.c,v 1.294 2020/04/20 21:39:05 ad Exp $	*/
 
 /*-
  * Copyright (c) 2007, 2008, 2009, 2019, 2020 The NetBSD Foundation, Inc.
@@ -123,7 +123,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.293 2020/04/11 14:48:19 jdolecek Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_bio.c,v 1.294 2020/04/20 21:39:05 ad Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_bufcache.h"
@@ -1708,57 +1708,6 @@ biointr(void *cookie)
 	splx(s);
 }
 
-/*
- * Wait for all buffers to complete I/O
- * Return the number of "stuck" buffers.
- */
-int
-buf_syncwait(void)
-{
-	buf_t *bp;
-	int iter, nbusy, nbusy_prev = 0, ihash;
-
-	BIOHIST_FUNC(__func__); BIOHIST_CALLED(biohist);
-
-	for (iter = 0; iter < 20;) {
-		mutex_enter(&bufcache_lock);
-		nbusy = 0;
-		for (ihash = 0; ihash < bufhash+1; ihash++) {
-		    LIST_FOREACH(bp, &bufhashtbl[ihash], b_hash) {
-			if ((bp->b_cflags & (BC_BUSY|BC_INVAL)) == BC_BUSY)
-				nbusy += ((bp->b_flags & B_READ) == 0);
-		    }
-		}
-		mutex_exit(&bufcache_lock);
-
-		if (nbusy == 0)
-			break;
-		if (nbusy_prev == 0)
-			nbusy_prev = nbusy;
-		printf("%d ", nbusy);
-		kpause("bflush", false, MAX(1, hz / 25 * iter), NULL);
-		if (nbusy >= nbusy_prev) /* we didn't flush anything */
-			iter++;
-		else
-			nbusy_prev = nbusy;
-	}
-
-	if (nbusy) {
-#if defined(DEBUG) || defined(DEBUG_HALT_BUSY)
-		printf("giving up\nPrinting vnodes for busy buffers\n");
-		for (ihash = 0; ihash < bufhash+1; ihash++) {
-		    LIST_FOREACH(bp, &bufhashtbl[ihash], b_hash) {
-			if ((bp->b_cflags & (BC_BUSY|BC_INVAL)) == BC_BUSY &&
-			    (bp->b_flags & B_READ) == 0)
-				vprint(NULL, bp->b_vp);
-		    }
-		}
-#endif
-	}
-
-	return nbusy;
-}
-
 static void
 sysctl_fillbuf(const buf_t *i, struct buf_sysctl *o)
 {

Index: src/sys/kern/vfs_mount.c
diff -u src/sys/kern/vfs_mount.c:1.79 src/sys/kern/vfs_mount.c:1.80
--- src/sys/kern/vfs_mount.c:1.79	Sun Apr 19 13:26:17 2020
+++ src/sys/kern/vfs_mount.c	Mon Apr 20 21:39:05 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_mount.c,v 1.79 2020/04/19 13:26:17 hannken Exp $	*/
+/*	$NetBSD: vfs_mount.c,v 1.80 2020/04/20 21:39:05 ad Exp $	*/
 
 /*-
  * Copyright (c) 1997-2020 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.79 2020/04/19 13:26:17 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_mount.c,v 1.80 2020/04/20 21:39:05 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -1093,7 +1093,7 @@ vfs_sync_all(struct lwp *l)
 	do_sys_sync(l);
 
 	/* Wait for sync to finish. */
-	if (buf_syncwait() != 0) {
+	if (vfs_syncwait() != 0) {
 #if defined(DDB) && defined(DEBUG_HALT_BUSY)
 		Debugger();
 #endif

Index: src/sys/kern/vfs_syscalls.c
diff -u src/sys/kern/vfs_syscalls.c:1.545 src/sys/kern/vfs_syscalls.c:1.546
--- src/sys/kern/vfs_syscalls.c:1.545	Sat Apr  4 20:49:30 2020
+++ src/sys/kern/vfs_syscalls.c	Mon Apr 20 21:39:05 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: vfs_syscalls.c,v 1.545 2020/04/04 20:49:30 ad Exp $	*/
+/*	$NetBSD: vfs_syscalls.c,v 1.546 2020/04/20 21:39:05 ad Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009, 2019, 2020 The NetBSD Foundation, Inc.
@@ -70,7 +70,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.545 2020/04/04 20:49:30 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vfs_syscalls.c,v 1.546 2020/04/20 21:39:05 ad Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_fileassoc.h"
@@ -672,6 +672,72 @@ do_sys_sync(struct lwp *l)
 #endif /* DEBUG */
 }
 
+static bool
+sync_vnode_filter(void *cookie, vnode_t *vp)
+{
+
+	if (vp->v_numoutput > 0) {
+		++*(int *)cookie;
+	}
+	return false;
+}
+
+int
+vfs_syncwait(void)
+{
+	int nbusy, nbusy_prev, iter;
+	struct vnode_iterator *vniter;
+	mount_iterator_t *mpiter;
+	struct mount *mp;
+
+	for (nbusy_prev = 0, iter = 0; iter < 20;) {
+		nbusy = 0;
+		mountlist_iterator_init(&mpiter);
+		while ((mp = mountlist_iterator_next(mpiter)) != NULL) {
+			vnode_t *vp __diagused;
+			vfs_vnode_iterator_init(mp, &vniter);
+			vp = vfs_vnode_iterator_next(vniter,
+			    sync_vnode_filter, &nbusy);
+			KASSERT(vp == NULL);
+			vfs_vnode_iterator_destroy(vniter);
+		}
+		mountlist_iterator_destroy(mpiter);
+
+		if (nbusy == 0)
+			break;
+		if (nbusy_prev == 0)
+			nbusy_prev = nbusy;
+		printf("%d ", nbusy);
+		kpause("syncwait", false, MAX(1, hz / 25 * iter), NULL);
+		if (nbusy >= nbusy_prev) /* we didn't flush anything */
+			iter++;
+		else
+			nbusy_prev = nbusy;
+	}
+
+	if (nbusy) {
+#if defined(DEBUG) || defined(DEBUG_HALT_BUSY)
+		printf("giving up\nPrinting vnodes for busy buffers\n");
+		mountlist_iterator_init(&mpiter);
+		while ((mp = mountlist_iterator_next(mpiter)) != NULL) {
+			vnode_t *vp;
+			vfs_vnode_iterator_init(mp, &vniter);
+			vp = vfs_vnode_iterator_next(vniter,
+			    NULL, NULL);
+			mutex_enter(vp->v_interlock);
+			if (vp->v_numoutput > 0)
+				vprint(NULL, vp);
+			mutex_exit(vp->v_interlock);
+			vrele(vp);
+			vfs_vnode_iterator_destroy(vniter);
+		}
+		mountlist_iterator_destroy(mpiter);
+#endif
+	}
+
+	return nbusy;
+}
+
 /* ARGSUSED */
 int
 sys_sync(struct lwp *l, const void *v, register_t *retval)

Index: src/sys/rump/librump/rumpvfs/rump_vfs.c
diff -u src/sys/rump/librump/rumpvfs/rump_vfs.c:1.91 src/sys/rump/librump/rumpvfs/rump_vfs.c:1.92
--- src/sys/rump/librump/rumpvfs/rump_vfs.c:1.91	Mon Apr 13 19:23:20 2020
+++ src/sys/rump/librump/rumpvfs/rump_vfs.c	Mon Apr 20 21:39:05 2020
@@ -1,4 +1,4 @@
-/*	$NetBSD: rump_vfs.c,v 1.91 2020/04/13 19:23:20 ad Exp $	*/
+/*	$NetBSD: rump_vfs.c,v 1.92 2020/04/20 21:39:05 ad Exp $	*/
 
 /*
  * Copyright (c) 2008 Antti Kantee.  All Rights Reserved.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rump_vfs.c,v 1.91 2020/04/13 19:23:20 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump_vfs.c,v 1.92 2020/04/20 21:39:05 ad Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -470,7 +470,7 @@ rump_vfs_syncwait(struct mount *mp)
 {
 	int n;
 
-	n = buf_syncwait();
+	n = vfs_syncwait();
 	if (n)
 		printf("syncwait: unsynced buffers: %d\n", n);
 }

Index: src/sys/sys/buf.h
diff -u src/sys/sys/buf.h:1.132 src/sys/sys/buf.h:1.133
--- src/sys/sys/buf.h:1.132	Fri Apr 10 17:18:04 2020
+++ src/sys/sys/buf.h	Mon Apr 20 21:39:05 2020
@@ -1,4 +1,4 @@
-/*     $NetBSD: buf.h,v 1.132 2020/04/10 17:18:04 ad Exp $ */
+/*     $NetBSD: buf.h,v 1.133 2020/04/20 21:39:05 ad Exp $ */
 
 /*-
  * Copyright (c) 1999, 2000, 2007, 2008 The NetBSD Foundation, Inc.
@@ -299,7 +299,6 @@ void	minphys(buf_t *);
 void	brelvp(buf_t *);
 void	reassignbuf(buf_t *, struct vnode *);
 void	bgetvp(struct vnode *, buf_t *);
-int	buf_syncwait(void);
 u_long	buf_memcalc(void);
 int	buf_drain(int);
 int	buf_setvalimit(vsize_t);

Index: src/sys/sys/vfs_syscalls.h
diff -u src/sys/sys/vfs_syscalls.h:1.27 src/sys/sys/vfs_syscalls.h:1.28
--- src/sys/sys/vfs_syscalls.h:1.27	Sun Feb 23 22:14:04 2020
+++ src/sys/sys/vfs_syscalls.h	Mon Apr 20 21:39:05 2020
@@ -1,4 +1,4 @@
-/*     $NetBSD: vfs_syscalls.h,v 1.27 2020/02/23 22:14:04 ad Exp $        */
+/*     $NetBSD: vfs_syscalls.h,v 1.28 2020/04/20 21:39:05 ad Exp $        */
 
 /*
  * Copyright (c) 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -80,6 +80,7 @@ int	do_sys_mkdir(const char *, mode_t, e
 int	do_sys_symlink(const char *, const char *, enum uio_seg);
 int	do_sys_quotactl(const char *, const struct quotactl_args *);
 void	do_sys_sync(struct lwp *);
+int	vfs_syncwait(void);
 
 int	chdir_lookup(const char *, int, struct vnode **, struct lwp *);
 void	change_root(struct vnode *);

Reply via email to