Module Name: src Committed By: uebayasi Date: Thu Nov 4 08:47:38 UTC 2010
Modified Files: src/sys/arch/m68k/m68k [uebayasi-xip]: pmap_motorola.c src/sys/arch/mips/mips [uebayasi-xip]: pmap.c src/sys/arch/powerpc/ibm4xx [uebayasi-xip]: pmap.c src/sys/miscfs/genfs [uebayasi-xip]: genfs_io.c src/sys/uvm [uebayasi-xip]: uvm_bio.c uvm_fault.c uvm_page.c uvm_page.h Log Message: Split physical device segment pages from "managed" to "managed device". Cache that information as a flag PG_DEVICE so that callers don't need to walk physsegs everytime. Remove PQ_FIXED, which means that page daemon doesn't need to know device segment pages at all. But still fault handlers need to know them. I think this is what I can do best now. To generate a diff of this commit: cvs rdiff -u -r1.55.2.5 -r1.55.2.6 src/sys/arch/m68k/m68k/pmap_motorola.c cvs rdiff -u -r1.188.2.6 -r1.188.2.7 src/sys/arch/mips/mips/pmap.c cvs rdiff -u -r1.60.2.7 -r1.60.2.8 src/sys/arch/powerpc/ibm4xx/pmap.c cvs rdiff -u -r1.36.2.28 -r1.36.2.29 src/sys/miscfs/genfs/genfs_io.c cvs rdiff -u -r1.68.2.11 -r1.68.2.12 src/sys/uvm/uvm_bio.c cvs rdiff -u -r1.166.2.21 -r1.166.2.22 src/sys/uvm/uvm_fault.c cvs rdiff -u -r1.153.2.58 -r1.153.2.59 src/sys/uvm/uvm_page.c cvs rdiff -u -r1.59.2.32 -r1.59.2.33 src/sys/uvm/uvm_page.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/arch/m68k/m68k/pmap_motorola.c diff -u src/sys/arch/m68k/m68k/pmap_motorola.c:1.55.2.5 src/sys/arch/m68k/m68k/pmap_motorola.c:1.55.2.6 --- src/sys/arch/m68k/m68k/pmap_motorola.c:1.55.2.5 Sun Oct 31 03:46:17 2010 +++ src/sys/arch/m68k/m68k/pmap_motorola.c Thu Nov 4 08:47:36 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_motorola.c,v 1.55.2.5 2010/10/31 03:46:17 uebayasi Exp $ */ +/* $NetBSD: pmap_motorola.c,v 1.55.2.6 2010/11/04 08:47:36 uebayasi Exp $ */ /*- * Copyright (c) 1999 The NetBSD Foundation, Inc. @@ -119,7 +119,7 @@ #include "opt_m68k_arch.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_motorola.c,v 1.55.2.5 2010/10/31 03:46:17 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap_motorola.c,v 1.55.2.6 2010/11/04 08:47:36 uebayasi Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -285,7 +285,8 @@ struct pv_entry *pmap_alloc_pv(void); void pmap_free_pv(struct pv_entry *); -#define PAGE_IS_MANAGED(pa) (pmap_initialized && uvm_pageismanaged(pa)) +#define PAGE_IS_MANAGED(pa) (pmap_initialized && \ + (uvm_pageismanaged(pa) || uvm_pageismanaged_device(pa)) static inline struct pv_header * pa_to_pvh(paddr_t pa) Index: src/sys/arch/mips/mips/pmap.c diff -u src/sys/arch/mips/mips/pmap.c:1.188.2.6 src/sys/arch/mips/mips/pmap.c:1.188.2.7 --- src/sys/arch/mips/mips/pmap.c:1.188.2.6 Sun Oct 31 03:46:18 2010 +++ src/sys/arch/mips/mips/pmap.c Thu Nov 4 08:47:37 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.188.2.6 2010/10/31 03:46:18 uebayasi Exp $ */ +/* $NetBSD: pmap.c,v 1.188.2.7 2010/11/04 08:47:37 uebayasi Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.188.2.6 2010/10/31 03:46:18 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.188.2.7 2010/11/04 08:47:37 uebayasi Exp $"); /* * Manages physical address maps. @@ -225,7 +225,8 @@ bool pmap_initialized = false; -#define PAGE_IS_MANAGED(pa) (pmap_initialized && uvm_pageismanaged(pa)) +#define PAGE_IS_MANAGED(pa) (pmap_initialized && \ + (uvm_pageismanaged(pa) || uvm_pageismanaged_device(pa)) #define PMAP_IS_ACTIVE(pm) \ ((pm) == pmap_kernel() || \ @@ -1553,7 +1554,7 @@ pmap_mmap(vaddr_t addr, off_t off) { - return mips_btop(vtophys(addr + off)); + return mips_btop(MIPS_KSEG0_TO_PHYS(addr + off)); } /* Index: src/sys/arch/powerpc/ibm4xx/pmap.c diff -u src/sys/arch/powerpc/ibm4xx/pmap.c:1.60.2.7 src/sys/arch/powerpc/ibm4xx/pmap.c:1.60.2.8 --- src/sys/arch/powerpc/ibm4xx/pmap.c:1.60.2.7 Sun Oct 31 03:46:18 2010 +++ src/sys/arch/powerpc/ibm4xx/pmap.c Thu Nov 4 08:47:37 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.60.2.7 2010/10/31 03:46:18 uebayasi Exp $ */ +/* $NetBSD: pmap.c,v 1.60.2.8 2010/11/04 08:47:37 uebayasi Exp $ */ /* * Copyright 2001 Wasabi Systems, Inc. @@ -67,7 +67,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.60.2.7 2010/10/31 03:46:18 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.60.2.8 2010/11/04 08:47:37 uebayasi Exp $"); #include "opt_xip.h" @@ -851,7 +851,8 @@ if (flags & PMAP_WIRED) flags |= prot; - managed = ((flags & PMAP_NOCACHE) == 0) && uvm_pageismanaged(pa); + managed = ((flags & PMAP_NOCACHE) == 0) && + (uvm_pageismanaged(pa) || uvm_pageismanaged_device(pa)); /* * Generate TTE. Index: src/sys/miscfs/genfs/genfs_io.c diff -u src/sys/miscfs/genfs/genfs_io.c:1.36.2.28 src/sys/miscfs/genfs/genfs_io.c:1.36.2.29 --- src/sys/miscfs/genfs/genfs_io.c:1.36.2.28 Thu Nov 4 07:31:27 2010 +++ src/sys/miscfs/genfs/genfs_io.c Thu Nov 4 08:47:37 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: genfs_io.c,v 1.36.2.28 2010/11/04 07:31:27 uebayasi Exp $ */ +/* $NetBSD: genfs_io.c,v 1.36.2.29 2010/11/04 08:47:37 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.28 2010/11/04 07:31:27 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: genfs_io.c,v 1.36.2.29 2010/11/04 08:47:37 uebayasi Exp $"); #include "opt_xip.h" @@ -922,7 +922,7 @@ KASSERT((pg->flags & PG_BUSY) == 0); KASSERT((pg->flags & PG_RDONLY) != 0); KASSERT((pg->flags & PG_CLEAN) != 0); - KASSERT((pg->pqflags & PQ_FIXED) != 0); + KASSERT((pg->flags & PG_DEVICE) != 0); pg->flags |= PG_BUSY; pg->flags &= ~PG_FAKE; pg->uobject = &vp->v_uobj; @@ -1554,7 +1554,7 @@ KASSERT((pg->flags & PG_RDONLY) != 0); KASSERT((pg->flags & PG_CLEAN) != 0); KASSERT((pg->flags & PG_FAKE) == 0); - KASSERT((pg->pqflags & PQ_FIXED) != 0); + KASSERT((pg->flags & PG_DEVICE) != 0); pg->flags &= ~PG_BUSY; } } Index: src/sys/uvm/uvm_bio.c diff -u src/sys/uvm/uvm_bio.c:1.68.2.11 src/sys/uvm/uvm_bio.c:1.68.2.12 --- src/sys/uvm/uvm_bio.c:1.68.2.11 Tue Aug 17 06:48:14 2010 +++ src/sys/uvm/uvm_bio.c Thu Nov 4 08:47:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_bio.c,v 1.68.2.11 2010/08/17 06:48:14 uebayasi Exp $ */ +/* $NetBSD: uvm_bio.c,v 1.68.2.12 2010/11/04 08:47:38 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.11 2010/08/17 06:48:14 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_bio.c,v 1.68.2.12 2010/11/04 08:47:38 uebayasi Exp $"); #include "opt_uvmhist.h" #include "opt_ubc.h" @@ -283,7 +283,7 @@ error = pmap_enter(ufi->orig_map->pmap, va, VM_PAGE_TO_PHYS(pg), prot & mask, PMAP_CANFAIL | (access_type & mask)); - if (__predict_true((pg->pqflags & PQ_FIXED) == 0)) { + if (__predict_true((pg->flags & PG_DEVICE) == 0)) { mutex_enter(&uvm_pageqlock); uvm_pageactivate(pg); mutex_exit(&uvm_pageqlock); Index: src/sys/uvm/uvm_fault.c diff -u src/sys/uvm/uvm_fault.c:1.166.2.21 src/sys/uvm/uvm_fault.c:1.166.2.22 --- src/sys/uvm/uvm_fault.c:1.166.2.21 Tue Aug 17 06:48:14 2010 +++ src/sys/uvm/uvm_fault.c Thu Nov 4 08:47:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_fault.c,v 1.166.2.21 2010/08/17 06:48:14 uebayasi Exp $ */ +/* $NetBSD: uvm_fault.c,v 1.166.2.22 2010/11/04 08:47:38 uebayasi Exp $ */ /* * @@ -39,7 +39,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.21 2010/08/17 06:48:14 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.166.2.22 2010/11/04 08:47:38 uebayasi Exp $"); #include "opt_uvmhist.h" #include "opt_xip.h" @@ -1767,7 +1767,7 @@ * for this. we can just directly enter the pages. */ - if (__predict_true((pg->pqflags & PQ_FIXED) == 0)) { + if (__predict_true((pg->flags & PG_DEVICE) == 0)) { mutex_enter(&uvm_pageqlock); uvm_pageenqueue(pg); mutex_exit(&uvm_pageqlock); @@ -2199,7 +2199,7 @@ return ERESTART; } - if (__predict_true((pg->pqflags & PQ_FIXED) == 0)) + if (__predict_true((pg->flags & PG_DEVICE) == 0)) uvm_fault_lower_done(ufi, flt, uobj, anon, pg); pg->flags &= ~(PG_BUSY|PG_FAKE|PG_WANTED); Index: src/sys/uvm/uvm_page.c diff -u src/sys/uvm/uvm_page.c:1.153.2.58 src/sys/uvm/uvm_page.c:1.153.2.59 --- src/sys/uvm/uvm_page.c:1.153.2.58 Tue Nov 2 14:05:28 2010 +++ src/sys/uvm/uvm_page.c Thu Nov 4 08:47:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_page.c,v 1.153.2.58 2010/11/02 14:05:28 uebayasi Exp $ */ +/* $NetBSD: uvm_page.c,v 1.153.2.59 2010/11/04 08:47:38 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.58 2010/11/02 14:05:28 uebayasi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v 1.153.2.59 2010/11/04 08:47:38 uebayasi Exp $"); #include "opt_ddb.h" #include "opt_uvmhist.h" @@ -862,10 +862,9 @@ paddr_t paddr = (start + i) << PAGE_SHIFT; pg->phys_addr = paddr; - pg->flags |= PG_FAKE | PG_CLEAN; + pg->flags |= PG_FAKE | PG_CLEAN | PG_DEVICE; if (prot == VM_PROT_READ) pg->flags |= PG_RDONLY; - pg->pqflags = PQ_FIXED; #ifdef __HAVE_VM_PAGE_MD VM_MDPAGE_INIT(&pg->mdpage, paddr); #endif @@ -1581,7 +1580,7 @@ pmap_zero_page(VM_PAGE_TO_PHYS(pg)); } - KASSERT((pg->pqflags & PQ_FIXED) == 0); + KASSERT((pg->flags & PG_DEVICE) == 0); return(pg); @@ -2110,7 +2109,7 @@ { KASSERT(mutex_owned(&uvm_pageqlock)); - KASSERT((pg->pqflags & PQ_FIXED) == 0); + KASSERT((pg->flags & PG_DEVICE) == 0); KASSERT(pg->wire_count != 0 || uvmpdpol_pageisqueued_p(pg)); uvmpdpol_pagedeactivate(pg); } @@ -2126,7 +2125,7 @@ { KASSERT(mutex_owned(&uvm_pageqlock)); - KASSERT((pg->pqflags & PQ_FIXED) == 0); + KASSERT((pg->flags & PG_DEVICE) == 0); #if defined(READAHEAD_STATS) if ((pg->pqflags & PQ_READAHEAD) != 0) { uvm_ra_hit.ev_count++; @@ -2147,7 +2146,7 @@ uvm_pagedequeue(struct vm_page *pg) { - KASSERT((pg->pqflags & PQ_FIXED) == 0); + KASSERT((pg->flags & PG_DEVICE) == 0); if (uvmpdpol_pageisqueued_p(pg)) { KASSERT(mutex_owned(&uvm_pageqlock)); } @@ -2165,7 +2164,7 @@ { KASSERT(mutex_owned(&uvm_pageqlock)); - KASSERT((pg->pqflags & PQ_FIXED) == 0); + KASSERT((pg->flags & PG_DEVICE) == 0); if (pg->wire_count != 0) { return; } @@ -2210,11 +2209,23 @@ { return - (vm_physseg_find_device(atop(pa), NULL) != -1) || (vm_physseg_find(atop(pa), NULL) != -1); } /* + * uvm_pageismanaged_device: test it see that a page (specified by + * PA) is on a managed device physcal segment. + */ + +bool +uvm_pageismanaged_device(paddr_t pa) +{ + + return + (vm_physseg_find_device(atop(pa), NULL) != -1); +} + +/* * uvm_page_lookup_freelist: look up the free list for the specified page */ Index: src/sys/uvm/uvm_page.h diff -u src/sys/uvm/uvm_page.h:1.59.2.32 src/sys/uvm/uvm_page.h:1.59.2.33 --- src/sys/uvm/uvm_page.h:1.59.2.32 Wed Oct 27 14:51:30 2010 +++ src/sys/uvm/uvm_page.h Thu Nov 4 08:47:38 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_page.h,v 1.59.2.32 2010/10/27 14:51:30 uebayasi Exp $ */ +/* $NetBSD: uvm_page.h,v 1.59.2.33 2010/11/04 08:47:38 uebayasi Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -181,6 +181,7 @@ #define PG_RDONLY 0x0080 /* page must be mapped read-only */ #define PG_ZERO 0x0100 /* page is pre-zero'd */ #define PG_MARKER 0x0200 /* dummy marker page */ +#define PG_DEVICE 0x0400 /* page is on device segment */ #define PG_PAGER1 0x1000 /* pager-specific flag */ @@ -195,7 +196,6 @@ uvm_object */ #define PQ_SWAPBACKED (PQ_ANON|PQ_AOBJ) #define PQ_READAHEAD 0x0008 /* read-ahead but has not been "hit" yet */ -#define PQ_FIXED 0x0010 /* resident page (never paged out) */ #define PQ_PRIVATE1 0x0100 #define PQ_PRIVATE2 0x0200 @@ -303,6 +303,7 @@ void uvm_pagewire(struct vm_page *); void uvm_pagezero(struct vm_page *); bool uvm_pageismanaged(paddr_t); +bool uvm_pageismanaged_device(paddr_t); int uvm_page_lookup_freelist(struct vm_page *);