Module Name:    src
Committed By:   riz
Date:           Wed Nov  2 20:11:12 UTC 2011

Modified Files:
        src/sys/fs/puffs [netbsd-5]: puffs_msgif.c puffs_node.c puffs_vfsops.c
            puffs_vnops.c

Log Message:
Pull up following revision(s) (requested by manu in ticket #1679):
        sys/fs/puffs/puffs_vnops.c: revision 1.157
        sys/fs/puffs/puffs_vnops.c: revision 1.158
        sys/fs/puffs/puffs_vnops.c: revision 1.159
        sys/fs/puffs/puffs_vfsops.c: revision 1.97
        sys/fs/puffs/puffs_vfsops.c: revision 1.99
        sys/fs/puffs/puffs_vnops.c: revision 1.160
        sys/fs/puffs/puffs_vfsops.c: revision 1.100
        sys/miscfs/syncfs/sync_subr.c: revision 1.47
        sys/fs/puffs/puffs_node.c: revision 1.21
        sys/fs/puffs/puffs_node.c: revision 1.22
        sys/fs/puffs/puffs_msgif.c: revision 1.88
        sys/fs/puffs/puffs_msgif.c: revision 1.89
        sys/fs/puffs/puffs_vnops.c: revision 1.156
Make sure ioflush does not sleep in PUFFS code path, waiting for a mutex,
a memory allocation, or a response from the filesystem.
This avoids deadlocks in the following situations:
1) when memory is low: ioflush waits the fileystem, the fielsystem waits
   for memory
2) when the filesystem does not respond (e.g.: network outage ona
   distributed filesystem)
Fix the build that was broken by struct lwp *updateproc reference in
RUMP-visible code. Instead of checking that updateproc (aka ioflush,
aka syncer) will not sleep in PUFFS code, I check for any kernel thread:
after all none of them are designed to hang awaiting for a remote filesystem
operation to complete.
Roll back the change that forced kernel threads to not sleep in PUFFS.
The change does not make consensus, since only pagedaemon should need it.
Other threads will tolerate sleeping, and problems here are only symptoms
that something is going wrong in memory management. The cause, not the
symptoms, need to be fixed.
Make sure pagedaemon does not sleep for memory in puffs_vnop_sleep.
Add KASSERT on any sleeping memory allocation to check it cannot happen again.
Remove #ifdef DIAGNOSTIC guards around KASSERT, as the macro contains them


To generate a diff of this commit:
cvs rdiff -u -r1.72.4.4 -r1.72.4.5 src/sys/fs/puffs/puffs_msgif.c
cvs rdiff -u -r1.13.10.2 -r1.13.10.3 src/sys/fs/puffs/puffs_node.c
cvs rdiff -u -r1.81.8.2 -r1.81.8.3 src/sys/fs/puffs/puffs_vfsops.c
cvs rdiff -u -r1.129.4.10 -r1.129.4.11 src/sys/fs/puffs/puffs_vnops.c

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

Modified files:

Index: src/sys/fs/puffs/puffs_msgif.c
diff -u src/sys/fs/puffs/puffs_msgif.c:1.72.4.4 src/sys/fs/puffs/puffs_msgif.c:1.72.4.5
--- src/sys/fs/puffs/puffs_msgif.c:1.72.4.4	Fri Jul 15 23:41:13 2011
+++ src/sys/fs/puffs/puffs_msgif.c	Wed Nov  2 20:11:12 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_msgif.c,v 1.72.4.4 2011/07/15 23:41:13 riz Exp $	*/
+/*	$NetBSD: puffs_msgif.c,v 1.72.4.5 2011/11/02 20:11:12 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.4 2011/07/15 23:41:13 riz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.72.4.5 2011/11/02 20:11:12 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -45,6 +45,8 @@ __KERNEL_RCSID(0, "$NetBSD: puffs_msgif.
 #include <sys/vnode.h>
 #include <sys/atomic.h>
 
+#include <uvm/uvm.h>
+
 #include <dev/putter/putter_sys.h>
 
 #include <fs/puffs/puffs_msgif.h>
@@ -132,6 +134,7 @@ puffs_msgpark_alloc(int waitok)
 {
 	struct puffs_msgpark *park;
 
+	KASSERT(curlwp != uvm.pagedaemon_lwp || !waitok);
 	park = pool_cache_get(parkpc, waitok ? PR_WAITOK : PR_NOWAIT);
 	if (park == NULL)
 		return park;
@@ -228,6 +231,7 @@ puffs_msgmem_alloc(size_t len, struct pu
 	struct puffs_msgpark *park;
 	void *m;
 
+	KASSERT(curlwp != uvm.pagedaemon_lwp || !cansleep);
 	m = kmem_zalloc(len, cansleep ? KM_SLEEP : KM_NOSLEEP);
 	if (m == NULL) {
 		KASSERT(cansleep == 0);
@@ -935,6 +939,7 @@ puffsop_flush(struct puffs_mount *pmp, s
 	struct componentname *pf_cn;
 	char *name;
 		/* get comfortab^Wcomponentname */
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
 		pf_cn = kmem_alloc(componentname);
 		memset(pf_cn, 0, sizeof(struct componentname));
 		break;
@@ -1011,6 +1016,7 @@ puffs_msgif_dispatch(void *this, struct 
 		}
 		pf = (struct puffs_flush *)preq;
 
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
 		psopr = kmem_alloc(sizeof(*psopr), KM_SLEEP);
 		memcpy(&psopr->psopr_pf, pf, sizeof(*pf));
 		psopr->psopr_sopreq = PUFFS_SOPREQ_FLUSH;

Index: src/sys/fs/puffs/puffs_node.c
diff -u src/sys/fs/puffs/puffs_node.c:1.13.10.2 src/sys/fs/puffs/puffs_node.c:1.13.10.3
--- src/sys/fs/puffs/puffs_node.c:1.13.10.2	Sat Sep 17 18:53:30 2011
+++ src/sys/fs/puffs/puffs_node.c	Wed Nov  2 20:11:12 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_node.c,v 1.13.10.2 2011/09/17 18:53:30 bouyer Exp $	*/
+/*	$NetBSD: puffs_node.c,v 1.13.10.3 2011/11/02 20:11:12 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.2 2011/09/17 18:53:30 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.13.10.3 2011/11/02 20:11:12 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/hash.h>
@@ -40,6 +40,8 @@ __KERNEL_RCSID(0, "$NetBSD: puffs_node.c
 #include <sys/namei.h>
 #include <sys/vnode.h>
 
+#include <uvm/uvm.h>
+
 #include <fs/puffs/puffs_msgif.h>
 #include <fs/puffs/puffs_sys.h>
 
@@ -228,6 +230,8 @@ puffs_newnode(struct mount *mp, struct v
 			return EPROTO;
 		}
 	}
+
+	KASSERT(curlwp != uvm.pagedaemon_lwp);
 	pnc = kmem_alloc(sizeof(struct puffs_newcookie), KM_SLEEP);
 	pnc->pnc_cookie = ck;
 	LIST_INSERT_HEAD(&pmp->pmp_newcookie, pnc, pnc_entries);

Index: src/sys/fs/puffs/puffs_vfsops.c
diff -u src/sys/fs/puffs/puffs_vfsops.c:1.81.8.2 src/sys/fs/puffs/puffs_vfsops.c:1.81.8.3
--- src/sys/fs/puffs/puffs_vfsops.c:1.81.8.2	Sun Jul 17 15:36:03 2011
+++ src/sys/fs/puffs/puffs_vfsops.c	Wed Nov  2 20:11:12 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vfsops.c,v 1.81.8.2 2011/07/17 15:36:03 riz Exp $	*/
+/*	$NetBSD: puffs_vfsops.c,v 1.81.8.3 2011/11/02 20:11:12 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: puffs_vfsops.c,v 1.81.8.2 2011/07/17 15:36:03 riz Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vfsops.c,v 1.81.8.3 2011/11/02 20:11:12 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/mount.h>
@@ -45,6 +45,8 @@ __KERNEL_RCSID(0, "$NetBSD: puffs_vfsops
 #include <sys/module.h>
 #include <sys/kthread.h>
 
+#include <uvm/uvm.h>
+
 #include <dev/putter/putter_sys.h>
 
 #include <miscfs/genfs/genfs.h>
@@ -219,6 +221,7 @@ puffs_vfsop_mount(struct mount *mp, cons
 	copy_statvfs_info(&args->pa_svfsb, mp);
 	(void)memcpy(&mp->mnt_stat, &args->pa_svfsb, sizeof(mp->mnt_stat));
 
+	KASSERT(curlwp != uvm.pagedaemon_lwp);
 	pmp = kmem_zalloc(sizeof(struct puffs_mount), KM_SLEEP);
 
 	mp->mnt_fs_bshift = DEV_BSHIFT;
@@ -376,6 +379,7 @@ puffs_vfsop_unmount(struct mount *mp, in
 		 * Release kernel thread now that there is nothing
 		 * it would be wanting to lock.
 		 */
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
 		psopr = kmem_alloc(sizeof(*psopr), KM_SLEEP);
 		psopr->psopr_sopreq = PUFFS_SOPREQ_EXIT;
 		mutex_enter(&pmp->pmp_sopmtx);
@@ -468,7 +472,7 @@ pageflush(struct mount *mp, kauth_cred_t
 {
 	struct puffs_node *pn;
 	struct vnode *vp, *mvp;
-	int error, rv;
+	int error, rv, fsyncwait;
 
 	KASSERT(((waitfor == MNT_WAIT) && suspending) == 0);
 	KASSERT((suspending == 0)
@@ -476,6 +480,7 @@ pageflush(struct mount *mp, kauth_cred_t
 	      && fstrans_getstate(mp) == FSTRANS_SUSPENDING));
 
 	error = 0;
+	fsyncwait = (waitfor == MNT_WAIT) ? FSYNC_WAIT : 0;
 
 	/* Allocate a marker vnode. */
 	if ((mvp = vnalloc(mp)) == NULL)
@@ -557,7 +562,7 @@ pageflush(struct mount *mp, kauth_cred_t
 			pn->pn_stat |= PNODE_SUSPEND;
 			mutex_exit(&vp->v_interlock);
 		}
-		rv = VOP_FSYNC(vp, cred, waitfor, 0, 0);
+		rv = VOP_FSYNC(vp, cred, fsyncwait, 0, 0);
 		if (suspending || waitfor == MNT_LAZY) {
 			mutex_enter(&vp->v_interlock);
 			pn->pn_stat &= ~PNODE_SUSPEND;

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.129.4.10 src/sys/fs/puffs/puffs_vnops.c:1.129.4.11
--- src/sys/fs/puffs/puffs_vnops.c:1.129.4.10	Sat Sep 17 18:53:30 2011
+++ src/sys/fs/puffs/puffs_vnops.c	Wed Nov  2 20:11:12 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.129.4.10 2011/09/17 18:53:30 bouyer Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.129.4.11 2011/11/02 20:11:12 riz Exp $	*/
 
 /*
  * Copyright (c) 2005, 2006, 2007  Antti Kantee.  All Rights Reserved.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.10 2011/09/17 18:53:30 bouyer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.129.4.11 2011/11/02 20:11:12 riz Exp $");
 
 #include <sys/param.h>
 #include <sys/fstrans.h>
@@ -1258,6 +1258,7 @@ puffs_vnop_readdir(void *v)
 
 	/* provide cookies to caller if so desired */
 	if (ap->a_cookies) {
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
 		*ap->a_cookies = malloc(readdir_msg->pvnr_ncookies*CSIZE,
 		    M_TEMP, M_WAITOK);
 		*ap->a_ncookies = readdir_msg->pvnr_ncookies;
@@ -2243,12 +2244,13 @@ puffs_vnop_strategy(void *v)
 	struct buf *bp;
 	size_t argsize;
 	size_t tomove, moved;
-	int error, dofaf, dobiodone;
+	int error, dofaf, cansleep, dobiodone;
 
 	pmp = MPTOPUFFSMP(vp->v_mount);
 	bp = ap->a_bp;
 	error = 0;
 	dofaf = 0;
+	cansleep = 0;
 	pn = VPTOPP(vp);
 	park_rw = NULL; /* explicit */
 	dobiodone = 1;
@@ -2278,16 +2280,14 @@ puffs_vnop_strategy(void *v)
 		mutex_exit(&vp->v_interlock);
 	}
 
-#ifdef DIAGNOSTIC
-		if (curlwp == uvm.pagedaemon_lwp)
-			KASSERT(dofaf || BIOASYNC(bp));
-#endif
+	cansleep = (curlwp == uvm.pagedaemon_lwp || dofaf) ? 0 : 1;
+	KASSERT(curlwp != uvm.pagedaemon_lwp || dofaf || BIOASYNC(bp));
 
 	/* allocate transport structure */
 	tomove = PUFFS_TOMOVE(bp->b_bcount, pmp);
 	argsize = sizeof(struct puffs_vnmsg_rw);
 	error = puffs_msgmem_alloc(argsize + tomove, &park_rw,
-	    (void *)&rw_msg, dofaf ? 0 : 1);
+	    (void *)&rw_msg, cansleep);
 	if (error)
 		goto out;
 	RWARGS(rw_msg, 0, tomove, bp->b_blkno << DEV_BSHIFT, FSCRED);
@@ -2547,6 +2547,7 @@ puffs_vnop_getpages(void *v)
 #ifdef notnowjohn
 		/* allocate worst-case memory */
 		runsizes = ((npages / 2) + 1) * sizeof(struct puffs_cacherun);
+		KASSERT(curlwp != uvm.pagedaemon_lwp || locked);
 		pcinfo = kmem_zalloc(sizeof_puffs_cacheinfo) + runsize,
 		    locked ? KM_NOSLEEP : KM_SLEEP);
 

Reply via email to