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);
+	UVMHIST_LOG(ubchist, "xip npages=%d startoffset=%lx endoffset=%lx",
+	    orignmempages, (long)startoffset, (long)endoffset, 0);
 
-	off = offset;
-	for (i = 0; i < npages; i++) {
+	off = origoffset;
+	for (i = 0; i < orignmempages; i++) {
 		daddr_t lbn, blkno;
 		int run;
 		struct vnode *devvp;
@@ -891,7 +924,7 @@
 
 	mutex_enter(&uobj->vmobjlock);
 
-	for (i = 0; i < npages; i++) {
+	for (i = 0; i < orignmempages; i++) {
 		struct vm_page *pg = pps[i];
 
 		KASSERT((pg->flags & PG_RDONLY) != 0);
@@ -905,7 +938,7 @@
 
 	mutex_exit(&uobj->vmobjlock);
 
-	*npagesp = npages;
+	*npagesp = orignmempages;
 
 	return 0;
 }
@@ -1502,7 +1535,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);
+		    VM_PROT_ALL, 0, 0, orignpages);
 		KASSERT(error == 0);
 		KASSERT(npages == orignpages);
 		mutex_enter(&uobj->vmobjlock);

Reply via email to