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