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.