CVS commit: [uebayasi-xip] src/sys/miscfs/genfs
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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.