Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/uebayasi-xip]: src/sys/miscfs/genfs Snapshot of getpages BMAP loop merge.



details:   https://anonhg.NetBSD.org/src/rev/1288965f4927
branches:  uebayasi-xip
changeset: 751879:1288965f4927
user:      uebayasi <uebayasi%NetBSD.org@localhost>
date:      Sat Nov 20 03:00:42 2010 +0000

description:
Snapshot of getpages BMAP loop merge.

diffstat:

 sys/miscfs/genfs/genfs_io.c |  86 ++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 77 insertions(+), 9 deletions(-)

diffs (204 lines):

diff -r 211e2bc8e124 -r 1288965f4927 sys/miscfs/genfs/genfs_io.c
--- a/sys/miscfs/genfs/genfs_io.c       Fri Nov 19 15:25:37 2010 +0000
+++ b/sys/miscfs/genfs/genfs_io.c       Sat Nov 20 03:00:42 2010 +0000
@@ -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);
                }
 



Home | Main Index | Thread Index | Old Index