Module Name:    src
Committed By:   uebayasi
Date:           Fri Jul  9 12:49:21 UTC 2010

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

Log Message:
Mark XIP pages as PG_CLEAN and/or PG_BUSY when appropriate.  Protect
vnode lock when vm_page::flags is manipulated.


To generate a diff of this commit:
cvs rdiff -u -r1.36.2.12 -r1.36.2.13 src/sys/miscfs/genfs/genfs_io.c
cvs rdiff -u -r1.68.2.5 -r1.68.2.6 src/sys/uvm/uvm_bio.c
cvs rdiff -u -r1.166.2.11 -r1.166.2.12 src/sys/uvm/uvm_fault.c
cvs rdiff -u -r1.153.2.42 -r1.153.2.43 src/sys/uvm/uvm_page.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.12 src/sys/miscfs/genfs/genfs_io.c:1.36.2.13
--- src/sys/miscfs/genfs/genfs_io.c:1.36.2.12	Wed Jul  7 14:29:39 2010
+++ src/sys/miscfs/genfs/genfs_io.c	Fri Jul  9 12:49:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: genfs_io.c,v 1.36.2.12 2010/07/07 14:29:39 uebayasi Exp $	*/
+/*	$NetBSD: genfs_io.c,v 1.36.2.13 2010/07/09 12:49:21 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.12 2010/07/07 14:29:39 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36.2.13 2010/07/09 12:49:21 uebayasi Exp $");
 
 #include "opt_direct_page.h"
 #include "opt_xip.h"
@@ -816,8 +816,7 @@
 
 	/* XXX optimize */
 	off = offset;
-	i = 0;
-	while (i < npages) {
+	for (i = 0; i < npages; i++) {
 		daddr_t lbn, blkno;
 		int run;
 		struct vnode *devvp;
@@ -842,6 +841,7 @@
 			pps[i] = xip_zero_page;
 		} else {
 			struct vm_physseg *seg;
+			struct vm_page *pg;
 
 			seg = devvp->v_physseg;
 			KASSERT(seg != NULL);
@@ -849,10 +849,11 @@
 			phys_addr = pmap_phys_address(seg->start) +
 			    (blkno << dev_bshift) +
 			    (off - (lbn << fs_bshift));
-			pps[i] = seg->pgs +
+			pg = seg->pgs +
 			    ((phys_addr >> PAGE_SHIFT) - seg->start);
-			KASSERT(pps[i]->phys_addr == phys_addr);
-			KASSERT((pps[i]->flags & PG_DIRECT) != 0);
+			KASSERT(pg->phys_addr == phys_addr);
+
+			pps[i] = pg;
 		}
 
 		UVMHIST_LOG(ubchist, "xip pgs %d => phys_addr=0x%lx (%p)",
@@ -862,10 +863,30 @@
 			0);
 
 		off += PAGE_SIZE;
-		i++;
 	}
 
-	*npagesp = i;
+	if ((flags & PGO_LOCKED) == 0)
+		mutex_enter(&uobj->vmobjlock);
+	KASSERT(mutex_owned(&uobj->vmobjlock));
+
+	for (i = 0; i < npages; i++) {
+		struct vm_page *pg = pps[i];
+
+		if (pg == xip_zero_page) {
+		} else {
+			KASSERT((pg->flags & PG_BUSY) == 0);
+			KASSERT((pg->flags & PG_RDONLY) != 0);
+			KASSERT((pg->flags & PG_CLEAN) != 0);
+			KASSERT((pg->flags & PG_DIRECT) != 0);
+			pg->flags |= PG_BUSY;
+			pg->uobject = &vp->v_uobj;
+		}
+	}
+
+	if ((flags & PGO_LOCKED) == 0)
+		mutex_exit(&uobj->vmobjlock);
+
+	*npagesp = npages;
 
 	return 0;
 }

Index: src/sys/uvm/uvm_bio.c
diff -u src/sys/uvm/uvm_bio.c:1.68.2.5 src/sys/uvm/uvm_bio.c:1.68.2.6
--- src/sys/uvm/uvm_bio.c:1.68.2.5	Thu Jul  8 06:55:13 2010
+++ src/sys/uvm/uvm_bio.c	Fri Jul  9 12:49:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_bio.c,v 1.68.2.5 2010/07/08 06:55:13 uebayasi Exp $	*/
+/*	$NetBSD: uvm_bio.c,v 1.68.2.6 2010/07/09 12:49:21 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 1998 Chuck Silvers.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.68.2.5 2010/07/08 06:55:13 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.68.2.6 2010/07/09 12:49:21 uebayasi Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_ubc.h"
@@ -393,7 +393,6 @@
 		    pg->offset < umap->writeoff ||
 		    pg->offset + PAGE_SIZE > umap->writeoff + umap->writelen);
 		mask = rdonly ? ~VM_PROT_WRITE : VM_PROT_ALL;
-
 		error = pmap_enter(ufi->orig_map->pmap, va, VM_PAGE_TO_PHYS(pg),
 		    prot & mask, PMAP_CANFAIL | (access_type & mask));
 
@@ -403,10 +402,10 @@
 		mutex_enter(&uvm_pageqlock);
 		uvm_pageactivate(pg);
 		mutex_exit(&uvm_pageqlock);
-		pg->flags &= ~(PG_BUSY|PG_WANTED);
-		UVM_PAGE_OWN(pg, NULL);
 
 ubc_fault_done:
+		pg->flags &= ~(PG_BUSY|PG_WANTED);
+		UVM_PAGE_OWN(pg, NULL);
 		mutex_exit(&uobj->vmobjlock);
 		if (error) {
 			UVMHIST_LOG(ubchist, "pmap_enter fail %d",

Index: src/sys/uvm/uvm_fault.c
diff -u src/sys/uvm/uvm_fault.c:1.166.2.11 src/sys/uvm/uvm_fault.c:1.166.2.12
--- src/sys/uvm/uvm_fault.c:1.166.2.11	Thu Jul  8 06:55:13 2010
+++ src/sys/uvm/uvm_fault.c	Fri Jul  9 12:49:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_fault.c,v 1.166.2.11 2010/07/08 06:55:13 uebayasi Exp $	*/
+/*	$NetBSD: uvm_fault.c,v 1.166.2.12 2010/07/09 12:49:21 uebayasi Exp $	*/
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.11 2010/07/08 06:55:13 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.12 2010/07/09 12:49:21 uebayasi Exp $");
 
 #include "opt_uvmhist.h"
 #include "opt_xip.h"
@@ -574,8 +574,7 @@
 
 	KASSERT(amap != NULL);
 	KASSERT(uobjpage != NULL);
-	KASSERT(uobjpage == PGO_DONTCARE || uvm_pageisdirect_p(uobjpage) ||
-	    (uobjpage->flags & PG_BUSY) != 0);
+	KASSERT(uobjpage == PGO_DONTCARE || (uobjpage->flags & PG_BUSY) != 0);
 	KASSERT(mutex_owned(&amap->am_l));
 	KASSERT(oanon == NULL || mutex_owned(&oanon->an_lock));
 	KASSERT(uobj == NULL || mutex_owned(&uobj->vmobjlock));
@@ -1581,8 +1580,7 @@
 	/* locked: maps(read), amap(if there), uobj(if !null), uobjpage(if !null) */
 	KASSERT(amap == NULL || mutex_owned(&amap->am_l));
 	KASSERT(uobj == NULL || mutex_owned(&uobj->vmobjlock));
-	KASSERT(uobjpage == NULL || uvm_pageisdirect_p(uobjpage) ||
-	    (uobjpage->flags & PG_BUSY) != 0);
+	KASSERT(uobjpage == NULL || (uobjpage->flags & PG_BUSY) != 0);
 
 	/*
 	 * note that at this point we are done with any front or back pages.
@@ -1601,8 +1599,7 @@
 	 */
 	KASSERT(amap == NULL || mutex_owned(&amap->am_l));
 	KASSERT(uobj == NULL || mutex_owned(&uobj->vmobjlock));
-	KASSERT(uobjpage == NULL || uvm_pageisdirect_p(uobjpage) ||
-	    (uobjpage->flags & PG_BUSY) != 0);
+	KASSERT(uobjpage == NULL || (uobjpage->flags & PG_BUSY) != 0);
 
 	/*
 	 * note that uobjpage can not be PGO_DONTCARE at this point.  we now
@@ -1645,8 +1642,7 @@
 	 */
 	KASSERT(amap == NULL || mutex_owned(&amap->am_l));
 	KASSERT(uobj == NULL || mutex_owned(&uobj->vmobjlock));
-	KASSERT(uobj == NULL || uvm_pageisdirect_p(uobjpage) ||
-	    (uobjpage->flags & PG_BUSY) != 0);
+	KASSERT(uobj == NULL || (uobjpage->flags & PG_BUSY) != 0);
 
 	/*
 	 * notes:
@@ -1656,10 +1652,8 @@
 	 *  - at this point uobjpage could be PG_WANTED (handle later)
 	 */
 
-	KASSERT(uobj == NULL || uvm_pageisdirect_p(uobjpage) ||
-	    uobj == uobjpage->uobject);
-	KASSERT(uobj == NULL || uvm_pageisdirect_p(uobjpage) ||
-	    !UVM_OBJ_IS_CLEAN(uobjpage->uobject) ||
+	KASSERT(uobj == NULL || uobj == uobjpage->uobject);
+	KASSERT(uobj == NULL || !UVM_OBJ_IS_CLEAN(uobjpage->uobject) ||
 	    (uobjpage->flags & PG_CLEAN) != 0);
 
 	if (flt->promote == false) {
@@ -1718,7 +1712,7 @@
 		if (curpg == NULL || curpg == PGO_DONTCARE) {
 			continue;
 		}
-		KASSERT(uvm_pageisdirect_p(curpg) || curpg->uobject == uobj);
+		KASSERT(curpg->uobject == uobj);
 
 		/*
 		 * if center page is resident and not PG_BUSY|PG_RELEASED
@@ -1780,10 +1774,11 @@
 	KASSERT((pg->flags & PG_WANTED) == 0);
 	KASSERT(!UVM_OBJ_IS_CLEAN(pg->uobject) ||
 	    (pg->flags & PG_CLEAN) != 0);
+
+uvm_fault_lower_neighbor_enter:
 	pg->flags &= ~(PG_BUSY);
 	UVM_PAGE_OWN(pg, NULL);
 
-uvm_fault_lower_neighbor_enter:
 	UVMHIST_LOG(maphist,
 	    "  MAPPING: n obj: pm=0x%x, va=0x%x, pg=0x%x",
 	    ufi->orig_map->pmap, currva, pg, 0);
@@ -2113,10 +2108,11 @@
 		if (uobjpage->flags & PG_WANTED)
 			/* still have the obj lock */
 			wakeup(uobjpage);
+
+uvm_fault_lower_promote_done:
 		uobjpage->flags &= ~(PG_BUSY|PG_WANTED);
 		UVM_PAGE_OWN(uobjpage, NULL);
 
-uvm_fault_lower_promote_done:
 		mutex_exit(&uobj->vmobjlock);
 		uobj = NULL;
 
@@ -2162,10 +2158,9 @@
 	 */
 	KASSERT(amap == NULL || mutex_owned(&amap->am_l));
 	KASSERT(uobj == NULL || mutex_owned(&uobj->vmobjlock));
-	KASSERT(uobj == NULL || uvm_pageisdirect_p(uobjpage) ||
-	    (uobjpage->flags & PG_BUSY) != 0);
+	KASSERT(uobj == NULL || (uobjpage->flags & PG_BUSY) != 0);
 	KASSERT(anon == NULL || mutex_owned(&anon->an_lock));
-	KASSERT(uvm_pageisdirect_p(pg) || (pg->flags & PG_BUSY) != 0);
+	KASSERT((pg->flags & PG_BUSY) != 0);
 
 	/*
 	 * all resources are present.   we can now map it in and free our
@@ -2203,10 +2198,9 @@
 		 */
 		KASSERT((pg->flags & PG_RELEASED) == 0);
 
+uvm_fault_lower_enter_error_done:
 		pg->flags &= ~(PG_BUSY|PG_FAKE|PG_WANTED);
 		UVM_PAGE_OWN(pg, NULL);
-
-uvm_fault_lower_enter_error_done:
 		uvmfault_unlockall(ufi, amap, uobj, anon);
 		if (!uvm_reclaimable()) {
 			UVMHIST_LOG(maphist,
@@ -2223,6 +2217,9 @@
 	if (!uvm_pageisdirect_p(pg))
 		uvm_fault_lower_done(ufi, flt, uobj, anon, pg);
 
+	pg->flags &= ~(PG_BUSY|PG_FAKE|PG_WANTED);
+	UVM_PAGE_OWN(pg, NULL);
+
 	uvmfault_unlockall(ufi, amap, uobj, anon);
 	pmap_update(ufi->orig_map->pmap);
 	UVMHIST_LOG(maphist, "<- done (SUCCESS!)",0,0,0,0);
@@ -2269,9 +2266,6 @@
 	 * lock since the last time we checked.
 	 */
 	KASSERT((pg->flags & PG_RELEASED) == 0);
-
-	pg->flags &= ~(PG_BUSY|PG_FAKE|PG_WANTED);
-	UVM_PAGE_OWN(pg, NULL);
 }
 
 

Index: src/sys/uvm/uvm_page.c
diff -u src/sys/uvm/uvm_page.c:1.153.2.42 src/sys/uvm/uvm_page.c:1.153.2.43
--- src/sys/uvm/uvm_page.c:1.153.2.42	Thu Jul  8 06:55:13 2010
+++ src/sys/uvm/uvm_page.c	Fri Jul  9 12:49:21 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_page.c,v 1.153.2.42 2010/07/08 06:55:13 uebayasi Exp $	*/
+/*	$NetBSD: uvm_page.c,v 1.153.2.43 2010/07/09 12:49:21 uebayasi Exp $	*/
 
 /*
  * Copyright (c) 2010 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.42 2010/07/08 06:55:13 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.43 2010/07/09 12:49:21 uebayasi Exp $");
 
 #include "opt_ddb.h"
 #include "opt_uvmhist.h"
@@ -870,7 +870,7 @@
 		paddr_t paddr = (start + i) << PAGE_SHIFT;
 
 		pg->phys_addr = paddr;
-		pg->flags |= PG_RDONLY | PG_DIRECT;
+		pg->flags |= PG_RDONLY | PG_DIRECT | PG_CLEAN;
 #ifdef __HAVE_VM_PAGE_MD
 		VM_MDPAGE_INIT(&pg->mdpage, paddr);
 #endif

Reply via email to