Source-Changes-HG archive

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

[src/trunk]: src/sys/miscfs/genfs Reduce the diff between genfs_getpages() an...



details:   https://anonhg.NetBSD.org/src/rev/ce071d7c6fc3
branches:  trunk
changeset: 751256:ce071d7c6fc3
user:      uebayasi <uebayasi%NetBSD.org@localhost>
date:      Sat Jan 30 12:06:20 2010 +0000

description:
Reduce the diff between genfs_getpages() and genfs_do_io().  These should be
merged eventually.

diffstat:

 sys/miscfs/genfs/genfs_io.c |  61 ++++++++++++++++++++++++++++++++++----------
 1 files changed, 47 insertions(+), 14 deletions(-)

diffs (150 lines):

diff -r 34ea2e0c52c9 -r ce071d7c6fc3 sys/miscfs/genfs/genfs_io.c
--- a/sys/miscfs/genfs/genfs_io.c       Sat Jan 30 11:57:17 2010 +0000
+++ b/sys/miscfs/genfs/genfs_io.c       Sat Jan 30 12:06:20 2010 +0000
@@ -1,4 +1,4 @@
-/*     $NetBSD: genfs_io.c,v 1.35 2010/01/30 05:19:20 uebayasi Exp $   */
+/*     $NetBSD: genfs_io.c,v 1.36 2010/01/30 12:06:20 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.35 2010/01/30 05:19:20 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36 2010/01/30 12:06:20 uebayasi Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -490,8 +490,9 @@
                error = VOP_BMAP(vp, lbn, &devvp, &blkno, &run);
                if (error) {
                        UVMHIST_LOG(ubchist, "VOP_BMAP lbn 0x%x -> %d\n",
-                           lbn, error,0,0);
+                           lbn,error,0,0);
                        skipbytes += bytes;
+                       bytes = 0;
                        goto loopdone;
                }
 
@@ -521,7 +522,7 @@
                 * mark the pages we zeroed PG_RDONLY.
                 */
 
-               if (blkno < 0) {
+               if (blkno == (daddr_t)-1) {
                        int holepages = (round_page(offset + iobytes) -
                            trunc_page(offset)) >> PAGE_SHIFT;
                        UVMHIST_LOG(ubchist, "lbn 0x%x -> HOLE", lbn,0,0,0);
@@ -551,6 +552,8 @@
                if (offset == startoffset && iobytes == bytes) {
                        bp = mbp;
                } else {
+                       UVMHIST_LOG(ubchist, "vp %p bp %p num now %d",
+                           vp, bp, vp->v_numoutput, 0);
                        bp = getiobuf(vp, true);
                        nestiobuf_setup(mbp, bp, offset - startoffset, iobytes);
                }
@@ -562,7 +565,7 @@
 
                UVMHIST_LOG(ubchist,
                    "bp %p offset 0x%x bcount 0x%x blkno 0x%x",
-                   bp, offset, iobytes, bp->b_blkno);
+                   bp, offset, bp->b_bcount, bp->b_blkno);
 
                VOP_STRATEGY(devvp, bp);
        }
@@ -1283,13 +1286,11 @@
 genfs_do_io(struct vnode *vp, off_t off, vaddr_t kva, size_t len, int flags,
     enum uio_rw rw, void (*iodone)(struct buf *))
 {
-       int s, error, run;
+       int s, error;
        int fs_bshift, dev_bshift;
        off_t eof, offset, startoffset;
        size_t bytes, iobytes, skipbytes;
-       daddr_t lbn, blkno;
        struct buf *mbp, *bp;
-       struct vnode *devvp;
        const bool async = (flags & PGO_SYNCIO) == 0;
        const bool iowrite = rw == UIO_WRITE;
        const int brw = iowrite ? B_WRITE : B_READ;
@@ -1343,27 +1344,56 @@
        for (offset = startoffset;
            bytes > 0;
            offset += iobytes, bytes -= iobytes) {
+               int run;
+               daddr_t lbn, blkno;
+               struct vnode *devvp;
+
+               /*
+                * bmap the file to find out the blkno to read from and
+                * how much we can read in one i/o.  if bmap returns an error,
+                * skip the rest of the top-level i/o.
+                */
+
                lbn = offset >> fs_bshift;
                error = VOP_BMAP(vp, lbn, &devvp, &blkno, &run);
                if (error) {
-                       UVMHIST_LOG(ubchist, "VOP_BMAP() -> %d", error,0,0,0);
+                       UVMHIST_LOG(ubchist, "VOP_BMAP lbn 0x%x -> %d\n",
+                           lbn,error,0,0);
                        skipbytes += bytes;
                        bytes = 0;
-                       break;
+                       goto loopdone;
                }
 
+               /*
+                * see how many pages can be read with this i/o.
+                * reduce the i/o size if necessary to avoid
+                * overwriting pages with valid data.
+                */
+
                iobytes = MIN((((off_t)lbn + 1 + run) << fs_bshift) - offset,
                    bytes);
+
+               /*
+                * if this block isn't allocated, zero it instead of
+                * reading it.  unless we are going to allocate blocks,
+                * mark the pages we zeroed PG_RDONLY.
+                */
+
                if (blkno == (daddr_t)-1) {
                        if (!iowrite) {
                                memset((char *)kva + (offset - startoffset), 0,
-                                  iobytes);
+                                   iobytes);
                        }
                        skipbytes += iobytes;
                        continue;
                }
 
-               /* if it's really one i/o, don't make a second buf */
+               /*
+                * 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.
+                */
+
                if (offset == startoffset && iobytes == bytes) {
                        bp = mbp;
                } else {
@@ -1377,12 +1407,15 @@
                /* adjust physical blkno for partial blocks */
                bp->b_blkno = blkno + ((offset - ((off_t)lbn << fs_bshift)) >>
                    dev_bshift);
+
                UVMHIST_LOG(ubchist,
-                   "vp %p offset 0x%x bcount 0x%x blkno 0x%x",
-                   vp, offset, bp->b_bcount, bp->b_blkno);
+                   "bp %p offset 0x%x bcount 0x%x blkno 0x%x",
+                   bp, offset, bp->b_bcount, bp->b_blkno);
 
                VOP_STRATEGY(devvp, bp);
        }
+
+loopdone:
        if (skipbytes) {
                UVMHIST_LOG(ubchist, "skipbytes %d", skipbytes, 0,0,0);
        }



Home | Main Index | Thread Index | Old Index