Module Name: src Committed By: matt Date: Thu Feb 9 03:14:46 UTC 2012
Modified Files: src/sys/arch/mips/include [matt-nb5-mips64]: vmparam.h src/sys/arch/mips/mips [matt-nb5-mips64]: mips_machdep.c pmap.c pmap_segtab.c vm_machdep.c Log Message: Add mips_page_to_pggroup which return what pggroup a page belongs to. Eradicate VM_FREELIST_MAX When adding pages to the system, track what freelists get pages. To generate a diff of this commit: cvs rdiff -u -r1.41.28.25 -r1.41.28.26 src/sys/arch/mips/include/vmparam.h cvs rdiff -u -r1.205.4.1.2.1.2.62 -r1.205.4.1.2.1.2.63 \ src/sys/arch/mips/mips/mips_machdep.c cvs rdiff -u -r1.179.16.35 -r1.179.16.36 src/sys/arch/mips/mips/pmap.c cvs rdiff -u -r1.1.2.11 -r1.1.2.12 src/sys/arch/mips/mips/pmap_segtab.c cvs rdiff -u -r1.121.6.1.2.24 -r1.121.6.1.2.25 \ src/sys/arch/mips/mips/vm_machdep.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/arch/mips/include/vmparam.h diff -u src/sys/arch/mips/include/vmparam.h:1.41.28.25 src/sys/arch/mips/include/vmparam.h:1.41.28.26 --- src/sys/arch/mips/include/vmparam.h:1.41.28.25 Tue Dec 27 16:09:36 2011 +++ src/sys/arch/mips/include/vmparam.h Thu Feb 9 03:14:45 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: vmparam.h,v 1.41.28.25 2011/12/27 16:09:36 matt Exp $ */ +/* vmparam.h,v 1.41.28.25 2011/12/27 16:09:36 matt Exp */ /* * Copyright (c) 1988 University of Utah. @@ -208,9 +208,8 @@ #define VM_PHYSSEG_NOADD /* can add RAM after vm_mem_init */ #ifndef VM_NFREELIST -#define VM_NFREELIST 16 /* 16 distinct memory segments */ +#define VM_NFREELIST 1 /* 16 distinct memory segments */ #define VM_FREELIST_DEFAULT 0 -#define VM_FREELIST_MAX 1 #endif #ifdef _KERNEL @@ -287,4 +286,14 @@ do { \ (md)->pvh_attrs = 0; \ } while (/* CONSTCOND */ 0) +#define VM_NPGGROUP(colors) (mips_nfreelist * (colors)) +#define VM_PAGE_TO_PGGROUP(pg, ncolors) (mips_page_to_pggroup((pg), (ncolors))) + +#ifdef _KERNEL +extern u_int mips_nfreelist; +extern uint32_t mips_freelist_mask; +struct vm_page; +extern size_t mips_page_to_pggroup(struct vm_page *, size_t); +#endif + #endif /* ! _MIPS_VMPARAM_H_ */ Index: src/sys/arch/mips/mips/mips_machdep.c diff -u src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.62 src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.63 --- src/sys/arch/mips/mips/mips_machdep.c:1.205.4.1.2.1.2.62 Sat Jan 28 08:05:03 2012 +++ src/sys/arch/mips/mips/mips_machdep.c Thu Feb 9 03:14:45 2012 @@ -2126,6 +2126,8 @@ mips_init_lwp0_uarea(void) } int mips_poolpage_vmfreelist = VM_FREELIST_DEFAULT; +u_int mips_nfreelist; +uint32_t mips_freelist_mask = 0; #define HALFGIG ((paddr_t)512 * 1024 * 1024) #define FOURGIG ((paddr_t)4 * 1024 * 1024 * 1024) @@ -2144,6 +2146,7 @@ mips_page_physload(vaddr_t vkernstart, v #ifdef VM_FREELIST_FIRST4G bool need4g = false; #endif + CTASSERT(VM_NFREELIST <= 32); /* * Do a first pass and see what ranges memory we have to deal with. @@ -2152,7 +2155,9 @@ mips_page_physload(vaddr_t vkernstart, v #ifdef VM_FREELIST_FIRST4G if (round_page(segs[i].start + segs[i].size) > FOURGIG) { need4g = true; +#ifdef _LP64 mips_poolpage_vmfreelist = VM_FREELIST_FIRST4G; +#endif } #endif #ifdef VM_FREELIST_FIRST512M @@ -2279,11 +2284,21 @@ mips_page_physload(vaddr_t vkernstart, v uvm_page_physload(first, last, first, last, freelist); /* + * Mark that we loaded pages of this freelist type. + */ + mips_freelist_mask |= (1 << freelist); + + /* * Start where we finished. */ segstart = segend; } } + + /* + * Now to get the number of freelists in use. + */ + mips_nfreelist = popcount32(mips_freelist_mask); } /* Index: src/sys/arch/mips/mips/pmap.c diff -u src/sys/arch/mips/mips/pmap.c:1.179.16.35 src/sys/arch/mips/mips/pmap.c:1.179.16.36 --- src/sys/arch/mips/mips/pmap.c:1.179.16.35 Fri Dec 23 22:31:30 2011 +++ src/sys/arch/mips/mips/pmap.c Thu Feb 9 03:14:45 2012 @@ -2541,7 +2541,7 @@ pmap_pv_page_free(struct pool *pp, void struct vm_page * const pg = PHYS_TO_VM_PAGE(pa); KASSERT(pg != NULL); pmap_clear_mdpage_attributes(VM_PAGE_TO_MD(pg), PG_MD_POOLPAGE); - uvm_pagefree(pg); + uvm_km_pagefree(pg); } pt_entry_t * @@ -2594,17 +2594,23 @@ pmap_prefer(vaddr_t foff, vaddr_t *vap, struct vm_page * mips_pmap_alloc_poolpage(int flags) { + struct vm_page *pg; /* * On 32bit kernels, we must make sure that we only allocate pages that * can be mapped via KSEG0. On 64bit kernels, try to allocated from * the first 4G. If all memory is in KSEG0/4G, then we can just * use the default freelist otherwise we must use the pool page list. */ - if (mips_poolpage_vmfreelist != VM_FREELIST_DEFAULT) - return uvm_pagealloc_strat(NULL, 0, NULL, flags, + if (mips_poolpage_vmfreelist != VM_FREELIST_DEFAULT) { + pg = uvm_pagealloc_strat(NULL, 0, NULL, flags, UVM_PGA_STRAT_ONLY, mips_poolpage_vmfreelist); - - return uvm_pagealloc(NULL, 0, NULL, flags); + } else { + pg = uvm_pagealloc(NULL, 0, NULL, flags); + } + if (pg != NULL) { + uvm_km_pageclaim(pg); + } + return pg; } vaddr_t Index: src/sys/arch/mips/mips/pmap_segtab.c diff -u src/sys/arch/mips/mips/pmap_segtab.c:1.1.2.11 src/sys/arch/mips/mips/pmap_segtab.c:1.1.2.12 --- src/sys/arch/mips/mips/pmap_segtab.c:1.1.2.11 Tue Nov 29 07:48:31 2011 +++ src/sys/arch/mips/mips/pmap_segtab.c Thu Feb 9 03:14:45 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap_segtab.c,v 1.1.2.11 2011/11/29 07:48:31 matt Exp $ */ +/* pmap_segtab.c,v 1.1.2.11 2011/11/29 07:48:31 matt Exp */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: pmap_segtab.c,v 1.1.2.11 2011/11/29 07:48:31 matt Exp $"); +__KERNEL_RCSID(0, "pmap_segtab.c,v 1.1.2.11 2011/11/29 07:48:31 matt Exp"); /* * Manages physical address maps. @@ -199,7 +199,6 @@ pmap_segtab_release(union segtab *stp, u { for (size_t i = 0; i < PMAP_SEGTABSIZE; i++) { - paddr_t pa; #ifdef _LP64 if (level > 0) { if (stp->seg_seg[i] != NULL) { @@ -236,8 +235,9 @@ pmap_segtab_release(union segtab *stp, u #ifdef _LP64 KASSERT(MIPS_XKPHYS_P(pte)); #endif - pa = mips_pmap_unmap_poolpage((vaddr_t)pte); - uvm_pagefree(PHYS_TO_VM_PAGE(pa)); + paddr_t pa = mips_pmap_unmap_poolpage((vaddr_t)pte); + struct vm_page *pg = PHYS_TO_VM_PAGE(pa); + uvm_km_pagefree(pg); stp->seg_tab[i] = NULL; } @@ -464,7 +464,7 @@ pmap_pte_reserve(pmap_t pmap, vaddr_t va * free the page we just allocated. */ if (__predict_false(opte != NULL)) { - uvm_pagefree(pg); + uvm_km_pagefree(pg); pte = opte; } #else Index: src/sys/arch/mips/mips/vm_machdep.c diff -u src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.24 src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.25 --- src/sys/arch/mips/mips/vm_machdep.c:1.121.6.1.2.24 Thu Jan 19 08:28:50 2012 +++ src/sys/arch/mips/mips/vm_machdep.c Thu Feb 9 03:14:45 2012 @@ -67,6 +67,40 @@ __KERNEL_RCSID(0, "vm_machdep.c,v 1.121. paddr_t kvtophys(vaddr_t); /* XXX */ +size_t +mips_page_to_pggroup(struct vm_page *pg, size_t ncolors) +{ + const paddr_t pa = VM_PAGE_TO_PHYS(pg); + const u_int color = VM_PGCOLOR_BUCKET(pg); + u_int lcv; +#if VM_NFREELIST == 1 + return color; +#else + CTASSERT(VM_FREELIST_DEFAULT == 0); + if (mips_nfreelist == 1) + return color; + +#ifdef VM_FREELIST_FIRST512M + if (VM_FREELIST_FIRST512M_P(pa) + && (mips_freelist_mask & (1 << VM_FREELIST_FIRST512M))) { + lcv = VM_FREELIST_FIRST512M; + } else +#endif +#ifdef VM_FREELIST_FIRST4G + if (VM_FREELIST_FIRST4G_P(pa) + && (mips_freelist_mask & (1 << VM_FREELIST_FIRST4G))) { + lcv = VM_FREELIST_FIRST4G; + } else +#endif + { + lcv = VM_FREELIST_DEFAULT; + } + KDASSERT(lcv == uvm_page_lookup_freelist(pg)); + KASSERT(lcv < mips_nfreelist); + return lcv * ncolors + color; +#endif +} + /* * cpu_lwp_fork: Finish a fork operation, with lwp l2 nearly set up. * Copy and update the pcb and trapframe, making the child ready to run.