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.

Reply via email to