Module Name:    src
Committed By:   manu
Date:           Tue Oct 18 15:39:09 UTC 2011

Modified Files:
        src/sys/fs/puffs: puffs_msgif.c puffs_node.c puffs_vfsops.c
            puffs_vnops.c

Log Message:
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.


To generate a diff of this commit:
cvs rdiff -u -r1.87 -r1.88 src/sys/fs/puffs/puffs_msgif.c
cvs rdiff -u -r1.20 -r1.21 src/sys/fs/puffs/puffs_node.c
cvs rdiff -u -r1.98 -r1.99 src/sys/fs/puffs/puffs_vfsops.c
cvs rdiff -u -r1.158 -r1.159 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.87 src/sys/fs/puffs/puffs_msgif.c:1.88
--- src/sys/fs/puffs/puffs_msgif.c:1.87	Sun Jul  3 08:57:43 2011
+++ src/sys/fs/puffs/puffs_msgif.c	Tue Oct 18 15:39:09 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_msgif.c,v 1.87 2011/07/03 08:57:43 mrg Exp $	*/
+/*	$NetBSD: puffs_msgif.c,v 1.88 2011/10/18 15:39:09 manu 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.87 2011/07/03 08:57:43 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_msgif.c,v 1.88 2011/10/18 15:39:09 manu Exp $");
 
 #include <sys/param.h>
 #include <sys/atomic.h>
@@ -44,6 +44,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,10 @@ puffs_msgpark_alloc(int waitok)
 {
 	struct puffs_msgpark *park;
 
+#ifdef DIAGNOSTIC
+	if (curlwp == uvm.pagedaemon_lwp)
+		KASSERT(!waitok);
+#endif
 	park = pool_cache_get(parkpc, waitok ? PR_WAITOK : PR_NOWAIT);
 	if (park == NULL)
 		return park;
@@ -232,6 +238,10 @@ puffs_msgmem_alloc(size_t len, struct pu
 	struct puffs_msgpark *park;
 	void *m;
 
+#ifdef DIAGNOSTIC
+	if (curlwp == uvm.pagedaemon_lwp)
+		KASSERT(!cansleep);
+#endif
 	m = kmem_zalloc(len, cansleep ? KM_SLEEP : KM_NOSLEEP);
 	if (m == NULL) {
 		KASSERT(cansleep == 0);
@@ -950,6 +960,9 @@ puffs_msgif_dispatch(void *this, struct 
 		}
 		pf = (struct puffs_flush *)preq;
 
+#ifdef DIAGNOSTIC
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
+#endif
 		psopr = kmem_alloc(sizeof(*psopr), KM_SLEEP);
 		memcpy(&psopr->psopr_pf, pf, sizeof(*pf));
 		psopr->psopr_sopreq = PUFFS_SOPREQ_FLUSH;
@@ -973,6 +986,9 @@ puffs_msgif_dispatch(void *this, struct 
 
 		DPRINTF(("dispatch: unmount 0x%x\n", preq->preq_optype));
 
+#ifdef DIAGNOSTIC
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
+#endif
 		psopr = kmem_alloc(sizeof(*psopr), KM_SLEEP);
 		psopr->psopr_preq = *preq;
 		psopr->psopr_sopreq = PUFFS_SOPREQ_UNMOUNT;

Index: src/sys/fs/puffs/puffs_node.c
diff -u src/sys/fs/puffs/puffs_node.c:1.20 src/sys/fs/puffs/puffs_node.c:1.21
--- src/sys/fs/puffs/puffs_node.c:1.20	Mon Aug 29 04:12:45 2011
+++ src/sys/fs/puffs/puffs_node.c	Tue Oct 18 15:39:09 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_node.c,v 1.20 2011/08/29 04:12:45 manu Exp $	*/
+/*	$NetBSD: puffs_node.c,v 1.21 2011/10/18 15:39:09 manu 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.20 2011/08/29 04:12:45 manu Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_node.c,v 1.21 2011/10/18 15:39:09 manu 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,10 @@ puffs_newnode(struct mount *mp, struct v
 			return EPROTO;
 		}
 	}
+
+#ifdef DIAGNOSTIC
+	KASSERT(curlwp != uvm.pagedaemon_lwp);
+#endif
 	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.98 src/sys/fs/puffs/puffs_vfsops.c:1.99
--- src/sys/fs/puffs/puffs_vfsops.c:1.98	Fri Oct  7 09:35:05 2011
+++ src/sys/fs/puffs/puffs_vfsops.c	Tue Oct 18 15:39:09 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vfsops.c,v 1.98 2011/10/07 09:35:05 hannken Exp $	*/
+/*	$NetBSD: puffs_vfsops.c,v 1.99 2011/10/18 15:39:09 manu 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.98 2011/10/07 09:35:05 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vfsops.c,v 1.99 2011/10/18 15:39:09 manu Exp $");
 
 #include <sys/param.h>
 #include <sys/mount.h>
@@ -44,6 +44,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>
@@ -233,6 +235,9 @@ 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));
 
+#ifdef DIAGNOSTIC
+	KASSERT(curlwp != uvm.pagedaemon_lwp);
+#endif  
 	pmp = kmem_zalloc(sizeof(struct puffs_mount), KM_SLEEP);
 
 	mp->mnt_fs_bshift = DEV_BSHIFT;
@@ -414,6 +419,9 @@ puffs_vfsop_unmount(struct mount *mp, in
 		 * Release kernel thread now that there is nothing
 		 * it would be wanting to lock.
 		 */
+#ifdef DIAGNOSTIC
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
+#endif  
 		psopr = kmem_alloc(sizeof(*psopr), KM_SLEEP);
 		psopr->psopr_sopreq = PUFFS_SOPREQSYS_EXIT;
 		mutex_enter(&pmp->pmp_sopmtx);

Index: src/sys/fs/puffs/puffs_vnops.c
diff -u src/sys/fs/puffs/puffs_vnops.c:1.158 src/sys/fs/puffs/puffs_vnops.c:1.159
--- src/sys/fs/puffs/puffs_vnops.c:1.158	Mon Oct 17 23:54:01 2011
+++ src/sys/fs/puffs/puffs_vnops.c	Tue Oct 18 15:39:09 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: puffs_vnops.c,v 1.158 2011/10/17 23:54:01 manu Exp $	*/
+/*	$NetBSD: puffs_vnops.c,v 1.159 2011/10/18 15:39:09 manu 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.158 2011/10/17 23:54:01 manu Exp $");
+__KERNEL_RCSID(0, "$NetBSD: puffs_vnops.c,v 1.159 2011/10/18 15:39:09 manu Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -1243,6 +1243,9 @@ puffs_vnop_readdir(void *v)
 
 	/* provide cookies to caller if so desired */
 	if (ap->a_cookies) {
+#ifdef DIAGNOSTIC
+		KASSERT(curlwp != uvm.pagedaemon_lwp);
+#endif
 		*ap->a_cookies = malloc(readdir_msg->pvnr_ncookies*CSIZE,
 		    M_TEMP, M_WAITOK);
 		*ap->a_ncookies = readdir_msg->pvnr_ncookies;
@@ -2217,12 +2220,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;
@@ -2262,6 +2266,8 @@ puffs_vnop_strategy(void *v)
 		mutex_exit(vp->v_interlock);
 	}
 
+	cansleep = (curlwp == uvm.pagedaemon_lwp || dofaf) ? 0 : 1;
+
 #ifdef DIAGNOSTIC
 		if (curlwp == uvm.pagedaemon_lwp)
 			KASSERT(dofaf || BIOASYNC(bp));
@@ -2271,7 +2277,7 @@ puffs_vnop_strategy(void *v)
 	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);
+	    (void *)&rw_msg, cansleep);
 	if (error)
 		goto out;
 	RWARGS(rw_msg, 0, tomove, bp->b_blkno << DEV_BSHIFT, FSCRED);
@@ -2531,6 +2537,10 @@ puffs_vnop_getpages(void *v)
 #ifdef notnowjohn
 		/* allocate worst-case memory */
 		runsizes = ((npages / 2) + 1) * sizeof(struct puffs_cacherun);
+#ifdef DIAGNOSTIC
+		if (curlwp == uvm.pagedaemon_lwp)
+			KASSERT(locked);
+#endif
 		pcinfo = kmem_zalloc(sizeof(struct puffs_cacheinfo) + runsize,
 		    locked ? KM_NOSLEEP : KM_SLEEP);
 

Reply via email to