CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2011-02-11 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Feb 11 09:01:42 UTC 2011

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Clean up debug code.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.64 -r1.36.2.65 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.64 src/sys/miscfs/genfs/genfs_io.c:1.36.2.65
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.64	Sun Nov 21 18:22:32 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Feb 11 09:01:42 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.64 2010/11/21 18:22:32 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.65 2011/02/11 09:01:42 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.64 2010/11/21 18:22:32 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.65 2011/02/11 09:01:42 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -215,17 +215,6 @@
 	 */
 
 	if (flags  PGO_LOCKED) {
-#if 0
-		genfs_getpages_mem();
-	} else {
-		genfs_getpages_io();
-	}
-}
-
-int
-genfs_getpages_mem()
-{
-#endif
 		int nfound;
 		struct vm_page *pg;
 
@@ -274,13 +263,7 @@
 		goto out_err;
 	}
 	mutex_exit(uobj-vmobjlock);
-#if 0
-}
 
-int
-genfs_getpages_io()
-{
-#endif
 	/*
 	 * find the requested pages and make some simple checks.
 	 * leave space in the page array for a whole block.
@@ -325,13 +308,7 @@
 
 	UVMHIST_LOG(ubchist, ridx %d npages %d startoff %ld endoff %ld,
 	ridx, npages, startoffset, endoffset);
-#if 0
-}
 
-int
-genfs_getpages_io_relock()
-{
-#endif
 	if (!has_trans) {
 		fstrans_start(vp-v_mount, FSTRANS_SHARED);
 		has_trans = true;
@@ -360,13 +337,7 @@
 			kmem_free(pgs, pgs_size);
 		goto startover;
 	}
-#if 0
-}
 
-int
-genfs_getpages_io_findpages()
-{
-#endif
 if (!xip) {
 	if (uvn_findpages(uobj, origoffset, npages, pgs[ridx],
 	async ? UFP_NOWAIT : UFP_ALL) != orignmempages) {
@@ -407,18 +378,7 @@
 	 */
 
 	if (overwrite) {
-#if 0
-		genfs_getpages_io_overwrite();
-	} else {
-		genfs_getpages_io_read();
-	}
-}
 
-int
-genfs_getpages_io_overwrite()
-{
-	{
-#endif
 		KASSERT(!xip);
 
 		if (!glocked) {
@@ -434,25 +394,13 @@
 		npages += ridx;
 		goto out;
 	}
-#if 0
-}
 
-int
-genfs_getpages_io_read()
-{
-#endif
 	/*
 	 * the page wasn't resident and we're not overwriting,
 	 * so we're going to have to do some i/o.
 	 * find any additional pages needed to cover the expanded range.
 	 */
-#if 0
-}
 
-int
-genfs_getpages_io_read_allocpages()
-{
-#endif
 if (!xip) {
 	npages = (endoffset - startoffset)  PAGE_SHIFT;
 	if (startoffset != origoffset || npages != orignmempages) {
@@ -483,13 +431,7 @@
 		}
 	}
 }
-#if 0
-}
 
-int
-genfs_getpages_io_read_bio()
-{
-#endif
 	mutex_exit(uobj-vmobjlock);
 
 {
@@ -506,13 +448,7 @@
 	bytes = MIN(totalbytes, MAX(diskeof - startoffset, 0));
 	tailbytes = totalbytes - bytes;
 	skipbytes = 0;
-#if 0
-}
 
-int
-genfs_getpages_io_read_bio_prepare()
-{
-#endif
 if (!xip) {
 	kva = uvm_pagermapin(pgs, npages,
 	UVMPAGER_MAPIN_READ | UVMPAGER_MAPIN_WAITOK);
@@ -534,10 +470,7 @@
 	else
 		BIO_SETPRIO(mbp, BPRIO_TIMECRITICAL);
 }
-#if 0
-}
 
-#endif
 	/*
 	 * if EOF is in the middle of the range, zero the part past EOF.
 	 * skip over pages which are not PG_FAKE since in that case they have
@@ -557,13 +490,7 @@
 		tailstart += len;
 		tailbytes -= len;
 	}
-#if 0
-}
 
-int
-genfs_getpages_io_read_bio_loop()
-{
-#endif
 	/*
 	 * now loop over the pages, reading as needed.
 	 */
@@ -743,12 +670,7 @@
 	}
 
 loopdone:
-#if 0
 
-int
-genfs_getpages_biodone()
-{
-#endif
 if (!xip) {
 	nestiobuf_done(mbp, skipbytes, error);
 	if (async) {
@@ -809,10 +731,7 @@
 
 	putiobuf(mbp);
 }
-#if 0
-}
 
-#endif
 }
 
 	if (!glocked) {
@@ -820,13 +739,7 @@
 	}
 
 	mutex_enter(uobj-vmobjlock);
-#if 0
-}
 
-int
-genfs_getpages_generic_io_done()
-{
-#endif
 	/*
 	 * we're almost done!  release the pages...
 	 * for errors, we free the pages.
@@ -931,10 +844,6 @@
 		orignmempages * sizeof(struct vm_page *));
 		KASSERT(error != 0 || ap-a_m[ap-a_centeridx] != NULL);
 	}
-#if 0
-}
-
-#endif
 
 out_err_free:
 	if (pgs != NULL  pgs != pgs_onstack)



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-21 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Nov 21 14:52:23 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Assert.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.60 -r1.36.2.61 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.60 src/sys/miscfs/genfs/genfs_io.c:1.36.2.61
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.60	Sun Nov 21 12:42:59 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Nov 21 14:52:23 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.60 2010/11/21 12:42:59 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.61 2010/11/21 14:52:23 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.60 2010/11/21 12:42:59 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.61 2010/11/21 14:52:23 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -1050,6 +1050,7 @@
 	flags = origflags;
 	KASSERT((vp-v_iflag  VI_ONWORKLST) != 0 ||
 	(vp-v_iflag  VI_WRMAPDIRTY) == 0);
+	KASSERT((vp-v_vflag  VV_XIP) == 0 || uobj-uo_npages == 0);
 	if (uobj-uo_npages == 0) {
 		if (vp-v_iflag  VI_ONWORKLST) {
 			vp-v_iflag = ~VI_WRMAPDIRTY;



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-21 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Nov 21 17:07:38 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Put back XIP putpages, but slightly modifed to be called from the
generic putpages, and to call pgo_get() than a specific function.
Without this, UVM went mad after unmount (vinval, etc.).


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.62 -r1.36.2.63 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.62 src/sys/miscfs/genfs/genfs_io.c:1.36.2.63
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.62	Sun Nov 21 15:00:12 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Nov 21 17:07:38 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.62 2010/11/21 15:00:12 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.63 2010/11/21 17:07:38 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.62 2010/11/21 15:00:12 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.63 2010/11/21 17:07:38 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -993,6 +993,12 @@
  *	range by an estimate of the relatively higher cost of the hash lookup.
  */
 
+#ifdef XIP
+static int
+genfs_do_putpages_xip_free(struct vnode *vp, off_t startoff, off_t endoff,
+int origflags);
+#endif
+
 int
 genfs_putpages(void *v)
 {
@@ -1062,6 +1068,15 @@
 WAPBL_END(vp-v_mount);
 			fstrans_done(vp-v_mount);
 		}
+#ifdef XIP
+		if ((vp-v_vflag  VV_XIP) != 0) {
+			if (flags  PGO_FREE) {
+error = genfs_do_putpages_xip_free(vp,
+startoff, endoff, origflags);
+KASSERT(error == 0);
+			}
+		}
+#endif
 		mutex_exit(slock);
 		return (0);
 	}
@@ -1469,6 +1484,83 @@
 	return (error);
 }
 
+#ifdef XIP
+static int
+genfs_do_putpages_xip_free(struct vnode *vp, off_t startoff, off_t endoff,
+int origflags)
+{
+	struct uvm_object * const uobj = vp-v_uobj;
+ 
+	KASSERT(uobj-uo_npages == 0);
+
+	/*
+	 * For PGO_FREE (or (PGO_CLEANIT | PGO_FREE)), we invalidate MMU
+	 * mappings of both XIP pages and XIP zero pages.
+	 *
+	 * Hole page is freed when one of its mapped offset is freed, even if
+	 * one file (vnode) has many holes and mapping its zero page to all
+	 * of those hole pages.
+	 *
+	 * We don't know which pages are currently mapped in the given vnode,
+	 * because XIP pages are not added to vnode.  What we can do is to
+	 * locate pages by querying the filesystem as done in getpages.  Call
+	 * genfs_do_getpages_xip_io().
+	 */
+ 
+	off_t off, eof;
+ 
+	off = trunc_page(startoff);
+	if (endoff == 0 || (origflags  PGO_ALLPAGES))
+		GOP_SIZE(vp, vp-v_size, eof, GOP_SIZE_MEM);
+	else
+		eof = endoff;
+ 
+	while (off  eof) {
+		int npages, orignpages, error, i;
+		struct vm_page *pgs[maxpages], *pg;
+ 
+		npages = round_page(eof - off)  PAGE_SHIFT;
+		if (npages  maxpages)
+			npages = maxpages;
+ 
+		orignpages = npages;
+		KASSERT(mutex_owned(uobj-vmobjlock));
+		error = (*uobj-pgops-pgo_get)(uobj, off, pgs, npages, 0,
+		VM_PROT_ALL, 0, PGO_SYNCIO);
+		KASSERT(error == 0);
+		KASSERT(npages == orignpages);
+		mutex_enter(uobj-vmobjlock);
+		for (i = 0; i  npages; i++) {
+			pg = pgs[i];
+			if (pg == NULL || pg == PGO_DONTCARE)
+continue;
+			if (pg == PGO_HOLE) {
+pg = uvm_page_holepage;
+KASSERT(pg != NULL);
+/*
+ * XXXUEBS
+ * Invalidating hole pages may be unnecessary,
+ * but just for safety.
+ */
+			} else {
+/*
+ * Freeing normal XIP pages; nothing to do.
+ */
+KASSERT((pg-flags  PG_RDONLY) != 0);
+KASSERT((pg-flags  PG_CLEAN) != 0);
+KASSERT((pg-flags  PG_FAKE) == 0);
+KASSERT((pg-flags  PG_DEVICE) != 0);
+pg-flags = ~PG_BUSY;
+			}
+			pmap_page_protect(pg, VM_PROT_NONE);
+		}
+		off += npages  PAGE_SHIFT;
+	}
+
+	return 0;
+}
+#endif
+
 int
 genfs_gop_write(struct vnode *vp, struct vm_page **pgs, int npages, int flags)
 {



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-21 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Nov 21 18:22:33 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Clarify things a bit in XIP putpages.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.63 -r1.36.2.64 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.63 src/sys/miscfs/genfs/genfs_io.c:1.36.2.64
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.63	Sun Nov 21 17:07:38 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Nov 21 18:22:32 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.63 2010/11/21 17:07:38 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.64 2010/11/21 18:22:32 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.63 2010/11/21 17:07:38 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.64 2010/11/21 18:22:32 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -1532,16 +1532,10 @@
 		mutex_enter(uobj-vmobjlock);
 		for (i = 0; i  npages; i++) {
 			pg = pgs[i];
-			if (pg == NULL || pg == PGO_DONTCARE)
-continue;
+			KASSERT(pg != NULL  pg != PGO_DONTCARE);
 			if (pg == PGO_HOLE) {
 pg = uvm_page_holepage;
 KASSERT(pg != NULL);
-/*
- * XXXUEBS
- * Invalidating hole pages may be unnecessary,
- * but just for safety.
- */
 			} else {
 /*
  * Freeing normal XIP pages; nothing to do.



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-20 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sat Nov 20 08:03:22 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
genfs_do_getpages_xip_io_done: Adjust page condition checks:
- Expect uvn_findpage_xip() returns busy pages.
- Device pages are always initialized (== !uninitialized == !fake).


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.51 -r1.36.2.52 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.51 src/sys/miscfs/genfs/genfs_io.c:1.36.2.52
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.51	Sat Nov 20 07:47:34 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sat Nov 20 08:03:22 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.51 2010/11/20 07:47:34 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.52 2010/11/20 08:03:22 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.51 2010/11/20 07:47:34 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.52 2010/11/20 08:03:22 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -1112,11 +1112,10 @@
 		struct vm_page *pg = pps[i];
 
 		KASSERT((pg-flags  PG_RDONLY) != 0);
-		KASSERT((pg-flags  PG_BUSY) == 0);
+		KASSERT((pg-flags  PG_BUSY) != 0);
 		KASSERT((pg-flags  PG_CLEAN) != 0);
 		KASSERT((pg-flags  PG_DEVICE) != 0);
-		pg-flags |= PG_BUSY;
-		pg-flags = ~PG_FAKE;
+		KASSERT((pg-flags  PG_FAKE) == 0);
 		pg-uobject = vp-v_uobj;
 	}
 



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-20 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Nov 21 04:35:53 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Adjust merged XIP getpages page slot offset calculation again so
it really works.  Sprinkle a few assertions and UVMHISTs.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.52 -r1.36.2.53 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.52 src/sys/miscfs/genfs/genfs_io.c:1.36.2.53
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.52	Sat Nov 20 08:03:22 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Nov 21 04:35:53 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.52 2010/11/20 08:03:22 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.53 2010/11/21 04:35:53 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.52 2010/11/20 08:03:22 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.53 2010/11/21 04:35:53 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -572,23 +572,6 @@
 		tailstart += len;
 		tailbytes -= len;
 	}
-
-#if 1
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
-		error = genfs_do_getpages_xip_io(
-			ap-a_vp,
-			ap-a_offset,
-			pgs,
-			ap-a_count,
-			ap-a_centeridx,
-			ap-a_access_type,
-			ap-a_advice,
-			ap-a_flags,
-			orignmempages);
-if (0)
-		goto loopdone;
-	}
-#endif
 #if 0
 }
 
@@ -760,14 +743,17 @@
 		 * - Unallocated block is redirected to the dedicated zero'ed
 		 *   page.
 		 */
-		const int npgs = MIN(
-			iobytes  PAGE_SHIFT,
-			((1 + run)  fs_bshift)  PAGE_SHIFT);
 		const daddr_t blk_off = blkno  dev_bshift;
 		const daddr_t fs_off = origoffset - startoffset;
 
-		for (i = ridx + pidx; i  npgs; i++) {
-			const daddr_t pg_off = pidx  PAGE_SHIFT;
+		int npgs = iobytes  PAGE_SHIFT;
+		UVMHIST_LOG(ubchist,
+		xip iobytes=0x%lx ridx=%d pidx=%d npgs=%d,
+		(long)iobytes, ridx, pidx, npgs);
+
+		/* XXX optimize */
+		for (i = 0; i  npgs; i++) {
+			const daddr_t pg_off = i  PAGE_SHIFT;
 			struct vm_page *pg;
 
 			UVMHIST_LOG(ubchist,
@@ -778,12 +764,9 @@
 			blk_off + fs_off + pg_off);
 			KASSERT(pg != NULL);
 			UVMHIST_LOG(ubchist,
-xip pgs %d = phys_addr=0x%lx (%p),
-i,
-(long)pg-phys_addr,
-pg,
-0);
-			pgs[i] = pg;
+			xip pg %d = phys_addr=0x%lx (%p),
+			ridx + pidx + i, (long)pg-phys_addr, pg, 0);
+			pgs[ridx + pidx + i] = pg;
 		}
 	}
 #endif
@@ -978,6 +961,7 @@
 	if (ap-a_m != NULL) {
 		memcpy(ap-a_m, pgs[ridx],
 		orignmempages * sizeof(struct vm_page *));
+		KASSERT(error != 0 || ap-a_m[ap-a_centeridx] != NULL);
 	}
 #if 0
 }
@@ -1029,11 +1013,12 @@
 	const off_t endoffset = round_blk(origoffset + PAGE_SIZE * orignmempages);
 #endif
 
-	UVMHIST_LOG(ubchist, xip npages=%d startoffset=%lx endoffset=%lx,
-	orignmempages, (long)startoffset, (long)endoffset, 0);
-
 	const int ridx = (origoffset - startoffset)  PAGE_SHIFT;
 
+	UVMHIST_LOG(ubchist,
+	ridx=%d xip npages=%d startoff=0x%lx endoff=0x%lx,
+	ridx, orignmempages, (long)startoffset, (long)endoffset);
+
 	off = origoffset;
 	for (i = ridx; i  ridx + orignmempages; i++) {
 		daddr_t blkno;
@@ -1042,7 +1027,7 @@
 
 		KASSERT((off - origoffset)  PAGE_SHIFT == i - ridx);
 
-		const daddr_t lbn = (off  ~(fs_bsize - 1))  fs_bshift;
+		const daddr_t lbn = trunc_blk(off)  fs_bshift;
 
 		error = VOP_BMAP(vp, lbn, devvp, blkno, run);
 		KASSERT(error == 0);
@@ -1064,21 +1049,21 @@
 
 			const daddr_t pg_off = (i - ridx)  PAGE_SHIFT;
 
+			struct vm_page *pg;
+
 			UVMHIST_LOG(ubchist,
 			xip blk_off=%lx fs_off=%lx pg_off=%lx,
 			(long)blk_off, (long)fs_off, (long)pg_off, 0);
 
-			pps[i] = uvn_findpage_xip(devvp, vp-v_uobj,
+			pg = uvn_findpage_xip(devvp, vp-v_uobj,
 			blk_off + fs_off + pg_off);
-			KASSERT(pps[i] != NULL);
+			KASSERT(pg != NULL);
+			UVMHIST_LOG(ubchist,
+			xip pgs %d = phys_addr=0x%lx (%p),
+			i, (long)pg-phys_addr, pg, 0);
+			pps[i] = pg;
 		}
 
-		UVMHIST_LOG(ubchist, xip pgs %d = phys_addr=0x%lx (%p),
-			i,
-			(long)pps[i]-phys_addr,
-			pps[i],
-			0);
-
 		off += PAGE_SIZE;
 	}
 
@@ -,6 +1096,7 @@
 	for (i = ridx; i  ridx + orignmempages; i++) {
 		struct vm_page *pg = pps[i];
 
+		KASSERT(pg != NULL);
 		KASSERT((pg-flags  PG_RDONLY) != 0);
 		KASSERT((pg-flags  PG_BUSY) != 0);
 		KASSERT((pg-flags  PG_CLEAN) != 0);



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-20 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Nov 21 04:43:32 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Clean up ifdefs.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.53 -r1.36.2.54 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.53 src/sys/miscfs/genfs/genfs_io.c:1.36.2.54
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.53	Sun Nov 21 04:35:53 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Nov 21 04:43:32 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.53 2010/11/21 04:35:53 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.54 2010/11/21 04:43:32 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.53 2010/11/21 04:35:53 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.54 2010/11/21 04:43:32 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -144,6 +144,11 @@
 	const bool overwrite = (flags  PGO_OVERWRITE) != 0;
 	const bool blockalloc = memwrite  (flags  PGO_NOBLOCKALLOC) == 0;
 	const bool glocked = (flags  PGO_GLOCKHELD) != 0;
+#ifdef XIP
+	const bool xip = (ap-a_vp-v_vflag  VV_XIP) != 0;
+#else
+#define	xip	0
+#endif
 	UVMHIST_FUNC(genfs_getpages); UVMHIST_CALLED(ubchist);
 
 	UVMHIST_LOG(ubchist, vp %p off 0x%x/%x count %d,
@@ -233,12 +238,10 @@
 		int nfound;
 		struct vm_page *pg;
 
-#ifdef XIP
-		if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
+		if (xip) {
 			*ap-a_count = 0;
 			return 0;
 		}
-#endif
 
 		KASSERT(!glocked);
 		npages = *ap-a_count;
@@ -373,10 +376,8 @@
 genfs_getpages_io_findpages()
 {
 #endif
-#ifdef XIP
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
+	if (xip)
 		goto genfs_getpages_io_read_allocpages_done;
-#endif
 
 	if (uvn_findpages(uobj, origoffset, npages, pgs[ridx],
 	async ? UFP_NOWAIT : UFP_ALL) != orignmempages) {
@@ -515,10 +516,8 @@
 	tailbytes = totalbytes - bytes;
 	skipbytes = 0;
 
-#if 1
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
+	if (xip)
 		goto genfs_getpages_bio_prepare_done;
-#endif
 #if 0
 }
 
@@ -598,9 +597,7 @@
 		 */
 
 		pidx = (offset - startoffset)  PAGE_SHIFT;
-#ifdef XIP
-	if ((ap-a_vp-v_vflag  VV_XIP) == 0) {
-#endif
+	if (!xip) {
 		while ((pgs[pidx]-flags  PG_FAKE) == 0) {
 			size_t b;
 
@@ -619,9 +616,7 @@
 goto loopdone;
 			}
 		}
-#ifdef XIP
 	}
-#endif
 
 		/*
 		 * bmap the file to find out the blkno to read from and
@@ -652,16 +647,12 @@
 
 			pcount = 1;
 			while ((pidx + pcount  npages)  (
-#ifdef XIP
 			/*
 			 * in XIP case, we don't know what page to read
 			 * at this point!
 			 */
-			((ap-a_vp-v_vflag  VV_XIP) != 0) ||
-#else
-			 0 ||
-#endif
-			 (pgs[pidx + pcount]-flags  PG_FAKE))) {
+			xip ||
+			(pgs[pidx + pcount]-flags  PG_FAKE))) {
 pcount++;
 			}
 			iobytes = MIN(iobytes, (pcount  PAGE_SHIFT) -
@@ -675,14 +666,12 @@
 		 */
 
 		if (blkno == (daddr_t)-1) {
-#ifdef XIP
-		if ((ap-a_vp-v_vflag  VV_XIP) == 0) {
-#endif
+		if (!xip) {
 			int holepages = (round_page(offset + iobytes) -
 			trunc_page(offset))  PAGE_SHIFT;
 			UVMHIST_LOG(ubchist, lbn 0x%x - HOLE, lbn,0,0,0);
 
-			KASSERT((ap-a_vp-v_vflag  VV_XIP) == 0);
+			KASSERT(!xip);
 
 			sawhole = true;
 			memset((char *)kva + (offset - startoffset), 0,
@@ -697,25 +686,19 @@
 	pgs[pidx + i]-flags |= PG_RDONLY;
 }
 			}
-#ifdef XIP
 		} else {
 			panic(XIP hole page is not supported yet);
 		}
-#endif
 			continue;
 		}
 
-#ifdef XIP
-	if ((ap-a_vp-v_vflag  VV_XIP) == 0) {
-#endif
+	if (!xip) {
 		/*
 		 * allocate a sub-buf for this piece of the i/o
 		 * (or just use mbp if there's only 1 piece),
 		 * and start it going.
 		 */
 
-		KASSERT((ap-a_vp-v_vflag  VV_XIP) == 0);
-
 		if (offset == startoffset  iobytes == bytes) {
 			bp = mbp;
 		} else {
@@ -773,11 +756,9 @@
 	}
 
 loopdone:
-#if 1
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
+	if (xip) {
 		goto genfs_getpages_biodone_done;
 	}
-#endif
 #if 0
 
 int
@@ -856,8 +837,7 @@
 		genfs_node_unlock(vp);
 	}
 
-#if 1
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
+	if (xip) {
 		error = genfs_do_getpages_xip_io_done(
 			ap-a_vp,
 			ap-a_offset,
@@ -870,7 +850,6 @@
 			orignmempages);
 		goto genfs_getpages_generic_io_done_done;
 	}
-#endif
 #if 0
 	else {
 		error = genfs_getpages_generic_io_done();



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-20 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Nov 21 04:56:36 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Kill one more goto.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.55 -r1.36.2.56 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.55 src/sys/miscfs/genfs/genfs_io.c:1.36.2.56
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.55	Sun Nov 21 04:50:27 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Nov 21 04:56:36 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.55 2010/11/21 04:50:27 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.56 2010/11/21 04:56:36 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.55 2010/11/21 04:50:27 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.56 2010/11/21 04:56:36 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -827,7 +827,7 @@
 		genfs_node_unlock(vp);
 	}
 
-	if (xip) {
+if (xip) {
 		error = genfs_do_getpages_xip_io_done(
 			ap-a_vp,
 			ap-a_offset,
@@ -838,12 +838,8 @@
 			ap-a_advice,
 			ap-a_flags,
 			orignmempages);
-		goto genfs_getpages_generic_io_done_done;
-	}
+} else {
 #if 0
-	else {
-		error = genfs_getpages_generic_io_done();
-	}
 }
 
 int
@@ -922,11 +918,8 @@
 		genfs_markdirty(vp);
 	}
 	mutex_exit(uobj-vmobjlock);
+} /* !xip */
 
-#if 1
-genfs_getpages_generic_io_done_done:
-	{}
-#endif
 	if (ap-a_m != NULL) {
 		memcpy(ap-a_m, pgs[ridx],
 		orignmempages * sizeof(struct vm_page *));



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-20 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Nov 21 05:19:56 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Merge getpages finalization code.

In XIP case, there's nothing to do because MMIO device pages are
staleless, unlike page caches used as I/O buffers.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.56 -r1.36.2.57 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.56 src/sys/miscfs/genfs/genfs_io.c:1.36.2.57
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.56	Sun Nov 21 04:56:36 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Nov 21 05:19:56 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.56 2010/11/21 04:56:36 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.57 2010/11/21 05:19:56 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.56 2010/11/21 04:56:36 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.57 2010/11/21 05:19:56 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -62,8 +62,6 @@
 #ifdef XIP
 static int genfs_do_getpages_xip_io(struct vnode *, voff_t, struct vm_page **,
 int *, int, vm_prot_t, int, int, const int);
-static int genfs_do_getpages_xip_io_done(struct vnode *, voff_t, struct vm_page **,
-int *, int, vm_prot_t, int, int, const int);
 static int genfs_do_putpages_xip(struct vnode *, off_t, off_t, int,
 struct vm_page **);
 #endif
@@ -827,18 +825,7 @@
 		genfs_node_unlock(vp);
 	}
 
-if (xip) {
-		error = genfs_do_getpages_xip_io_done(
-			ap-a_vp,
-			ap-a_offset,
-			pgs,
-			ap-a_count,
-			ap-a_centeridx,
-			ap-a_access_type,
-			ap-a_advice,
-			ap-a_flags,
-			orignmempages);
-} else {
+	mutex_enter(uobj-vmobjlock);
 #if 0
 }
 
@@ -846,9 +833,6 @@
 genfs_getpages_generic_io_done()
 {
 #endif
-
-	mutex_enter(uobj-vmobjlock);
-
 	/*
 	 * we're almost done!  release the pages...
 	 * for errors, we free the pages.
@@ -880,6 +864,8 @@
 out:
 	UVMHIST_LOG(ubchist, succeeding, npages %d, npages,0,0,0);
 	error = 0;
+
+if (!xip) {
 	mutex_enter(uvm_pageqlock);
 	for (i = 0; i  npages; i++) {
 		struct vm_page *pg = pgs[i];
@@ -917,8 +903,28 @@
 	if (memwrite) {
 		genfs_markdirty(vp);
 	}
+} else {
+	KASSERT(npages == orignmempages);
+	for (i = ridx; i  ridx + npages; i++) {
+		struct vm_page *pg = pgs[i];
+
+		KASSERT(pg != NULL);
+		KASSERT((pg-flags  PG_RDONLY) != 0);
+		KASSERT((pg-flags  PG_BUSY) != 0);
+		KASSERT((pg-flags  PG_CLEAN) != 0);
+		KASSERT((pg-flags  PG_DEVICE) != 0);
+		KASSERT((pg-flags  PG_FAKE) == 0);
+
+		/*
+		 * XXXUEBS
+		 * Actually this is not necessary, because device pages are
+		 * stateless, and they have no owner.
+		 */
+		pg-uobject = vp-v_uobj;
+	}
+} /* xip */
+
 	mutex_exit(uobj-vmobjlock);
-} /* !xip */
 
 	if (ap-a_m != NULL) {
 		memcpy(ap-a_m, pgs[ridx],
@@ -1031,48 +1037,6 @@
 
 	return 0;
 }
-
-int
-genfs_do_getpages_xip_io_done(
-	struct vnode *vp,
-	voff_t origoffset,
-	struct vm_page **pps,
-	int *npagesp,
-	int centeridx,
-	vm_prot_t access_type,
-	int advice,
-	int flags,
-	const int orignmempages)
-{
-	struct uvm_object * const uobj = vp-v_uobj;
-	int i;
-
-	const int fs_bshift = vp2fs_bshift(vp);
-	const int fs_bsize = 1  fs_bshift;
-
-	const off_t startoffset = trunc_blk(origoffset);
-	const int ridx = (origoffset - startoffset)  PAGE_SHIFT;
-
-	mutex_enter(uobj-vmobjlock);
-
-	for (i = ridx; i  ridx + orignmempages; i++) {
-		struct vm_page *pg = pps[i];
-
-		KASSERT(pg != NULL);
-		KASSERT((pg-flags  PG_RDONLY) != 0);
-		KASSERT((pg-flags  PG_BUSY) != 0);
-		KASSERT((pg-flags  PG_CLEAN) != 0);
-		KASSERT((pg-flags  PG_DEVICE) != 0);
-		KASSERT((pg-flags  PG_FAKE) == 0);
-		pg-uobject = vp-v_uobj;
-	}
-
-	mutex_exit(uobj-vmobjlock);
-
-	*npagesp = orignmempages;
-
-	return 0;
-}
 #endif
 
 /*



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-20 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Nov 21 06:46:15 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Clean up, reduce diff from trunk.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.57 -r1.36.2.58 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.57 src/sys/miscfs/genfs/genfs_io.c:1.36.2.58
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.57	Sun Nov 21 05:19:56 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Nov 21 06:46:15 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.57 2010/11/21 05:19:56 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.58 2010/11/21 06:46:15 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.57 2010/11/21 05:19:56 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.58 2010/11/21 06:46:15 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -50,7 +50,6 @@
 #include sys/kauth.h
 #include sys/fstrans.h
 #include sys/buf.h
-#include sys/once.h
 
 #include miscfs/genfs/genfs.h
 #include miscfs/genfs/genfs_node.h
@@ -711,9 +710,8 @@
 		bp, offset, bp-b_bcount, bp-b_blkno);
 
 		VOP_STRATEGY(devvp, bp);
-	}
+	} else {
 #ifdef XIP
-	else {
 		/*
 		 * XIP page metadata assignment
 		 * - Unallocated block is redirected to the dedicated zero'ed
@@ -744,8 +742,8 @@
 			ridx + pidx + i, (long)pg-phys_addr, pg, 0);
 			pgs[ridx + pidx + i] = pg;
 		}
-	}
 #endif
+	}
 	}
 
 loopdone:
@@ -899,7 +897,6 @@
 		}
 	}
 	mutex_exit(uvm_pageqlock);
-
 	if (memwrite) {
 		genfs_markdirty(vp);
 	}
@@ -923,9 +920,7 @@
 		pg-uobject = vp-v_uobj;
 	}
 } /* xip */
-
 	mutex_exit(uobj-vmobjlock);
-
 	if (ap-a_m != NULL) {
 		memcpy(ap-a_m, pgs[ridx],
 		orignmempages * sizeof(struct vm_page *));



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-20 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Nov 21 07:41:49 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Revert XIP putpages totally.

XIP'ed uobj owns no pages; uvm_object::uo_npages is always 0,
nothing happens.

Upper layer is responsible to unmap pmap-level mappings.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.58 -r1.36.2.59 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.58 src/sys/miscfs/genfs/genfs_io.c:1.36.2.59
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.58	Sun Nov 21 06:46:15 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Nov 21 07:41:49 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.58 2010/11/21 06:46:15 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.59 2010/11/21 07:41:49 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.58 2010/11/21 06:46:15 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.59 2010/11/21 07:41:49 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -58,12 +58,6 @@
 #include uvm/uvm.h
 #include uvm/uvm_pager.h
 
-#ifdef XIP
-static int genfs_do_getpages_xip_io(struct vnode *, voff_t, struct vm_page **,
-int *, int, vm_prot_t, int, int, const int);
-static int genfs_do_putpages_xip(struct vnode *, off_t, off_t, int,
-struct vm_page **);
-#endif
 static int genfs_do_directio(struct vmspace *, vaddr_t, size_t, struct vnode *,
 off_t, enum uio_rw);
 static void genfs_dio_iodone(struct buf *);
@@ -940,100 +934,6 @@
 	return error;
 }
 
-#ifdef XIP
-/*
- * genfs_do_getpages_xip_io
- *  Return direct pages of XIP vnode.  The block addresses of XIP
- *  vnode pages are returned back to the VM fault handler as the
- *	actually mapped physical addresses.
- */
-static int
-genfs_do_getpages_xip_io(
-	struct vnode *vp,
-	voff_t origoffset,
-	struct vm_page **pps,
-	int *npagesp,
-	int centeridx,
-	vm_prot_t access_type,
-	int advice,
-	int flags,
-	const int orignmempages)
-{
-	const int fs_bshift = vp2fs_bshift(vp);
-	const int dev_bshift = vp2dev_bshift(vp);
-	const int fs_bsize = 1  fs_bshift;
-
-	int error;
-	off_t off;
-	int i;
-
-	UVMHIST_FUNC(genfs_do_getpages_xip_io); UVMHIST_CALLED(ubchist);
-
-	KASSERT(((flags  PGO_GLOCKHELD) != 0) || genfs_node_rdlocked(vp));
-
-#ifdef UVMHIST
-	const off_t startoffset = trunc_blk(origoffset);
-	const off_t endoffset = round_blk(origoffset + PAGE_SIZE * orignmempages);
-#endif
-
-	const int ridx = (origoffset - startoffset)  PAGE_SHIFT;
-
-	UVMHIST_LOG(ubchist,
-	ridx=%d xip npages=%d startoff=0x%lx endoff=0x%lx,
-	ridx, orignmempages, (long)startoffset, (long)endoffset);
-
-	off = origoffset;
-	for (i = ridx; i  ridx + orignmempages; i++) {
-		daddr_t blkno;
-		int run;
-		struct vnode *devvp;
-
-		KASSERT((off - origoffset)  PAGE_SHIFT == i - ridx);
-
-		const daddr_t lbn = trunc_blk(off)  fs_bshift;
-
-		error = VOP_BMAP(vp, lbn, devvp, blkno, run);
-		KASSERT(error == 0);
-		UVMHIST_LOG(ubchist, xip VOP_BMAP: lbn=%ld blkno=%ld run=%d,
-		(long)lbn, (long)blkno, run, 0);
-
-		const daddr_t blk_off = blkno  dev_bshift;
-		const daddr_t fs_off = origoffset - (lbn  fs_bshift);
-
-		/*
-		 * XIP page metadata assignment
-		 * - Unallocated block is redirected to the dedicated zero'ed
-		 *   page.
-		 */
-		if (blkno  0) {
-			panic(XIP hole is not supported yet!);
-		} else {
-			KASSERT(off - origoffset == (i - ridx)  PAGE_SHIFT);
-
-			const daddr_t pg_off = (i - ridx)  PAGE_SHIFT;
-
-			struct vm_page *pg;
-
-			UVMHIST_LOG(ubchist,
-			xip blk_off=%lx fs_off=%lx pg_off=%lx,
-			(long)blk_off, (long)fs_off, (long)pg_off, 0);
-
-			pg = uvn_findpage_xip(devvp, vp-v_uobj,
-			blk_off + fs_off + pg_off);
-			KASSERT(pg != NULL);
-			UVMHIST_LOG(ubchist,
-			xip pgs %d = phys_addr=0x%lx (%p),
-			i, (long)pg-phys_addr, pg, 0);
-			pps[i] = pg;
-		}
-
-		off += PAGE_SIZE;
-	}
-
-	return 0;
-}
-#endif
-
 /*
  * generic VM putpages routine.
  * Write the given range of pages to backing store.
@@ -1092,12 +992,6 @@
 		int a_flags;
 	} */ * const ap = v;
 
-#ifdef XIP
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
-		return genfs_do_putpages_xip(ap-a_vp, ap-a_offlo, ap-a_offhi,
-		ap-a_flags, NULL);
-	else
-#endif
 	return genfs_do_putpages(ap-a_vp, ap-a_offlo, ap-a_offhi,
 	ap-a_flags, NULL);
 }
@@ -1563,98 +1457,6 @@
 	return (error);
 }
 
-#ifdef XIP
-int
-genfs_do_putpages_xip(struct vnode *vp, off_t startoff, off_t endoff,
-int flags, struct vm_page **busypg)
-{
-	struct uvm_object *uobj = vp-v_uobj;
-#ifdef DIAGNOSTIC
-	struct genfs_node * const gp = VTOG(vp);
-#endif
-
-	UVMHIST_FUNC(genfs_do_putpages_xip); UVMHIST_CALLED(ubchist);
-
-	KASSERT(mutex_owned(uobj-vmobjlock));
-	

CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-19 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 08:11:04 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
More adjustment.

Reorder
genfs_node_unlock() - putiobuf()
to
putiobuf() - genfs_node_unlock()
but I don't think there's any constraint between these two.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.43 -r1.36.2.44 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.43 src/sys/miscfs/genfs/genfs_io.c:1.36.2.44
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.43	Fri Nov 19 07:09:49 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 08:11:04 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.43 2010/11/19 07:09:49 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.44 2010/11/19 08:11:04 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.43 2010/11/19 07:09:49 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.44 2010/11/19 08:11:04 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -62,6 +62,8 @@
 #ifdef XIP
 static int genfs_do_getpages_xip_io(struct vnode *, voff_t, struct vm_page **,
 int *, int, vm_prot_t, int, int, const int);
+static int genfs_do_getpages_xip_io_done(struct vnode *, voff_t, struct vm_page **,
+int *, int, vm_prot_t, int, int, const int);
 static int genfs_do_putpages_xip(struct vnode *, off_t, off_t, int,
 struct vm_page **);
 #endif
@@ -475,26 +477,10 @@
 
 	mutex_exit(uobj-vmobjlock);
 
-#if 1
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
-		error = genfs_do_getpages_xip_io(
-			ap-a_vp,
-			ap-a_offset,
-			ap-a_m,
-			ap-a_count,
-			ap-a_centeridx,
-			ap-a_access_type,
-			ap-a_advice,
-			ap-a_flags,
-			orignmempages);
-		goto out_err_free;
-	}
-#endif
-
 {
 	size_t bytes, iobytes, tailstart, tailbytes, totalbytes, skipbytes;
-	vaddr_t kva;
-	struct buf *bp, *mbp;
+	vaddr_t kva = 0;
+	struct buf *bp = NULL, *mbp = NULL;
 	bool sawhole = false;
 
 	/*
@@ -506,6 +492,11 @@
 	tailbytes = totalbytes - bytes;
 	skipbytes = 0;
 
+#if 1
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
+		goto genfs_getpages_bio_prepare_done;
+#endif
+
 	kva = uvm_pagermapin(pgs, npages,
 	UVMPAGER_MAPIN_READ | UVMPAGER_MAPIN_WAITOK);
 
@@ -526,6 +517,10 @@
 	else
 		BIO_SETPRIO(mbp, BPRIO_TIMECRITICAL);
 
+#if 1
+genfs_getpages_bio_prepare_done:
+#endif
+
 	/*
 	 * if EOF is in the middle of the range, zero the part past EOF.
 	 * skip over pages which are not PG_FAKE since in that case they have
@@ -546,6 +541,22 @@
 		tailbytes -= len;
 	}
 
+#if 1
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
+		error = genfs_do_getpages_xip_io(
+			ap-a_vp,
+			ap-a_offset,
+			ap-a_m,
+			ap-a_count,
+			ap-a_centeridx,
+			ap-a_access_type,
+			ap-a_advice,
+			ap-a_flags,
+			orignmempages);
+		goto loopdone;
+	}
+#endif
+
 	/*
 	 * now loop over the pages, reading as needed.
 	 */
@@ -675,6 +686,16 @@
 	}
 
 loopdone:
+#if 1
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
+		goto genfs_getpages_biodone_done;
+#endif
+#if 0
+
+int
+genfs_getpages_biodone()
+{
+#endif
 	nestiobuf_done(mbp, skipbytes, error);
 	if (async) {
 		UVMHIST_LOG(ubchist, returning 0 (async),0,0,0,0);
@@ -731,12 +752,47 @@
 			}
 		}
 	}
+
+	putiobuf(mbp);
+#if 0
+}
+
+#endif
+#if 1
+genfs_getpages_biodone_done:
+	{}
+#endif
+}
+
 	if (!glocked) {
 		genfs_node_unlock(vp);
 	}
 
-	putiobuf(mbp);
-}
+#if 1
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
+		error = genfs_do_getpages_xip_io_done(
+			ap-a_vp,
+			ap-a_offset,
+			ap-a_m,
+			ap-a_count,
+			ap-a_centeridx,
+			ap-a_access_type,
+			ap-a_advice,
+			ap-a_flags,
+			orignmempages);
+		goto genfs_getpages_generic_io_done_done;
+	}
+#endif
+#if 0
+	else {
+		error = genfs_getpages_generic_io_done();
+	}
+}
+
+int
+genfs_getpages_generic_io_done()
+{
+#endif
 
 	mutex_enter(uobj-vmobjlock);
 
@@ -804,6 +860,7 @@
 		}
 	}
 	mutex_exit(uvm_pageqlock);
+
 	if (memwrite) {
 		genfs_markdirty(vp);
 	}
@@ -812,6 +869,14 @@
 		memcpy(ap-a_m, pgs[ridx],
 		orignmempages * sizeof(struct vm_page *));
 	}
+#if 0
+}
+
+#endif
+#if 1
+genfs_getpages_generic_io_done_done:
+	{}
+#endif
 
 out_err_free:
 	if (pgs != NULL  pgs != pgs_onstack)
@@ -841,9 +906,6 @@
 	int flags,
 	const int orignmempages)
 {
-	struct uvm_object * const uobj = vp-v_uobj;
-	const bool glocked = (flags  PGO_GLOCKHELD) != 0;
-
 	const int fs_bshift = vp2fs_bshift(vp);
 	const int dev_bshift = vp2dev_bshift(vp);
 	const int fs_bsize = 1  fs_bshift;
@@ -872,7 +934,7 @@
 
 	UVMHIST_FUNC(genfs_do_getpages_xip_io); UVMHIST_CALLED(ubchist);
 
-	KASSERT(glocked || genfs_node_rdlocked(vp));
+	KASSERT(((flags  PGO_GLOCKHELD) != 0) || genfs_node_rdlocked(vp));
 
 #if 0
 	GOP_SIZE(vp, vp-v_size, memeof, GOP_SIZE_MEM);
@@ -936,6 

CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-19 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 08:12:12 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Remove unused code.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.44 -r1.36.2.45 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.44 src/sys/miscfs/genfs/genfs_io.c:1.36.2.45
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.44	Fri Nov 19 08:11:04 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 08:12:12 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.44 2010/11/19 08:11:04 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.45 2010/11/19 08:12:12 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.44 2010/11/19 08:11:04 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.45 2010/11/19 08:12:12 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -909,47 +909,15 @@
 	const int fs_bshift = vp2fs_bshift(vp);
 	const int dev_bshift = vp2dev_bshift(vp);
 	const int fs_bsize = 1  fs_bshift;
-#if 0
-#define	blk_mask	(fs_bsize - 1)
-#define	trunc_blk(x)	((x)  ~blk_mask)
-#define	round_blk(x)	(((x) + blk_mask)  ~blk_mask)
-
-	const int orignmempages = MIN(orignpages,
-	round_page(memeof - origoffset)  PAGE_SHIFT);
-	npages = orignmempages;
-	const off_t startoffset = trunc_blk(origoffset);
-	const off_t endoffset = MIN(
-	round_page(round_blk(origoffset + (npages  PAGE_SHIFT))),
-	round_page(memeof));
-	const int ridx = (origoffset - startoffset)  PAGE_SHIFT;
-#endif
 
 	int error;
 	off_t off;
-#if 0
-	off_t memeof;
-	int orignmempages;
-#endif
 	int i;
 
 	UVMHIST_FUNC(genfs_do_getpages_xip_io); UVMHIST_CALLED(ubchist);
 
 	KASSERT(((flags  PGO_GLOCKHELD) != 0) || genfs_node_rdlocked(vp));
 
-#if 0
-	GOP_SIZE(vp, vp-v_size, memeof, GOP_SIZE_MEM);
-	orignmempages = MIN(orignpages, round_page(memeof - origoffset)  PAGE_SHIFT);
-#endif
-
-#if 0
-	int fs_bshift, fs_bsize, dev_bshift, dev_bsize;
-
-	fs_bshift = vp-v_mount-mnt_fs_bshift;
-	fs_bsize = 1  fs_bshift;
-	dev_bshift = vp-v_mount-mnt_dev_bshift;
-	dev_bsize = 1  dev_bshift;
-#endif
-
 #ifdef UVMHIST
 	const off_t startoffset = trunc_blk(origoffset);
 	const off_t endoffset = round_blk(origoffset + PAGE_SIZE * orignmempages);



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-19 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 08:39:25 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Comment.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.45 -r1.36.2.46 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.45 src/sys/miscfs/genfs/genfs_io.c:1.36.2.46
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.45	Fri Nov 19 08:12:12 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 08:39:25 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.45 2010/11/19 08:12:12 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.46 2010/11/19 08:39:25 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.45 2010/11/19 08:12:12 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.46 2010/11/19 08:39:25 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -220,20 +220,20 @@
 
 	if (flags  PGO_LOCKED) {
 #if 0
-		genfs_do_getpages_locked();
+		genfs_getpages_mem();
 	} else {
-		genfs_do_getpages_unlocked();
+		genfs_getpages_io();
 	}
 }
 
 int
-genfs_do_getpages_locked()
+genfs_getpages_mem()
 {
 #endif
 		int nfound;
 		struct vm_page *pg;
 
-#if 1
+#ifdef XIP
 		if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
 			*ap-a_count = 0;
 			return 0;
@@ -284,7 +284,7 @@
 }
 
 int
-genfs_do_getpages_unlocked()
+genfs_getpages_io()
 {
 #endif
 	/*
@@ -331,7 +331,13 @@
 
 	UVMHIST_LOG(ubchist, ridx %d npages %d startoff %ld endoff %ld,
 	ridx, npages, startoffset, endoffset);
+#if 0
+}
 
+int
+genfs_getpages_io_relock()
+{
+#endif
 	if (!has_trans) {
 		fstrans_start(vp-v_mount, FSTRANS_SHARED);
 		has_trans = true;
@@ -360,10 +366,16 @@
 			kmem_free(pgs, pgs_size);
 		goto startover;
 	}
+#if 0
+}
 
-#if 1
+int
+genfs_getpages_io_findpages()
+{
+#endif
+#ifdef XIP
 	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
-		goto find_pagecache_done;
+		goto genfs_getpages_allocpages_done;
 #endif
 
 	if (uvn_findpages(uobj, origoffset, npages, pgs[ridx],
@@ -405,14 +417,14 @@
 
 	if (overwrite) {
 #if 0
-		genfs_do_getpages_overwrite();
+		genfs_getpages_io_overwrite();
 	} else {
-		genfs_do_getpages_io();
+		genfs_getpages_io_read();
 	}
 }
 
 int
-genfs_do_getpages_overwrite()
+genfs_getpages_io_overwrite()
 {
 	{
 #endif
@@ -433,7 +445,7 @@
 }
 
 int
-genfs_do_getpages_io()
+genfs_getpages_io_read()
 {
 #endif
 	/*
@@ -441,7 +453,13 @@
 	 * so we're going to have to do some i/o.
 	 * find any additional pages needed to cover the expanded range.
 	 */
+#if 0
+}
 
+int
+genfs_getpages_io_read_allocpages()
+{
+#endif
 	npages = (endoffset - startoffset)  PAGE_SHIFT;
 	if (startoffset != origoffset || npages != orignmempages) {
 		int npgs;
@@ -470,11 +488,16 @@
 			goto out_err_free;
 		}
 	}
-
-#if 1
-find_pagecache_done:
+#ifdef XIP
+genfs_getpages_io_read_allocpages_done:
 #endif
+#if 0
+}
 
+int
+genfs_getpages_io_read_bio()
+{
+#endif
 	mutex_exit(uobj-vmobjlock);
 
 {
@@ -496,7 +519,13 @@
 	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
 		goto genfs_getpages_bio_prepare_done;
 #endif
+#if 0
+}
 
+int
+genfs_getpages_io_read_bio_prepare()
+{
+#endif
 	kva = uvm_pagermapin(pgs, npages,
 	UVMPAGER_MAPIN_READ | UVMPAGER_MAPIN_WAITOK);
 
@@ -516,7 +545,10 @@
 		BIO_SETPRIO(mbp, BPRIO_TIMELIMITED);
 	else
 		BIO_SETPRIO(mbp, BPRIO_TIMECRITICAL);
+#if 0
+}
 
+#endif
 #if 1
 genfs_getpages_bio_prepare_done:
 #endif
@@ -556,7 +588,13 @@
 		goto loopdone;
 	}
 #endif
+#if 0
+}
 
+int
+genfs_getpages_io_read_bio_loop()
+{
+#endif
 	/*
 	 * now loop over the pages, reading as needed.
 	 */



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-19 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 15:25:37 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
genfs_*_xip_io: Adjust start offset.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.46 -r1.36.2.47 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.46 src/sys/miscfs/genfs/genfs_io.c:1.36.2.47
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.46	Fri Nov 19 08:39:25 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 15:25:37 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.46 2010/11/19 08:39:25 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.47 2010/11/19 15:25:37 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.46 2010/11/19 08:39:25 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.47 2010/11/19 15:25:37 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -375,7 +375,7 @@
 #endif
 #ifdef XIP
 	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
-		goto genfs_getpages_allocpages_done;
+		goto genfs_getpages_io_read_allocpages_done;
 #endif
 
 	if (uvn_findpages(uobj, origoffset, npages, pgs[ridx],
@@ -578,7 +578,7 @@
 		error = genfs_do_getpages_xip_io(
 			ap-a_vp,
 			ap-a_offset,
-			ap-a_m,
+			pgs,
 			ap-a_count,
 			ap-a_centeridx,
 			ap-a_access_type,
@@ -811,7 +811,7 @@
 		error = genfs_do_getpages_xip_io_done(
 			ap-a_vp,
 			ap-a_offset,
-			ap-a_m,
+			pgs,
 			ap-a_count,
 			ap-a_centeridx,
 			ap-a_access_type,
@@ -903,6 +903,10 @@
 		genfs_markdirty(vp);
 	}
 	mutex_exit(uobj-vmobjlock);
+#if 1
+genfs_getpages_generic_io_done_done:
+	{}
+#endif
 	if (ap-a_m != NULL) {
 		memcpy(ap-a_m, pgs[ridx],
 		orignmempages * sizeof(struct vm_page *));
@@ -911,10 +915,6 @@
 }
 
 #endif
-#if 1
-genfs_getpages_generic_io_done_done:
-	{}
-#endif
 
 out_err_free:
 	if (pgs != NULL  pgs != pgs_onstack)
@@ -964,8 +964,10 @@
 	UVMHIST_LOG(ubchist, xip npages=%d startoffset=%lx endoffset=%lx,
 	orignmempages, (long)startoffset, (long)endoffset, 0);
 
+	const int ridx = (origoffset - startoffset)  PAGE_SHIFT;
+
 	off = origoffset;
-	for (i = 0; i  orignmempages; i++) {
+	for (i = ridx; i  ridx + orignmempages; i++) {
 		daddr_t lbn, blkno;
 		int run;
 		struct vnode *devvp;
@@ -1022,9 +1024,15 @@
 	struct uvm_object * const uobj = vp-v_uobj;
 	int i;
 
+	const int fs_bshift = vp2fs_bshift(vp);
+	const int fs_bsize = 1  fs_bshift;
+
+	const off_t startoffset = trunc_blk(origoffset);
+	const int ridx = (origoffset - startoffset)  PAGE_SHIFT;
+
 	mutex_enter(uobj-vmobjlock);
 
-	for (i = 0; i  orignmempages; i++) {
+	for (i = ridx; i  ridx + orignmempages; i++) {
 		struct vm_page *pg = pps[i];
 
 		KASSERT((pg-flags  PG_RDONLY) != 0);



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-19 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sat Nov 20 03:00:42 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Snapshot of getpages BMAP loop merge.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.47 -r1.36.2.48 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.47 src/sys/miscfs/genfs/genfs_io.c:1.36.2.48
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.47	Fri Nov 19 15:25:37 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sat Nov 20 03:00:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.47 2010/11/19 15:25:37 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.48 2010/11/20 03:00:42 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.47 2010/11/19 15:25:37 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.48 2010/11/20 03:00:42 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -585,6 +585,7 @@
 			ap-a_advice,
 			ap-a_flags,
 			orignmempages);
+if (0)
 		goto loopdone;
 	}
 #endif
@@ -614,6 +615,9 @@
 		 */
 
 		pidx = (offset - startoffset)  PAGE_SHIFT;
+#ifdef XIP
+	if ((ap-a_vp-v_vflag  VV_XIP) == 0) {
+#endif
 		while ((pgs[pidx]-flags  PG_FAKE) == 0) {
 			size_t b;
 
@@ -632,6 +636,9 @@
 goto loopdone;
 			}
 		}
+#ifdef XIP
+	}
+#endif
 
 		/*
 		 * bmap the file to find out the blkno to read from and
@@ -661,10 +668,16 @@
 			int pcount;
 
 			pcount = 1;
+#ifdef XIP
+		if ((ap-a_vp-v_vflag  VV_XIP) == 0) {
+#endif
 			while (pidx + pcount  npages 
 			pgs[pidx + pcount]-flags  PG_FAKE) {
 pcount++;
 			}
+#ifdef XIP
+		}
+#endif
 			iobytes = MIN(iobytes, (pcount  PAGE_SHIFT) -
 			(offset - trunc_page(offset)));
 		}
@@ -676,10 +689,15 @@
 		 */
 
 		if (blkno == (daddr_t)-1) {
+#ifdef XIP
+		if ((ap-a_vp-v_vflag  VV_XIP) == 0) {
+#endif
 			int holepages = (round_page(offset + iobytes) -
 			trunc_page(offset))  PAGE_SHIFT;
 			UVMHIST_LOG(ubchist, lbn 0x%x - HOLE, lbn,0,0,0);
 
+			KASSERT((ap-a_vp-v_vflag  VV_XIP) == 0);
+
 			sawhole = true;
 			memset((char *)kva + (offset - startoffset), 0,
 			iobytes);
@@ -693,15 +711,25 @@
 	pgs[pidx + i]-flags |= PG_RDONLY;
 }
 			}
+#ifdef XIP
+		} else {
+			panic(XIP hole page is not supported yet);
+		}
+#endif
 			continue;
 		}
 
+#ifdef XIP
+	if ((ap-a_vp-v_vflag  VV_XIP) == 0) {
+#endif
 		/*
 		 * allocate a sub-buf for this piece of the i/o
 		 * (or just use mbp if there's only 1 piece),
 		 * and start it going.
 		 */
 
+		KASSERT((ap-a_vp-v_vflag  VV_XIP) == 0);
+
 		if (offset == startoffset  iobytes == bytes) {
 			bp = mbp;
 		} else {
@@ -721,12 +749,47 @@
 		bp, offset, bp-b_bcount, bp-b_blkno);
 
 		VOP_STRATEGY(devvp, bp);
+#ifdef XIP
+	} else {
+		/*
+		 * XIP page metadata assignment
+		 * - Unallocated block is redirected to the dedicated zero'ed
+		 *   page.
+		 */
+		const int npgs = MIN(
+			iobytes  PAGE_SHIFT,
+			((1 + run)  fs_bshift)  PAGE_SHIFT);
+		const daddr_t blk_off = blkno  dev_bshift;
+		const daddr_t fs_off = ap-a_offset - (lbn  fs_bshift);
+
+		UVMHIST_LOG(ubchist,
+			xip npgs=%d _blk_off=0x%lx _fs_off=0x%lx,
+			npgs, (long)blk_off, (long)fs_off, 0);
+
+		for (i = 0; i  npgs; i++) {
+			const daddr_t pg_off = pidx  PAGE_SHIFT;
+			struct vm_page *pg;
+
+			pg = uvn_findpage_xip(devvp, vp-v_uobj,
+			blk_off + fs_off + pg_off);
+			KASSERT(pg != NULL);
+			UVMHIST_LOG(ubchist,
+xip pgs %d = phys_addr=0x%lx (%p),
+pidx + i,
+(long)pg-phys_addr,
+pg,
+0);
+			pgs[pidx + i] = pg;
+		}
+	}
+#endif
 	}
 
 loopdone:
 #if 1
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
 		goto genfs_getpages_biodone_done;
+	}
 #endif
 #if 0
 
@@ -903,6 +966,7 @@
 		genfs_markdirty(vp);
 	}
 	mutex_exit(uobj-vmobjlock);
+
 #if 1
 genfs_getpages_generic_io_done_done:
 	{}
@@ -968,17 +1032,22 @@
 
 	off = origoffset;
 	for (i = ridx; i  ridx + orignmempages; i++) {
-		daddr_t lbn, blkno;
+		daddr_t blkno;
 		int run;
 		struct vnode *devvp;
 
-		lbn = (off  ~(fs_bsize - 1))  fs_bshift;
+		KASSERT((off - origoffset)  PAGE_SHIFT == i - ridx);
+
+		const daddr_t lbn = (off  ~(fs_bsize - 1))  fs_bshift;
 
 		error = VOP_BMAP(vp, lbn, devvp, blkno, run);
 		KASSERT(error == 0);
 		UVMHIST_LOG(ubchist, xip VOP_BMAP: lbn=%ld blkno=%ld run=%d,
 		(long)lbn, (long)blkno, run, 0);
 
+		const daddr_t blk_off = blkno  dev_bshift;
+		const daddr_t fs_off = origoffset - (lbn  fs_bshift);
+
 		/*
 		 * XIP page metadata assignment
 		 * - Unallocated block is redirected to the dedicated zero'ed
@@ -987,13 +1056,12 @@
 		if (blkno  0) {
 			panic(XIP hole is not supported yet!);
 		} else {
-			daddr_t blk_off, fs_off;
+			KASSERT(off - 

CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-19 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sat Nov 20 04:26:16 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Fix a bug (offset calculation) in the previous.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.48 -r1.36.2.49 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.48 src/sys/miscfs/genfs/genfs_io.c:1.36.2.49
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.48	Sat Nov 20 03:00:42 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sat Nov 20 04:26:12 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.48 2010/11/20 03:00:42 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.49 2010/11/20 04:26:12 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.48 2010/11/20 03:00:42 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.49 2010/11/20 04:26:12 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -749,8 +749,9 @@
 		bp, offset, bp-b_bcount, bp-b_blkno);
 
 		VOP_STRATEGY(devvp, bp);
+	}
 #ifdef XIP
-	} else {
+	else {
 		/*
 		 * XIP page metadata assignment
 		 * - Unallocated block is redirected to the dedicated zero'ed
@@ -760,10 +761,10 @@
 			iobytes  PAGE_SHIFT,
 			((1 + run)  fs_bshift)  PAGE_SHIFT);
 		const daddr_t blk_off = blkno  dev_bshift;
-		const daddr_t fs_off = ap-a_offset - (lbn  fs_bshift);
+		const daddr_t fs_off = ap-a_offset - startoffset;
 
 		UVMHIST_LOG(ubchist,
-			xip npgs=%d _blk_off=0x%lx _fs_off=0x%lx,
+			xip npgs=%d blk_off=0x%lx fs_off=0x%lx,
 			npgs, (long)blk_off, (long)fs_off, 0);
 
 		for (i = 0; i  npgs; i++) {



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-19 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sat Nov 20 07:47:35 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
XIP has no fake (== unitinialized) pages, because pages are
already initialized when mounted.  Adjust getpages loop again.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.50 -r1.36.2.51 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.50 src/sys/miscfs/genfs/genfs_io.c:1.36.2.51
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.50	Sat Nov 20 05:15:59 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sat Nov 20 07:47:34 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.50 2010/11/20 05:15:59 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.51 2010/11/20 07:47:34 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.50 2010/11/20 05:15:59 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.51 2010/11/20 07:47:34 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -668,16 +668,19 @@
 			int pcount;
 
 			pcount = 1;
+			while ((pidx + pcount  npages)  (
 #ifdef XIP
-		if ((ap-a_vp-v_vflag  VV_XIP) == 0) {
+			/*
+			 * in XIP case, we don't know what page to read
+			 * at this point!
+			 */
+			((ap-a_vp-v_vflag  VV_XIP) != 0) ||
+#else
+			 0 ||
 #endif
-			while (pidx + pcount  npages 
-			pgs[pidx + pcount]-flags  PG_FAKE) {
+			 (pgs[pidx + pcount]-flags  PG_FAKE))) {
 pcount++;
 			}
-#ifdef XIP
-		}
-#endif
 			iobytes = MIN(iobytes, (pcount  PAGE_SHIFT) -
 			(offset - trunc_page(offset)));
 		}



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-18 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 02:30:41 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Adjust XIP putpages to I/O XIP getpages.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.35 -r1.36.2.36 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.35 src/sys/miscfs/genfs/genfs_io.c:1.36.2.36
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.35	Fri Nov 19 01:44:47 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 02:30:41 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.35 2010/11/19 01:44:47 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.36 2010/11/19 02:30:41 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.35 2010/11/19 01:44:47 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.36 2010/11/19 02:30:41 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -941,8 +941,7 @@
 		pg-uobject = vp-v_uobj;
 	}
 
-	if ((flags  PGO_LOCKED) == 0)
-		mutex_exit(uobj-vmobjlock);
+	mutex_exit(uobj-vmobjlock);
 
 	*npagesp = npages;
 
@@ -1547,10 +1546,10 @@
 		orignpages = npages;
 		KASSERT(mutex_owned(uobj-vmobjlock));
 		error = genfs_do_getpages_xip1(vp, off, pgs, npages, 0,
-		VM_PROT_ALL, 0, PGO_LOCKED);
+		VM_PROT_ALL, 0, 0);
 		KASSERT(error == 0);
 		KASSERT(npages == orignpages);
-		KASSERT(mutex_owned(uobj-vmobjlock));
+		mutex_enter(uobj-vmobjlock);
 		for (i = 0; i  npages; i++) {
 			pg = pgs[i];
 			if (pg == NULL || pg == PGO_DONTCARE)



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-18 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 04:13:21 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Comment out XIP hole page redirection code.  Since makefs(8) doesn't
support hole, and these code paths can be never tested.

(The current XIP is read-only, so hole pages are pointless in
practice.)


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.36 -r1.36.2.37 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.36 src/sys/miscfs/genfs/genfs_io.c:1.36.2.37
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.36	Fri Nov 19 02:30:41 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 04:13:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.36 2010/11/19 02:30:41 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.37 2010/11/19 04:13:21 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.36 2010/11/19 02:30:41 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.37 2010/11/19 04:13:21 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -286,7 +286,6 @@
 		goto out_err;
 	}
 	mutex_exit(uobj-vmobjlock);
-
 	/*
 	 * find the requested pages and make some simple checks.
 	 * leave space in the page array for a whole block.
@@ -859,7 +858,9 @@
 	int npages;
 	int fs_bshift, fs_bsize, dev_bshift, dev_bsize;
 	int i;
+#ifdef XIP_HOLE
 	struct vm_page *zero_page;
+#endif
 
 	UVMHIST_FUNC(genfs_do_getpages_xip_io); UVMHIST_CALLED(ubchist);
 
@@ -875,7 +876,9 @@
 	ebkoff = ((offset + PAGE_SIZE * npages) + (fs_bsize - 1)) 
 	~(fs_bsize - 1);
 
+#ifdef XIP_HOLE
 	zero_page = NULL;
+#endif
 
 	UVMHIST_LOG(ubchist, xip npages=%d sbkoff=%lx ebkoff=%lx,
 	npages, (long)sbkoff, (long)ebkoff, 0);
@@ -902,9 +905,13 @@
 		 *   page.
 		 */
 		if (blkno  0) {
+#ifdef XIP_HOLE
 			zero_page = uvm_page_zeropage_alloc();
 			KASSERT(zero_page != NULL);
 			pps[i] = zero_page;
+#else
+			panic(XIP hole is not supported yet!);
+#endif
 		} else {
 			daddr_t blk_off, fs_off;
 
@@ -931,8 +938,10 @@
 		struct vm_page *pg = pps[i];
 
 		KASSERT((pg-flags  PG_RDONLY) != 0);
+#ifdef XIP_HOLE
 		if (pg == zero_page)
 			continue;
+#endif
 		KASSERT((pg-flags  PG_BUSY) == 0);
 		KASSERT((pg-flags  PG_CLEAN) != 0);
 		KASSERT((pg-flags  PG_DEVICE) != 0);
@@ -1521,8 +1530,10 @@
 	 */
 
 	off_t off, eof;
+#ifdef XIP_HOLE
 	struct vm_page *zero_page;
 	bool put_zero_page;
+#endif
 
 	off = trunc_page(startoff);
 	if (endoff == 0 || (flags  PGO_ALLPAGES))
@@ -1530,10 +1541,12 @@
 	else
 		eof = endoff;
 
+#ifdef XIP_HOLE
 	zero_page = uvm_pagelookup(uobj, 0);
 	KASSERT(zero_page != NULL || uobj-uo_npages == 0);
 	KASSERT(zero_page == NULL || uobj-uo_npages == 1);
 	put_zero_page = false;
+#endif
 
 	while (off  eof) {
 		int npages, orignpages, error, i;
@@ -1554,9 +1567,11 @@
 			pg = pgs[i];
 			if (pg == NULL || pg == PGO_DONTCARE)
 continue;
+#ifdef XIP_HOLE
 			if (pg == uvm_page_zeropage)
 /* Do nothing for holes. */
 continue;
+#endif
 			/*
 			 * Freeing normal XIP pages; nothing to do.
 			 */



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-18 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 04:46:24 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Call XIP getpages() from within the generic one.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.38 -r1.36.2.39 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.38 src/sys/miscfs/genfs/genfs_io.c:1.36.2.39
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.38	Fri Nov 19 04:14:30 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 04:46:24 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.38 2010/11/19 04:14:30 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.39 2010/11/19 04:46:24 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.38 2010/11/19 04:14:30 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.39 2010/11/19 04:46:24 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -59,7 +59,6 @@
 #include uvm/uvm.h
 #include uvm/uvm_pager.h
 
-static int genfs_do_getpages(void *);
 #ifdef XIP
 static int genfs_do_getpages_xip(void *);
 static int genfs_do_getpages_xip1(struct vnode *, voff_t, struct vm_page **,
@@ -123,28 +122,6 @@
 int
 genfs_getpages(void *v)
 {
-#ifdef XIP
-	struct vop_getpages_args /* {
-		struct vnode *a_vp;
-		voff_t a_offset;
-		struct vm_page **a_m;
-		int *a_count;
-		int a_centeridx;
-		vm_prot_t a_access_type;
-		int a_advice;
-		int a_flags;
-	} */ * const ap = v;
-
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
-		return genfs_do_getpages_xip(v);
-	else
-#endif
-		return genfs_do_getpages(v);
-}
-
-static int
-genfs_do_getpages(void *v)
-{
 	struct vop_getpages_args /* {
 		struct vnode *a_vp;
 		voff_t a_offset;
@@ -243,9 +220,27 @@
 	 */
 
 	if (flags  PGO_LOCKED) {
+#if 0
+		genfs_do_getpages_locked();
+	} else {
+		genfs_do_getpages_unlocked();
+	}
+}
+
+int
+genfs_do_getpages_locked()
+{
+#endif
 		int nfound;
 		struct vm_page *pg;
 
+#if 1
+		if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
+			*ap-a_count = 0;
+			return 0;
+		}
+#endif
+
 		KASSERT(!glocked);
 		npages = *ap-a_count;
 #if defined(DEBUG)
@@ -286,6 +281,17 @@
 		goto out_err;
 	}
 	mutex_exit(uobj-vmobjlock);
+#if 0
+}
+
+int
+genfs_do_getpages_unlocked()
+{
+#endif
+#if 1
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
+		return genfs_do_getpages_xip(v);
+#endif
 	/*
 	 * find the requested pages and make some simple checks.
 	 * leave space in the page array for a whole block.
@@ -395,6 +401,18 @@
 	 */
 
 	if (overwrite) {
+#if 0
+		genfs_do_getpages_overwrite();
+	} else {
+		genfs_do_getpages_io();
+	}
+}
+
+int
+genfs_do_getpages_overwrite()
+{
+	{
+#endif
 		if (!glocked) {
 			genfs_node_unlock(vp);
 		}
@@ -408,7 +426,13 @@
 		npages += ridx;
 		goto out;
 	}
+#if 0
+}
 
+int
+genfs_do_getpages_io()
+{
+#endif
 	/*
 	 * the page wasn't resident and we're not overwriting,
 	 * so we're going to have to do some i/o.
@@ -873,13 +897,9 @@
 	ebkoff = ((offset + PAGE_SIZE * npages) + (fs_bsize - 1)) 
 	~(fs_bsize - 1);
 
-
 	UVMHIST_LOG(ubchist, xip npages=%d sbkoff=%lx ebkoff=%lx,
 	npages, (long)sbkoff, (long)ebkoff, 0);
 
-	KASSERT(mutex_owned(uobj-vmobjlock));
-	mutex_exit(uobj-vmobjlock);
-
 	off = offset;
 	for (i = 0; i  npages; i++) {
 		daddr_t lbn, blkno;
@@ -1521,7 +1541,6 @@
 	else
 		eof = endoff;
 
-
 	while (off  eof) {
 		int npages, orignpages, error, i;
 		struct vm_page *pgs[maxpages], *pg;
@@ -1532,6 +1551,7 @@
 
 		orignpages = npages;
 		KASSERT(mutex_owned(uobj-vmobjlock));
+		mutex_exit(uobj-vmobjlock);
 		error = genfs_do_getpages_xip1(vp, off, pgs, npages, 0,
 		VM_PROT_ALL, 0, 0);
 		KASSERT(error == 0);



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-18 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 05:22:29 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Reduce unnecessary code.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.39 -r1.36.2.40 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.39 src/sys/miscfs/genfs/genfs_io.c:1.36.2.40
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.39	Fri Nov 19 04:46:24 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 05:22:29 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.39 2010/11/19 04:46:24 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.40 2010/11/19 05:22:29 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.39 2010/11/19 04:46:24 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.40 2010/11/19 05:22:29 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -61,8 +61,6 @@
 
 #ifdef XIP
 static int genfs_do_getpages_xip(void *);
-static int genfs_do_getpages_xip1(struct vnode *, voff_t, struct vm_page **,
-int *, int, vm_prot_t, int, int);
 static int genfs_do_getpages_xip_io(struct vnode *, voff_t, struct vm_page **,
 int *, int, vm_prot_t, int, int);
 static int genfs_do_putpages_xip(struct vnode *, off_t, off_t, int,
@@ -824,44 +822,19 @@
 
 	UVMHIST_FUNC(genfs_do_getpages_xip); UVMHIST_CALLED(ubchist);
 
-	return genfs_do_getpages_xip1(
-		ap-a_vp,
-		ap-a_offset,
-		ap-a_m,
-		ap-a_count,
-		ap-a_centeridx,
-		ap-a_access_type,
-		ap-a_advice,
-		ap-a_flags);
-}
-
-static int
-genfs_do_getpages_xip1(
-	struct vnode *vp,
-	voff_t offset,
-	struct vm_page **pps,
-	int *npagesp,
-	int centeridx,
-	vm_prot_t access_type,
-	int advice,
-	int flags)
-{
-
-	KASSERT((vp-v_vflag  VV_XIP) != 0);
-
-	if ((flags  PGO_LOCKED) != 0) {
-		*npagesp = 0;
+	if ((ap-a_flags  PGO_LOCKED) != 0) {
+		*ap-a_count = 0;
 		return 0;
 	} else
 		return genfs_do_getpages_xip_io(
-			vp,
-			offset,
-			pps,
-			npagesp,
-			centeridx,
-			access_type,
-			advice,
-			flags);
+			ap-a_vp,
+			ap-a_offset,
+			ap-a_m,
+			ap-a_count,
+			ap-a_centeridx,
+			ap-a_access_type,
+			ap-a_advice,
+			ap-a_flags);
 }
 
 static int
@@ -1530,7 +1503,7 @@
 	 * We don't know which pages are currently mapped in the given vnode,
 	 * because XIP pages are not added to vnode.  What we can do is to
 	 * locate pages by querying the filesystem as done in getpages.  Call
-	 * genfs_do_getpages_xip1().
+	 * genfs_do_getpages_xip_io().
 	 */
 
 	off_t off, eof;
@@ -1552,7 +1525,7 @@
 		orignpages = npages;
 		KASSERT(mutex_owned(uobj-vmobjlock));
 		mutex_exit(uobj-vmobjlock);
-		error = genfs_do_getpages_xip1(vp, off, pgs, npages, 0,
+		error = genfs_do_getpages_xip_io(vp, off, pgs, npages, 0,
 		VM_PROT_ALL, 0, 0);
 		KASSERT(error == 0);
 		KASSERT(npages == orignpages);



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-18 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 05:43:30 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Reduce code.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.40 -r1.36.2.41 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.40 src/sys/miscfs/genfs/genfs_io.c:1.36.2.41
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.40	Fri Nov 19 05:22:29 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 05:43:30 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.40 2010/11/19 05:22:29 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.41 2010/11/19 05:43:30 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.40 2010/11/19 05:22:29 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.41 2010/11/19 05:43:30 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -60,7 +60,6 @@
 #include uvm/uvm_pager.h
 
 #ifdef XIP
-static int genfs_do_getpages_xip(void *);
 static int genfs_do_getpages_xip_io(struct vnode *, voff_t, struct vm_page **,
 int *, int, vm_prot_t, int, int);
 static int genfs_do_putpages_xip(struct vnode *, off_t, off_t, int,
@@ -288,7 +287,15 @@
 #endif
 #if 1
 	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
-		return genfs_do_getpages_xip(v);
+		return genfs_do_getpages_xip_io(
+			ap-a_vp,
+			ap-a_offset,
+			ap-a_m,
+			ap-a_count,
+			ap-a_centeridx,
+			ap-a_access_type,
+			ap-a_advice,
+			ap-a_flags);
 #endif
 	/*
 	 * find the requested pages and make some simple checks.
@@ -497,7 +504,7 @@
 	} else {
 		mbp-b_flags = B_READ;
 		mbp-b_iodone = NULL;
-	}	
+	}
 	if (async)
 		BIO_SETPRIO(mbp, BPRIO_TIMELIMITED);
 	else
@@ -801,43 +808,12 @@
 
 #ifdef XIP
 /*
- * genfs_do_getpages_xip
+ * genfs_do_getpages_xip_io
  *  Return direct pages of XIP vnode.  The block addresses of XIP
  *  vnode pages are returned back to the VM fault handler as the
  *	actually mapped physical addresses.
  */
 static int
-genfs_do_getpages_xip(void *v)
-{
-	struct vop_getpages_args /* {
-		struct vnode *a_vp;
-		voff_t a_offset;
-		struct vm_page **a_m;
-		int *a_count;
-		int a_centeridx;
-		vm_prot_t a_access_type;
-		int a_advice;
-		int a_flags;
-	} */ * const ap = v;
-
-	UVMHIST_FUNC(genfs_do_getpages_xip); UVMHIST_CALLED(ubchist);
-
-	if ((ap-a_flags  PGO_LOCKED) != 0) {
-		*ap-a_count = 0;
-		return 0;
-	} else
-		return genfs_do_getpages_xip_io(
-			ap-a_vp,
-			ap-a_offset,
-			ap-a_m,
-			ap-a_count,
-			ap-a_centeridx,
-			ap-a_access_type,
-			ap-a_advice,
-			ap-a_flags);
-}
-
-static int
 genfs_do_getpages_xip_io(
 	struct vnode *vp,
 	voff_t offset,



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-18 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 06:38:53 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Reduce code duplication.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.41 -r1.36.2.42 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.41 src/sys/miscfs/genfs/genfs_io.c:1.36.2.42
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.41	Fri Nov 19 05:43:30 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 06:38:53 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.41 2010/11/19 05:43:30 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.42 2010/11/19 06:38:53 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.41 2010/11/19 05:43:30 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.42 2010/11/19 06:38:53 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -61,7 +61,7 @@
 
 #ifdef XIP
 static int genfs_do_getpages_xip_io(struct vnode *, voff_t, struct vm_page **,
-int *, int, vm_prot_t, int, int);
+int *, int, vm_prot_t, int, int, const int);
 static int genfs_do_putpages_xip(struct vnode *, off_t, off_t, int,
 struct vm_page **);
 #endif
@@ -285,27 +285,18 @@
 genfs_do_getpages_unlocked()
 {
 #endif
-#if 1
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
-		return genfs_do_getpages_xip_io(
-			ap-a_vp,
-			ap-a_offset,
-			ap-a_m,
-			ap-a_count,
-			ap-a_centeridx,
-			ap-a_access_type,
-			ap-a_advice,
-			ap-a_flags);
-#endif
 	/*
 	 * find the requested pages and make some simple checks.
 	 * leave space in the page array for a whole block.
 	 */
 
-	const int fs_bshift = (vp-v_type != VBLK) ?
-	vp-v_mount-mnt_fs_bshift : DEV_BSHIFT;
-	const int dev_bshift = (vp-v_type != VBLK) ?
-	vp-v_mount-mnt_dev_bshift : DEV_BSHIFT;
+#define	vp2fs_bshift(vp) \
+	(((vp)-v_type != VBLK) ? (vp)-v_mount-mnt_fs_bshift : DEV_BSHIFT)
+#define	vp2dev_bshift(vp) \
+	(((vp)-v_type != VBLK) ? (vp)-v_mount-mnt_dev_bshift : DEV_BSHIFT)
+
+	const int fs_bshift = vp2fs_bshift(vp);
+	const int dev_bshift = vp2dev_bshift(vp);
 	const int fs_bsize = 1  fs_bshift;
 #define	blk_mask	(fs_bsize - 1)
 #define	trunc_blk(x)	((x)  ~blk_mask)
@@ -320,6 +311,20 @@
 	round_page(memeof));
 	const int ridx = (origoffset - startoffset)  PAGE_SHIFT;
 
+#if 1
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
+		return genfs_do_getpages_xip_io(
+			ap-a_vp,
+			ap-a_offset,
+			ap-a_m,
+			ap-a_count,
+			ap-a_centeridx,
+			ap-a_access_type,
+			ap-a_advice,
+			ap-a_flags,
+			orignmempages);
+#endif
+
 	const int pgs_size = sizeof(struct vm_page *) *
 	((endoffset - startoffset)  PAGE_SHIFT);
 	struct vm_page **pgs, *pgs_onstack[UBC_MAX_PAGES];
@@ -816,41 +821,69 @@
 static int
 genfs_do_getpages_xip_io(
 	struct vnode *vp,
-	voff_t offset,
+	voff_t origoffset,
 	struct vm_page **pps,
 	int *npagesp,
 	int centeridx,
 	vm_prot_t access_type,
 	int advice,
-	int flags)
+	int flags,
+	const int orignmempages)
 {
 	struct uvm_object * const uobj = vp-v_uobj;
 
+	const int fs_bshift = vp2fs_bshift(vp);
+	const int dev_bshift = vp2dev_bshift(vp);
+	const int fs_bsize = 1  fs_bshift;
+#if 0
+#define	blk_mask	(fs_bsize - 1)
+#define	trunc_blk(x)	((x)  ~blk_mask)
+#define	round_blk(x)	(((x) + blk_mask)  ~blk_mask)
+
+	const int orignmempages = MIN(orignpages,
+	round_page(memeof - origoffset)  PAGE_SHIFT);
+	npages = orignmempages;
+	const off_t startoffset = trunc_blk(origoffset);
+	const off_t endoffset = MIN(
+	round_page(round_blk(origoffset + (npages  PAGE_SHIFT))),
+	round_page(memeof));
+	const int ridx = (origoffset - startoffset)  PAGE_SHIFT;
+#endif
+
 	int error;
-	off_t eof, sbkoff, ebkoff, off;
-	int npages;
-	int fs_bshift, fs_bsize, dev_bshift, dev_bsize;
+	off_t off;
+#if 0
+	off_t memeof;
+	int orignmempages;
+#endif
 	int i;
 
 	UVMHIST_FUNC(genfs_do_getpages_xip_io); UVMHIST_CALLED(ubchist);
 
-	GOP_SIZE(vp, vp-v_size, eof, GOP_SIZE_MEM);
-	npages = MIN(*npagesp, round_page(eof - offset)  PAGE_SHIFT);
+#if 0
+	GOP_SIZE(vp, vp-v_size, memeof, GOP_SIZE_MEM);
+	orignmempages = MIN(orignpages, round_page(memeof - origoffset)  PAGE_SHIFT);
+#endif
+
+#if 0
+	int fs_bshift, fs_bsize, dev_bshift, dev_bsize;
 
 	fs_bshift = vp-v_mount-mnt_fs_bshift;
 	fs_bsize = 1  fs_bshift;
 	dev_bshift = vp-v_mount-mnt_dev_bshift;
 	dev_bsize = 1  dev_bshift;
+#endif
 
-	sbkoff = offset  ~(fs_bsize - 1);
-	ebkoff = ((offset + PAGE_SIZE * npages) + (fs_bsize - 1)) 
-	~(fs_bsize - 1);
+#ifdef UVMHIST
+	const off_t startoffset = trunc_blk(origoffset);
+	const off_t endoffset = round_blk(origoffset + PAGE_SIZE * orignmempages);
+#endif
 
-	UVMHIST_LOG(ubchist, xip npages=%d sbkoff=%lx ebkoff=%lx,
-	npages, (long)sbkoff, (long)ebkoff, 0);
+	

CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-18 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Nov 19 07:09:50 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Share mode code.  Care glock.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.42 -r1.36.2.43 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.42 src/sys/miscfs/genfs/genfs_io.c:1.36.2.43
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.42	Fri Nov 19 06:38:53 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 07:09:49 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.42 2010/11/19 06:38:53 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.43 2010/11/19 07:09:49 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.42 2010/11/19 06:38:53 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.43 2010/11/19 07:09:49 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -311,20 +311,6 @@
 	round_page(memeof));
 	const int ridx = (origoffset - startoffset)  PAGE_SHIFT;
 
-#if 1
-	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
-		return genfs_do_getpages_xip_io(
-			ap-a_vp,
-			ap-a_offset,
-			ap-a_m,
-			ap-a_count,
-			ap-a_centeridx,
-			ap-a_access_type,
-			ap-a_advice,
-			ap-a_flags,
-			orignmempages);
-#endif
-
 	const int pgs_size = sizeof(struct vm_page *) *
 	((endoffset - startoffset)  PAGE_SHIFT);
 	struct vm_page **pgs, *pgs_onstack[UBC_MAX_PAGES];
@@ -373,6 +359,11 @@
 		goto startover;
 	}
 
+#if 1
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
+		goto find_pagecache_done;
+#endif
+
 	if (uvn_findpages(uobj, origoffset, npages, pgs[ridx],
 	async ? UFP_NOWAIT : UFP_ALL) != orignmempages) {
 		if (!glocked) {
@@ -478,8 +469,28 @@
 		}
 	}
 
+#if 1
+find_pagecache_done:
+#endif
+
 	mutex_exit(uobj-vmobjlock);
 
+#if 1
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0) {
+		error = genfs_do_getpages_xip_io(
+			ap-a_vp,
+			ap-a_offset,
+			ap-a_m,
+			ap-a_count,
+			ap-a_centeridx,
+			ap-a_access_type,
+			ap-a_advice,
+			ap-a_flags,
+			orignmempages);
+		goto out_err_free;
+	}
+#endif
+
 {
 	size_t bytes, iobytes, tailstart, tailbytes, totalbytes, skipbytes;
 	vaddr_t kva;
@@ -831,6 +842,7 @@
 	const int orignmempages)
 {
 	struct uvm_object * const uobj = vp-v_uobj;
+	const bool glocked = (flags  PGO_GLOCKHELD) != 0;
 
 	const int fs_bshift = vp2fs_bshift(vp);
 	const int dev_bshift = vp2dev_bshift(vp);
@@ -860,6 +872,8 @@
 
 	UVMHIST_FUNC(genfs_do_getpages_xip_io); UVMHIST_CALLED(ubchist);
 
+	KASSERT(glocked || genfs_node_rdlocked(vp));
+
 #if 0
 	GOP_SIZE(vp, vp-v_size, memeof, GOP_SIZE_MEM);
 	orignmempages = MIN(orignpages, round_page(memeof - origoffset)  PAGE_SHIFT);
@@ -938,6 +952,9 @@
 
 	mutex_exit(uobj-vmobjlock);
 
+	if (!glocked)
+		genfs_node_unlock(vp);
+
 	*npagesp = orignmempages;
 
 	return 0;
@@ -1535,7 +1552,7 @@
 		KASSERT(mutex_owned(uobj-vmobjlock));
 		mutex_exit(uobj-vmobjlock);
 		error = genfs_do_getpages_xip_io(vp, off, pgs, npages, 0,
-		VM_PROT_ALL, 0, 0, orignpages);
+		VM_PROT_ALL, 0, PGO_GLOCKHELD, orignpages);
 		KASSERT(error == 0);
 		KASSERT(npages == orignpages);
 		mutex_enter(uobj-vmobjlock);



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-17 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Thu Nov 18 01:53:05 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Style change.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.32 -r1.36.2.33 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.32 src/sys/miscfs/genfs/genfs_io.c:1.36.2.33
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.32	Tue Nov 16 07:44:25 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Thu Nov 18 01:53:04 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.32 2010/11/16 07:44:25 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.33 2010/11/18 01:53:04 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.32 2010/11/16 07:44:25 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.33 2010/11/18 01:53:04 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -900,15 +900,14 @@
 		struct vm_page *pg = pps[i];
 
 		KASSERT((pg-flags  PG_RDONLY) != 0);
-		if (pg == zero_page) {
-		} else {
-			KASSERT((pg-flags  PG_BUSY) == 0);
-			KASSERT((pg-flags  PG_CLEAN) != 0);
-			KASSERT((pg-flags  PG_DEVICE) != 0);
-			pg-flags |= PG_BUSY;
-			pg-flags = ~PG_FAKE;
-			pg-uobject = vp-v_uobj;
-		}
+		if (pg == zero_page)
+			continue;
+		KASSERT((pg-flags  PG_BUSY) == 0);
+		KASSERT((pg-flags  PG_CLEAN) != 0);
+		KASSERT((pg-flags  PG_DEVICE) != 0);
+		pg-flags |= PG_BUSY;
+		pg-flags = ~PG_FAKE;
+		pg-uobject = vp-v_uobj;
 	}
 
 	if ((flags  PGO_LOCKED) == 0)
@@ -1525,20 +1524,19 @@
 			pg = pgs[i];
 			if (pg == NULL || pg == PGO_DONTCARE)
 continue;
-			if (pg == uvm_page_zeropage) {
+			if (pg == uvm_page_zeropage)
 /* Do nothing for holes. */
-			} else {
-/*
- * Freeing normal XIP pages; nothing to do.
- */
-pmap_page_protect(pg, VM_PROT_NONE);
-KASSERT((pg-flags  PG_BUSY) != 0);
-KASSERT((pg-flags  PG_RDONLY) != 0);
-KASSERT((pg-flags  PG_CLEAN) != 0);
-KASSERT((pg-flags  PG_FAKE) == 0);
-KASSERT((pg-flags  PG_DEVICE) != 0);
-pg-flags = ~PG_BUSY;
-			}
+continue;
+			/*
+			 * Freeing normal XIP pages; nothing to do.
+			 */
+			pmap_page_protect(pg, VM_PROT_NONE);
+			KASSERT((pg-flags  PG_BUSY) != 0);
+			KASSERT((pg-flags  PG_RDONLY) != 0);
+			KASSERT((pg-flags  PG_CLEAN) != 0);
+			KASSERT((pg-flags  PG_FAKE) == 0);
+			KASSERT((pg-flags  PG_DEVICE) != 0);
+			pg-flags = ~PG_BUSY;
 		}
 		off += npages  PAGE_SHIFT;
 	}



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-11-04 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Thu Nov  4 07:31:27 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Remove a XXX comment which is only confusing.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.27 -r1.36.2.28 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.27 src/sys/miscfs/genfs/genfs_io.c:1.36.2.28
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.27	Fri Oct 22 07:22:34 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Thu Nov  4 07:31:27 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.27 2010/10/22 07:22:34 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.28 2010/11/04 07:31:27 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.27 2010/10/22 07:22:34 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.28 2010/11/04 07:31:27 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -781,9 +781,6 @@
  *  Return direct pages of XIP vnode.  The block addresses of XIP
  *  vnode pages are returned back to the VM fault handler as the
  *	actually mapped physical addresses.
- *
- * XXX Should be merged into genfs_do_getpages() after
- * XXX genfs_do_getpages() and genfs_do_io() are merged.
  */
 static int
 genfs_do_getpages_xip(void *v)



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-09-27 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Mon Sep 27 08:25:38 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
genfs_do_getpages_xip1: Adjust locking.  Although XIP never does real I/O,
it's called without PGO_LOCKED in some cases.  Leave vmobjlock unlocked in
that case.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.25 -r1.36.2.26 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.25 src/sys/miscfs/genfs/genfs_io.c:1.36.2.26
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.25	Sun Sep 26 15:18:11 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Mon Sep 27 08:25:37 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.25 2010/09/26 15:18:11 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.26 2010/09/27 08:25:37 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.25 2010/09/26 15:18:11 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.26 2010/09/27 08:25:37 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -832,8 +832,8 @@
 	UVMHIST_LOG(ubchist, xip npages=%d sbkoff=%lx ebkoff=%lx,
 	npages, (long)sbkoff, (long)ebkoff, 0);
 
-	if ((flags  PGO_LOCKED) == 0)
-		mutex_exit(uobj-vmobjlock);
+	KASSERT(mutex_owned(uobj-vmobjlock));
+	mutex_exit(uobj-vmobjlock);
 
 	off = offset;
 	for (i = 0; i  npages; i++) {
@@ -896,9 +896,7 @@
 		off += PAGE_SIZE;
 	}
 
-	if ((flags  PGO_LOCKED) == 0)
-		mutex_enter(uobj-vmobjlock);
-	KASSERT(mutex_owned(uobj-vmobjlock));
+	mutex_enter(uobj-vmobjlock);
 
 	for (i = 0; i  npages; i++) {
 		struct vm_page *pg = pps[i];
@@ -1519,10 +1517,12 @@
 			npages = maxpages;
 
 		orignpages = npages;
+		KASSERT(mutex_owned(uobj-vmobjlock));
 		error = genfs_do_getpages_xip1(vp, off, pgs, npages, 0,
 		VM_PROT_ALL, 0, PGO_LOCKED);
 		KASSERT(error == 0);
 		KASSERT(npages == orignpages);
+		KASSERT(mutex_owned(uobj-vmobjlock));
 		for (i = 0; i  npages; i++) {
 			pg = pgs[i];
 			if (pg == NULL || pg == PGO_DONTCARE)
@@ -1559,6 +1559,7 @@
 	KASSERT(uobj-uo_npages == 0);
 
 done:
+	KASSERT(mutex_owned(uobj-vmobjlock));
 	mutex_exit(uobj-vmobjlock);
 	return 0;
 }



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-09-26 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Sep 26 06:38:36 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Wrap long lines.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.22 -r1.36.2.23 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.22 src/sys/miscfs/genfs/genfs_io.c:1.36.2.23
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.22	Wed Aug 25 14:29:12 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Sep 26 06:38:36 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.22 2010/08/25 14:29:12 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.23 2010/09/26 06:38:36 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.22 2010/08/25 14:29:12 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.23 2010/09/26 06:38:36 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -817,9 +817,11 @@
 	dev_bsize = 1  dev_bshift;
 
 	sbkoff = offset  ~(fs_bsize - 1);
-	ebkoff = ((offset + PAGE_SIZE * npages) + (fs_bsize - 1))  ~(fs_bsize - 1);
+	ebkoff = ((offset + PAGE_SIZE * npages) + (fs_bsize - 1)) 
+	~(fs_bsize - 1);
 
-	UVMHIST_LOG(ubchist, xip npages=%d sbkoff=%lx ebkoff=%lx, npages, (long)sbkoff, (long)ebkoff, 0);
+	UVMHIST_LOG(ubchist, xip npages=%d sbkoff=%lx ebkoff=%lx,
+	npages, (long)sbkoff, (long)ebkoff, 0);
 
 	if ((flags  PGO_LOCKED) == 0)
 		mutex_exit(uobj-vmobjlock);
@@ -834,7 +836,8 @@
 
 		error = VOP_BMAP(vp, lbn, devvp, blkno, run);
 		KASSERT(error == 0);
-		UVMHIST_LOG(ubchist, xip VOP_BMAP: lbn=%ld blkno=%ld run=%d, (long)lbn, (long)blkno, run, 0);
+		UVMHIST_LOG(ubchist, xip VOP_BMAP: lbn=%ld blkno=%ld run=%d,
+		(long)lbn, (long)blkno, run, 0);
 
 		/*
 		 * XIP page metadata assignment
@@ -856,10 +859,12 @@
 			seg = devvp-v_physseg;
 			KASSERT(seg != NULL);
 			/* bus_space_mmap cookie - paddr_t */
-			seg_off = (blkno  dev_bshift) + (off - (lbn  fs_bshift));
+			seg_off = (blkno  dev_bshift) +
+			(off - (lbn  fs_bshift));
 			KASSERT((seg_off  PAGE_MASK) == 0);
 			pg = seg-pgs + (seg_off  PAGE_SHIFT);
-			KASSERT(pg-phys_addr == (seg-start  PAGE_SHIFT) + seg_off);
+			KASSERT(pg-phys_addr ==
+			(seg-start  PAGE_SHIFT) + seg_off);
 
 			pps[i] = pg;
 		}



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-09-26 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Sep 26 07:06:57 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Implement XIP putpages.  Invalidate MMU mappings of pages at the
request of PGO_FREE.  PGO_DEACTIVATE and PGO_CLEANIT do nothing, because
XIP pages are neither queued nor writable.

Allocate read-only zero page per vnode.  Put it at offset 0 of vnode's
uvm_object.  This per-vnode zero page is mapped to all hole pages of
the vnode.  If one of its mapped pages are forced to be PGO_FREE'ed,
all the mappings are invalidated.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.23 -r1.36.2.24 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.23 src/sys/miscfs/genfs/genfs_io.c:1.36.2.24
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.23	Sun Sep 26 06:38:36 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Sep 26 07:06:57 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.23 2010/09/26 06:38:36 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.24 2010/09/26 07:06:57 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.23 2010/09/26 06:38:36 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.24 2010/09/26 07:06:57 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -62,6 +62,10 @@
 static int genfs_do_getpages(void *);
 #ifdef XIP
 static int genfs_do_getpages_xip(void *);
+static int genfs_do_getpages_xip1(struct vnode *, voff_t, struct vm_page **,
+int *, int, vm_prot_t, int, int);
+static int genfs_do_putpages_xip(struct vnode *, off_t, off_t, int,
+struct vm_page **);
 #endif
 static int genfs_do_directio(struct vmspace *, vaddr_t, size_t, struct vnode *,
 off_t, enum uio_rw);
@@ -128,9 +132,8 @@
 		int a_advice;
 		int a_flags;
 	} */ * const ap = v;
-	struct vnode * const vp = ap-a_vp;
 
-	if ((vp-v_vflag  VV_XIP) != 0)
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
 		return genfs_do_getpages_xip(v);
 	else
 #endif
@@ -754,20 +757,6 @@
 }
 
 #ifdef XIP
-static struct uvm_object xip_zero_obj;
-static struct vm_page *xip_zero_page;
-
-static int
-xip_zero_page_init(void)
-{
-
-	UVM_OBJ_INIT(xip_zero_obj, NULL, 0);
-	xip_zero_page = uvm_pagealloc(xip_zero_obj, 0, NULL, UVM_PGA_ZERO);
-	KASSERT(xip_zero_page != NULL);
-	uvm_pagewire(xip_zero_page);
-	return 0;
-}
-
 /*
  * genfs_do_getpages_xip
  *  Return direct pages of XIP vnode.  The block addresses of XIP
@@ -791,18 +780,36 @@
 		int a_flags;
 	} */ * const ap = v;
 
-	struct vnode * const vp = ap-a_vp;
-	int *npagesp = ap-a_count;
-	const off_t offset = ap-a_offset;
-	struct vm_page **pps = ap-a_m;
+	return genfs_do_getpages_xip1(
+		ap-a_vp,
+		ap-a_offset,
+		ap-a_m,
+		ap-a_count,
+		ap-a_centeridx,
+		ap-a_access_type,
+		ap-a_advice,
+		ap-a_flags);
+}
+
+static int
+genfs_do_getpages_xip1(
+	struct vnode *vp,
+	voff_t offset,
+	struct vm_page **pps,
+	int *npagesp,
+	int centeridx,
+	vm_prot_t access_type,
+	int advice,
+	int flags)
+{
 	struct uvm_object * const uobj = vp-v_uobj;
-	const int flags = ap-a_flags;
 
 	int error;
 	off_t eof, sbkoff, ebkoff, off;
 	int npages;
 	int fs_bshift, fs_bsize, dev_bshift, dev_bsize;
 	int i;
+	struct vm_page *zero_page;
 
 	UVMHIST_FUNC(genfs_do_getpages_xip); UVMHIST_CALLED(ubchist);
 
@@ -820,6 +827,8 @@
 	ebkoff = ((offset + PAGE_SIZE * npages) + (fs_bsize - 1)) 
 	~(fs_bsize - 1);
 
+	zero_page = NULL;
+
 	UVMHIST_LOG(ubchist, xip npages=%d sbkoff=%lx ebkoff=%lx,
 	npages, (long)sbkoff, (long)ebkoff, 0);
 
@@ -847,10 +856,19 @@
 		 *   allocated and linearly ordered by physical address.
 		 */
 		if (blkno  0) {
-			static ONCE_DECL(xip_zero_page_inited);
+			zero_page = uvm_pagelookup(uobj, 0);
 
-			RUN_ONCE(xip_zero_page_inited, xip_zero_page_init);
-			pps[i] = xip_zero_page;
+			if (zero_page == NULL) {
+mutex_enter(uobj-vmobjlock);
+zero_page = uvm_pagealloc(uobj, 0, NULL,
+UVM_PGA_ZERO);
+mutex_exit(uobj-vmobjlock);
+KASSERT(zero_page != NULL);
+mutex_enter(uvm_pageqlock);
+uvm_pagewire(zero_page);
+mutex_exit(uvm_pageqlock);
+			}
+			pps[i] = zero_page;
 		} else {
 			struct vm_physseg *seg;
 			daddr_t seg_off;
@@ -885,7 +903,7 @@
 	for (i = 0; i  npages; i++) {
 		struct vm_page *pg = pps[i];
 
-		if (pg == xip_zero_page) {
+		if (pg == zero_page) {
 		} else {
 			KASSERT((pg-flags  PG_BUSY) == 0);
 			KASSERT((pg-flags  PG_RDONLY) != 0);
@@ -964,6 +982,12 @@
 		int a_flags;
 	} */ * const ap = v;
 
+#ifdef XIP
+	if ((ap-a_vp-v_vflag  VV_XIP) != 0)
+		return genfs_do_putpages_xip(ap-a_vp, ap-a_offlo, ap-a_offhi,
+		ap-a_flags, NULL);
+	else
+#endif
 	return genfs_do_putpages(ap-a_vp, ap-a_offlo, ap-a_offhi,
 	ap-a_flags, NULL);
 }
@@ -1429,6 +1453,115 @@
 

CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-09-26 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Sun Sep 26 15:18:12 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Minor fixes.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.24 -r1.36.2.25 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.24 src/sys/miscfs/genfs/genfs_io.c:1.36.2.25
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.24	Sun Sep 26 07:06:57 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Sun Sep 26 15:18:11 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.24 2010/09/26 07:06:57 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.25 2010/09/26 15:18:11 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.24 2010/09/26 07:06:57 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.25 2010/09/26 15:18:11 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -1459,7 +1459,9 @@
 int flags, struct vm_page **busypg)
 {
 	struct uvm_object *uobj = vp-v_uobj;
+#ifdef DIAGNOSTIC
 	struct genfs_node * const gp = VTOG(vp);
+#endif
 
 	UVMHIST_FUNC(genfs_do_putpages_xip); UVMHIST_CALLED(ubchist);
 
@@ -1487,10 +1489,10 @@
 	 * one file (vnode) has many holes and mapping its zero page to all
 	 * of those hole pages.
 	 *
-	 * We don't know which pages are currently mapped in the given vp,
-	 * because XIP pages are not added to vnode.  What we can is to locate
-	 * pages by querying the filesystem as done in getpages.  Call
-	 * genfs_do_getpages_xip().
+	 * We don't know which pages are currently mapped in the given vnode,
+	 * because XIP pages are not added to vnode.  What we can do is to
+	 * locate pages by querying the filesystem as done in getpages.  Call
+	 * genfs_do_getpages_xip1().
 	 */
 
 	off_t off, eof;



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-08-11 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Wed Aug 11 13:33:03 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
In XIP vnode pager, assert that filesystem blocks and pages are aligned.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.18 -r1.36.2.19 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.18 src/sys/miscfs/genfs/genfs_io.c:1.36.2.19
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.18	Thu Jul 22 07:49:46 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Wed Aug 11 13:33:03 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.18 2010/07/22 07:49:46 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.19 2010/08/11 13:33:03 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.18 2010/07/22 07:49:46 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.19 2010/08/11 13:33:03 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -846,6 +846,7 @@
 			KASSERT(seg != NULL);
 			/* bus_space_mmap cookie - paddr_t */
 			seg_off = (blkno  dev_bshift) + (off - (lbn  fs_bshift));
+			KASSERT((seg_off  PAGE_MASK) == 0);
 			pg = seg-pgs + (seg_off  PAGE_SHIFT);
 			KASSERT(pg-phys_addr == pmap_phys_address(seg-start) + seg_off);
 



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-08-11 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Thu Aug 12 02:53:10 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
vm_physseg::start is PFN, not mdpgno, so don't decode it using
pmap_phys_address().


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.19 -r1.36.2.20 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.19 src/sys/miscfs/genfs/genfs_io.c:1.36.2.20
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.19	Wed Aug 11 13:33:03 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Thu Aug 12 02:53:09 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.19 2010/08/11 13:33:03 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.20 2010/08/12 02:53:09 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.19 2010/08/11 13:33:03 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.20 2010/08/12 02:53:09 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -848,7 +848,7 @@
 			seg_off = (blkno  dev_bshift) + (off - (lbn  fs_bshift));
 			KASSERT((seg_off  PAGE_MASK) == 0);
 			pg = seg-pgs + (seg_off  PAGE_SHIFT);
-			KASSERT(pg-phys_addr == pmap_phys_address(seg-start) + seg_off);
+			KASSERT(pg-phys_addr == (seg-start  PAGE_SHIFT) + seg_off);
 
 			pps[i] = pg;
 		}



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-07-20 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Tue Jul 20 15:43:48 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
genfs_do_getpages_xip: Simplify code.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.16 -r1.36.2.17 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.16 src/sys/miscfs/genfs/genfs_io.c:1.36.2.17
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.16	Thu Jul 15 14:13:11 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Tue Jul 20 15:43:48 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.16 2010/07/15 14:13:11 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.17 2010/07/20 15:43:48 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.16 2010/07/15 14:13:11 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.17 2010/07/20 15:43:48 uebayasi Exp $);
 
 #include opt_xip.h
 
@@ -791,7 +791,6 @@
 	int npages;
 	int fs_bshift, fs_bsize, dev_bshift, dev_bsize;
 	int i;
-	paddr_t phys_addr;
 
 	UVMHIST_FUNC(genfs_do_getpages_xip); UVMHIST_CALLED(ubchist);
 
@@ -840,24 +839,22 @@
 			pps[i] = xip_zero_page;
 		} else {
 			struct vm_physseg *seg;
+			daddr_t seg_off;
 			struct vm_page *pg;
 
 			seg = devvp-v_physseg;
 			KASSERT(seg != NULL);
 			/* bus_space_mmap cookie - paddr_t */
-			phys_addr = pmap_phys_address(seg-start) +
-			(blkno  dev_bshift) +
-			(off - (lbn  fs_bshift));
-			pg = seg-pgs +
-			((phys_addr  PAGE_SHIFT) - seg-start);
-			KASSERT(pg-phys_addr == phys_addr);
+			seg_off = (blkno  dev_bshift) + (off - (lbn  fs_bshift));
+			pg = seg-pgs + (seg_off  PAGE_SHIFT);
+			KASSERT(pg-phys_addr == pmap_phys_address(seg-start) + seg_off);
 
 			pps[i] = pg;
 		}
 
 		UVMHIST_LOG(ubchist, xip pgs %d = phys_addr=0x%lx (%p),
 			i,
-			(long)phys_addr,
+			(long)pg-phys_addr,
 			pps[i],
 			0);
 



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-07-09 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Fri Jul  9 12:57:42 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
opt_direct_page.h is no more.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.13 -r1.36.2.14 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.13 src/sys/miscfs/genfs/genfs_io.c:1.36.2.14
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.13	Fri Jul  9 12:49:21 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Jul  9 12:57:42 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.13 2010/07/09 12:49:21 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.14 2010/07/09 12:57:42 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,9 +31,8 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.13 2010/07/09 12:49:21 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.14 2010/07/09 12:57:42 uebayasi Exp $);
 
-#include opt_direct_page.h
 #include opt_xip.h
 
 #include sys/param.h



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-06-07 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Mon Jun  7 16:57:17 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Comment.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.8 -r1.36.2.9 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.8 src/sys/miscfs/genfs/genfs_io.c:1.36.2.9
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.8	Mon May 31 13:26:37 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Mon Jun  7 16:57:17 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.8 2010/05/31 13:26:37 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.9 2010/06/07 16:57:17 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.8 2010/05/31 13:26:37 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.9 2010/06/07 16:57:17 uebayasi Exp $);
 
 #include opt_direct_page.h
 #include opt_xip.h
@@ -743,7 +743,15 @@
 }
 
 #ifdef XIP
-/* XXX should be merged into genfs_do_getpages() */
+/*
+ * genfs_do_getpages_xip
+ *  Return direct pages of XIP vnode.  The block addresses of XIP
+ *  vnode pages are returned back to the VM fault handler as the
+ *	actually mapped physical addresses.
+ *
+ * XXX Should be merged into genfs_do_getpages() after
+ * XXX genfs_do_getpages() and genfs_do_io() are merged.
+ */
 static int
 genfs_do_getpages_xip(void *v)
 {



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-06-07 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Tue Jun  8 03:30:00 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Comment.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.9 -r1.36.2.10 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.9 src/sys/miscfs/genfs/genfs_io.c:1.36.2.10
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.9	Mon Jun  7 16:57:17 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Tue Jun  8 03:30:00 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.9 2010/06/07 16:57:17 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.10 2010/06/08 03:30:00 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.9 2010/06/07 16:57:17 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.10 2010/06/08 03:30:00 uebayasi Exp $);
 
 #include opt_direct_page.h
 #include opt_xip.h
@@ -114,7 +114,6 @@
 	} */ * const ap = v;
 	struct vnode * const vp = ap-a_vp;
 
-	/* XXX should be merged into genfs_do_getpages() */
 	if ((vp-v_vflag  VV_XIP) != 0)
 		return genfs_do_getpages_xip(v);
 	else
@@ -784,8 +783,6 @@
 
 	KASSERT((vp-v_vflag  VV_XIP) != 0);
 
-	/* XXXUEBS should we care about PGO_LOCKED? */
-
 	GOP_SIZE(vp, vp-v_size, eof, GOP_SIZE_MEM);
 	npages = MIN(*npagesp, round_page(eof - offset)  PAGE_SHIFT);
 



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-03-17 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Wed Mar 17 16:09:17 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
Put comments to reflect my intent about genfs_do_getpages_xip method.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.4 -r1.36.2.5 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.4 src/sys/miscfs/genfs/genfs_io.c:1.36.2.5
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.4	Sun Feb 28 06:29:19 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Wed Mar 17 16:09:17 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.4 2010/02/28 06:29:19 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.5 2010/03/17 16:09:17 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,7 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.4 2010/02/28 06:29:19 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.5 2010/03/17 16:09:17 uebayasi Exp $);
 
 #include opt_device_page.h
 #include opt_xip.h
@@ -114,6 +114,7 @@
 	} */ * const ap = v;
 	struct vnode * const vp = ap-a_vp;
 
+	/* XXX should be merged into genfs_do_getpages() */
 	if ((vp-v_vflag  VV_XIP) != 0)
 		return genfs_do_getpages_xip(v);
 	else
@@ -742,6 +743,7 @@
 }
 
 #ifdef XIP
+/* XXX should be merged into genfs_do_getpages() */
 static int
 genfs_do_getpages_xip(void *v)
 {



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-02-22 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Tue Feb 23 07:46:28 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
genfs_do_getpages_xip: Drop vmobjlock before calling VOP_BMAP, otherwise
deadlock.  No idea how this worked for me before.

Directly call uvm_phys_to_vm_page_device() to make a device page cookie.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.1 -r1.36.2.2 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.1 src/sys/miscfs/genfs/genfs_io.c:1.36.2.2
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.1	Thu Feb 11 06:23:04 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Tue Feb 23 07:46:28 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.1 2010/02/11 06:23:04 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.2 2010/02/23 07:46:28 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,8 +31,9 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.1 2010/02/11 06:23:04 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.2 2010/02/23 07:46:28 uebayasi Exp $);
 
+#include opt_device_page.h
 #include opt_xip.h
 
 #include sys/param.h
@@ -767,9 +768,9 @@
 	int i;
 	paddr_t phys_addr;
 
-	KASSERT((vp-v_vflag  VV_XIP) != 0);
+	UVMHIST_FUNC(genfs_do_getpages_xip); UVMHIST_CALLED(ubchist);
 
-	UVMHIST_LOG(ubchist, xip!, 0, 0, 0, 0);
+	KASSERT((vp-v_vflag  VV_XIP) != 0);
 
 	/* XXXUEBS should we care about PGO_LOCKED? */
 
@@ -786,6 +787,9 @@
 
 	UVMHIST_LOG(ubchist, xip npages=%d sbkoff=%lx ebkoff=%lx, npages, (long)sbkoff, (long)ebkoff, 0);
 
+	if ((flags  PGO_LOCKED) == 0)
+		mutex_exit(uobj-vmobjlock);
+
 	/* XXX optimize */
 	off = offset;
 	i = 0;
@@ -809,17 +813,13 @@
 			(off - (lbn  fs_bshift));
 		}
 
-		pps[i] = PHYS_TO_VM_PAGE(phys_addr);
+		pps[i] = uvm_phys_to_vm_page_device(phys_addr);
 
 		UVMHIST_LOG(ubchist, xip pgs %d = phys_addr=0x%lx (%p),
 			i,
 			(long)phys_addr,
 			pps[i],
 			0);
-		printf(xip pgs %d = phys_addr=0x%lx (%p)\n,
-			i,
-			(long)phys_addr,
-			pps[i]);
 
 		off += PAGE_SIZE;
 		i++;
@@ -827,9 +827,6 @@
 
 	*npagesp = i;
 
-	if ((flags  PGO_LOCKED) == 0)
-		mutex_exit(uobj-vmobjlock);
-
 	return 0;
 }
 #endif



CVS commit: [uebayasi-xip] src/sys/miscfs/genfs

2010-02-10 Thread Masao Uebayashi
Module Name:src
Committed By:   uebayasi
Date:   Thu Feb 11 06:23:04 UTC 2010

Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c

Log Message:
genfs_getpages() for XIP.

Pages are directly mappable, and always there.  What we need to do here is
to address filesystem blocks and tell those addresses back to the fault
handler by encoding the physical addresses in struct vm_page * pointers.

(I hate code duplication.  What can I do?)


To generate a diff of this commit:
cvs rdiff -u -r1.36 -r1.36.2.1 src/sys/miscfs/genfs/genfs_io.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/miscfs/genfs/genfs_io.c
diff -u src/sys/miscfs/genfs/genfs_io.c:1.36 src/sys/miscfs/genfs/genfs_io.c:1.36.2.1
--- src/sys/miscfs/genfs/genfs_io.c:1.36	Sat Jan 30 12:06:20 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Thu Feb 11 06:23:04 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36 2010/01/30 12:06:20 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.1 2010/02/11 06:23:04 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -31,7 +31,9 @@
  */
 
 #include sys/cdefs.h
-__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36 2010/01/30 12:06:20 uebayasi Exp $);
+__KERNEL_RCSID(0, $NetBSD: genfs_io.c,v 1.36.2.1 2010/02/11 06:23:04 uebayasi Exp $);
+
+#include opt_xip.h
 
 #include sys/param.h
 #include sys/systm.h
@@ -56,6 +58,8 @@
 #include uvm/uvm.h
 #include uvm/uvm_pager.h
 
+static int genfs_do_getpages(void *);
+static int genfs_do_getpages_xip(void *);
 static int genfs_do_directio(struct vmspace *, vaddr_t, size_t, struct vnode *,
 off_t, enum uio_rw);
 static void genfs_dio_iodone(struct buf *);
@@ -104,6 +108,29 @@
 		int a_advice;
 		int a_flags;
 	} */ * const ap = v;
+	struct vnode * const vp = ap-a_vp;
+
+#ifdef XIP
+	if ((vp-v_vflag  VV_XIP) != 0)
+		return genfs_do_getpages_xip(v);
+	else
+#endif
+		return genfs_do_getpages(v);
+}
+
+static int
+genfs_do_getpages(void *v)
+{
+	struct vop_getpages_args /* {
+		struct vnode *a_vp;
+		voff_t a_offset;
+		struct vm_page **a_m;
+		int *a_count;
+		int a_centeridx;
+		vm_prot_t a_access_type;
+		int a_advice;
+		int a_flags;
+	} */ * const ap = v;
 
 	off_t diskeof, memeof;
 	int i, error, npages;
@@ -711,6 +738,102 @@
 	return (error);
 }
 
+#ifdef XIP
+static int
+genfs_do_getpages_xip(void *v)
+{
+	struct vop_getpages_args /* {
+		struct vnode *a_vp;
+		voff_t a_offset;
+		struct vm_page **a_m;
+		int *a_count;
+		int a_centeridx;
+		vm_prot_t a_access_type;
+		int a_advice;
+		int a_flags;
+	} */ * const ap = v;
+
+	struct vnode * const vp = ap-a_vp;
+	int *npagesp = ap-a_count;
+	const off_t offset = ap-a_offset;
+	struct vm_page **pps = ap-a_m;
+	struct uvm_object * const uobj = vp-v_uobj;
+	const int flags = ap-a_flags;
+
+	int error;
+	off_t eof, sbkoff, ebkoff, off;
+	int npages;
+	int fs_bshift, fs_bsize, dev_bshift, dev_bsize;
+	int i;
+	paddr_t phys_addr;
+
+	KASSERT((vp-v_vflag  VV_XIP) != 0);
+
+	UVMHIST_LOG(ubchist, xip!, 0, 0, 0, 0);
+
+	/* XXXUEBS should we care about PGO_LOCKED? */
+
+	GOP_SIZE(vp, vp-v_size, eof, GOP_SIZE_MEM);
+	npages = MIN(*npagesp, round_page(eof - offset)  PAGE_SHIFT);
+
+	fs_bshift = vp-v_mount-mnt_fs_bshift;
+	fs_bsize = 1  fs_bshift;
+	dev_bshift = vp-v_mount-mnt_dev_bshift;
+	dev_bsize = 1  dev_bshift;
+
+	sbkoff = offset  ~(fs_bsize - 1);
+	ebkoff = ((offset + PAGE_SIZE * npages) + (fs_bsize - 1))  ~(fs_bsize - 1);
+
+	UVMHIST_LOG(ubchist, xip npages=%d sbkoff=%lx ebkoff=%lx, npages, (long)sbkoff, (long)ebkoff, 0);
+
+	/* XXX optimize */
+	off = offset;
+	i = 0;
+	while (i  npages) {
+		daddr_t lbn, blkno;
+		int run;
+		struct vnode *devvp;
+
+		lbn = (off  ~(fs_bsize - 1))  fs_bshift;
+
+		error = VOP_BMAP(vp, lbn, devvp, blkno, run);
+		KASSERT(error == 0);
+		UVMHIST_LOG(ubchist, xip VOP_BMAP: lbn=%ld blkno=%ld run=%d, (long)lbn, (long)blkno, run, 0);
+
+		if (blkno  0) {
+			/* unallocated page is redirected to read-only zero-filled page */
+			phys_addr = uvm_pageofzero_xip_phys_addr();
+		} else {
+			phys_addr = vp-v_mount-mnt_phys_addr +
+			(blkno  dev_bshift) +
+			(off - (lbn  fs_bshift));
+		}
+
+		pps[i] = PHYS_TO_VM_PAGE(phys_addr);
+
+		UVMHIST_LOG(ubchist, xip pgs %d = phys_addr=0x%lx (%p),
+			i,
+			(long)phys_addr,
+			pps[i],
+			0);
+		printf(xip pgs %d = phys_addr=0x%lx (%p)\n,
+			i,
+			(long)phys_addr,
+			pps[i]);
+
+		off += PAGE_SIZE;
+		i++;
+	}
+
+	*npagesp = i;
+
+	if ((flags  PGO_LOCKED) == 0)
+		mutex_exit(uobj-vmobjlock);
+
+	return 0;
+}
+#endif
+
 /*
  * generic VM putpages routine.
  * Write the given range of pages to backing store.