Module Name: src
Committed By: uebayasi
Date: Tue Jul 6 07:20:27 UTC 2010
Modified Files:
src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c
src/sys/uvm [uebayasi-xip]: uvm_km.c uvm_km.h
Log Message:
Directly allocate zero'ed vm_page for XIP unallocated blocks, instead
of abusing pool page. Move the code to XIP vnode pager in genfs_io.c.
To generate a diff of this commit:
cvs rdiff -u -r1.36.2.10 -r1.36.2.11 src/sys/miscfs/genfs/genfs_io.c
cvs rdiff -u -r1.104.2.4 -r1.104.2.5 src/sys/uvm/uvm_km.c
cvs rdiff -u -r1.18.6.1 -r1.18.6.2 src/sys/uvm/uvm_km.h
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.10 src/sys/miscfs/genfs/genfs_io.c:1.36.2.11
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.10 Tue Jun 8 03:30:00 2010
+++ src/sys/miscfs/genfs/genfs_io.c Tue Jul 6 07:20:27 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: genfs_io.c,v 1.36.2.10 2010/06/08 03:30:00 uebayasi Exp $ */
+/* $NetBSD: genfs_io.c,v 1.36.2.11 2010/07/06 07:20:27 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.10 2010/06/08 03:30:00 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36.2.11 2010/07/06 07:20:27 uebayasi Exp $");
#include "opt_direct_page.h"
#include "opt_xip.h"
@@ -51,6 +51,7 @@
#include <sys/kauth.h>
#include <sys/fstrans.h>
#include <sys/buf.h>
+#include <sys/once.h>
#include <miscfs/genfs/genfs.h>
#include <miscfs/genfs/genfs_node.h>
@@ -742,6 +743,20 @@
}
#ifdef XIP
+static struct uvm_object xip_zero_obj;
+static struct vm_page *xip_zero_page;
+
+static int
+xip_zero_page_init(void)
+{
+
+ UVM_OBJ_INIT(&xip_zero_obj, NULL, 0);
+ xip_zero_page = uvm_pagealloc(&xip_zero_obj, 0, NULL, UVM_PGA_ZERO);
+ KASSERT(xip_zero_page != NULL);
+ uvm_pagewire(xip_zero_page);
+ return 0;
+}
+
/*
* genfs_do_getpages_xip
* Return "direct pages" of XIP vnode. The block addresses of XIP
@@ -814,8 +829,10 @@
UVMHIST_LOG(ubchist, "xip VOP_BMAP: lbn=%ld blkno=%ld run=%d", (long)lbn, (long)blkno, run, 0);
if (blkno < 0) {
- /* unallocated page is redirected to read-only zero-filled page */
- phys_addr = uvm_pageofzero_xip_phys_addr();
+ static ONCE_DECL(xip_zero_page_inited);
+
+ RUN_ONCE(&xip_zero_page_inited, xip_zero_page_init);
+ phys_addr = xip_zero_page->phys_addr;
} else {
struct vm_physseg *seg;
Index: src/sys/uvm/uvm_km.c
diff -u src/sys/uvm/uvm_km.c:1.104.2.4 src/sys/uvm/uvm_km.c:1.104.2.5
--- src/sys/uvm/uvm_km.c:1.104.2.4 Mon May 31 13:26:38 2010
+++ src/sys/uvm/uvm_km.c Tue Jul 6 07:20:26 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_km.c,v 1.104.2.4 2010/05/31 13:26:38 uebayasi Exp $ */
+/* $NetBSD: uvm_km.c,v 1.104.2.5 2010/07/06 07:20:26 uebayasi Exp $ */
/*
* Copyright (c) 1997 Charles D. Cranor and Washington University.
@@ -127,7 +127,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.104.2.4 2010/05/31 13:26:38 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1.104.2.5 2010/07/06 07:20:26 uebayasi Exp $");
#include "opt_uvmhist.h"
#include "opt_direct_page.h"
@@ -795,50 +795,3 @@
uvm_km_free(map, addr, PAGE_SIZE, UVM_KMF_WIRED);
#endif /* PMAP_UNMAP_POOLPAGE */
}
-
-#ifdef XIP
-/*
- * uvm_pageofzero_xip: return a read-only page filled with zeroes.
- *
- * XXXUEBS Need better names.
- */
-
-static void *uvm_pageofzero_xip_vaddr;
-static paddr_t uvm_pageofzero_xip_paddr;
-static int uvm_pageofzero_xip_init(void);
-
-void *
-uvm_pageofzero_xip(void)
-{
- static ONCE_DECL(uvm_pageofzero_xip_inited);
-
- RUN_ONCE(&uvm_pageofzero_xip_inited, uvm_pageofzero_xip_init);
- return uvm_pageofzero_xip_vaddr;
-}
-
-paddr_t
-uvm_pageofzero_xip_phys_addr(void)
-{
- static ONCE_DECL(uvm_pageofzero_xip_inited);
-
- RUN_ONCE(&uvm_pageofzero_xip_inited, uvm_pageofzero_xip_init);
- return uvm_pageofzero_xip_paddr;
-}
-
-static int
-uvm_pageofzero_xip_init(void)
-{
- bool rv;
-
- ASSERT_SLEEPABLE();
-
- uvm_pageofzero_xip_vaddr = (void *)uvm_km_alloc_poolpage(kernel_map, true);
- KASSERT(uvm_pageofzero_xip_vaddr != NULL);
-
- rv = pmap_extract(pmap_kernel(), (vaddr_t)uvm_pageofzero_xip_vaddr,
- &uvm_pageofzero_xip_paddr);
- KASSERT(rv == true && uvm_pageofzero_xip_paddr != 0);
-
- return 0;
-}
-#endif
Index: src/sys/uvm/uvm_km.h
diff -u src/sys/uvm/uvm_km.h:1.18.6.1 src/sys/uvm/uvm_km.h:1.18.6.2
--- src/sys/uvm/uvm_km.h:1.18.6.1 Wed Feb 10 08:12:02 2010
+++ src/sys/uvm/uvm_km.h Tue Jul 6 07:20:27 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: uvm_km.h,v 1.18.6.1 2010/02/10 08:12:02 uebayasi Exp $ */
+/* $NetBSD: uvm_km.h,v 1.18.6.2 2010/07/06 07:20:27 uebayasi Exp $ */
/*
*
@@ -57,11 +57,6 @@
#endif /* defined(DEBUG) */
void uvm_km_va_drain(struct vm_map *, uvm_flag_t);
-#ifdef XIP
-void *uvm_pageofzero_xip(void);
-paddr_t uvm_pageofzero_xip_phys_addr(void);
-#endif
-
#endif /* _KERNEL */
#endif /* _UVM_UVM_KM_H_ */