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_ */

Reply via email to