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 - origoffset == (i - ridx) << PAGE_SHIFT); - blk_off = blkno << dev_bshift; - fs_off = off - (lbn << fs_bshift); + const daddr_t pg_off = (i - ridx) << PAGE_SHIFT; pps[i] = uvn_findpage_xip(devvp, &vp->v_uobj, - blk_off + fs_off); + blk_off + fs_off + pg_off); KASSERT(pps[i] != NULL); }