Module Name:    src
Committed By:   uebayasi
Date:           Fri Nov 19 01:44:48 UTC 2010

Modified Files:
        src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c
        src/sys/uvm [uebayasi-xip]: uvm_fault.c

Log Message:
Make XIP genfs_getpages_xip() return pages in I/O path, preparing
merge into the generic genfs_getpages().


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.34 -r1.36.2.35 src/sys/miscfs/genfs/genfs_io.c
cvs rdiff -u -r1.166.2.22 -r1.166.2.23 src/sys/uvm/uvm_fault.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.34 src/sys/miscfs/genfs/genfs_io.c:1.36.2.35
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.34	Thu Nov 18 16:16:36 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Nov 19 01:44:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.34 2010/11/18 16:16:36 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.35 2010/11/19 01:44:47 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.34 2010/11/18 16:16:36 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36.2.35 2010/11/19 01:44:47 uebayasi Exp $");
 
 #include "opt_xip.h"
 
@@ -64,6 +64,8 @@
 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,
     struct vm_page **);
 #endif
@@ -797,6 +799,8 @@
 		int a_flags;
 	} */ * const ap = v;
 
+	UVMHIST_FUNC("genfs_do_getpages_xip"); UVMHIST_CALLED(ubchist);
+
 	return genfs_do_getpages_xip1(
 		ap->a_vp,
 		ap->a_offset,
@@ -819,6 +823,35 @@
 	int advice,
 	int flags)
 {
+
+	KASSERT((vp->v_vflag & VV_XIP) != 0);
+
+	if ((flags & PGO_LOCKED) != 0) {
+		*npagesp = 0;
+		return 0;
+	} else
+		return genfs_do_getpages_xip_io(
+			vp,
+			offset,
+			pps,
+			npagesp,
+			centeridx,
+			access_type,
+			advice,
+			flags);
+}
+
+static int
+genfs_do_getpages_xip_io(
+	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;
 
 	int error;
@@ -828,9 +861,7 @@
 	int i;
 	struct vm_page *zero_page;
 
-	UVMHIST_FUNC("genfs_do_getpages_xip"); UVMHIST_CALLED(ubchist);
-
-	KASSERT((vp->v_vflag & VV_XIP) != 0);
+	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);

Index: src/sys/uvm/uvm_fault.c
diff -u src/sys/uvm/uvm_fault.c:1.166.2.22 src/sys/uvm/uvm_fault.c:1.166.2.23
--- src/sys/uvm/uvm_fault.c:1.166.2.22	Thu Nov  4 08:47:38 2010
+++ src/sys/uvm/uvm_fault.c	Fri Nov 19 01:44:47 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_fault.c,v 1.166.2.22 2010/11/04 08:47:38 uebayasi Exp $	*/
+/*	$NetBSD: uvm_fault.c,v 1.166.2.23 2010/11/19 01:44:47 uebayasi Exp $	*/
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.22 2010/11/04 08:47:38 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.23 2010/11/19 01:44:47 uebayasi Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_xip.h"
@@ -1867,9 +1867,11 @@
 
 	KASSERT((pg->flags & PG_BUSY) != 0);
 
-	mutex_enter(&uvm_pageqlock);
-	uvm_pageactivate(pg);
-	mutex_exit(&uvm_pageqlock);
+	if ((pg->flags & PG_DEVICE) == 0) {
+		mutex_enter(&uvm_pageqlock);
+		uvm_pageactivate(pg);
+		mutex_exit(&uvm_pageqlock);
+	}
 
 	/*
 	 * re-verify the state of the world by first trying to relock

Reply via email to