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