svn commit: r211958 - in head/sys/mips: include mips

Jayachandran C. jchandra at FreeBSD.org
Sun Aug 29 05:39:21 UTC 2010


Author: jchandra
Date: Sun Aug 29 05:39:21 2010
New Revision: 211958
URL: http://svn.freebsd.org/changeset/base/211958

Log:
  Apply MIPS pmap clean up patch from alc@ (with minor change to KASSERT):
  
    PMAP_DIAGNOSTIC was eliminated from amd64/i386, and, in fact, the
    non-MIPS parts of the kernel, several years ago.  Any of the interesting
    checks were turned into KASSERT()s.  Basically, the motivation was that
    lots of people run with INVARIANTS but no one runs with DIAGNOSTIC.
  
    panic strings needn't and shouldn't have a terminating newline.
  
    Finally, there is one functional change.  The sched_pin() in
    pmap_remove_pages() is an artifact of the way we temporarily map page
    table pages on i386.  (The mappings are processor private.  We don't do
    a system-wide shootdown.)  It isn't needed by MIPS.
  
  Tested by: jchandra
  
  Submitted by:	alc

Modified:
  head/sys/mips/include/pmap.h
  head/sys/mips/mips/pmap.c

Modified: head/sys/mips/include/pmap.h
==============================================================================
--- head/sys/mips/include/pmap.h	Sun Aug 29 03:55:39 2010	(r211957)
+++ head/sys/mips/include/pmap.h	Sun Aug 29 05:39:21 2010	(r211958)
@@ -126,11 +126,6 @@ typedef struct pv_entry {
 	vm_page_t pv_ptem;	/* VM page for pte */
 }       *pv_entry_t;
 
-
-#if defined(DIAGNOSTIC)
-#define	PMAP_DIAGNOSTIC
-#endif
-
 /*
  * physmem_desc[] is a superset of phys_avail[] and describes all the
  * memory present in the system.

Modified: head/sys/mips/mips/pmap.c
==============================================================================
--- head/sys/mips/mips/pmap.c	Sun Aug 29 03:55:39 2010	(r211957)
+++ head/sys/mips/mips/pmap.c	Sun Aug 29 05:39:21 2010	(r211958)
@@ -105,17 +105,13 @@ __FBSDID("$FreeBSD$");
 #include <machine/md_var.h>
 #include <machine/tlb.h>
 
-#if defined(DIAGNOSTIC)
-#define	PMAP_DIAGNOSTIC
-#endif
-
 #undef PMAP_DEBUG
 
 #ifndef PMAP_SHPGPERPROC
 #define	PMAP_SHPGPERPROC 200
 #endif
 
-#if !defined(PMAP_DIAGNOSTIC)
+#if !defined(DIAGNOSTIC)
 #define	PMAP_INLINE __inline
 #else
 #define	PMAP_INLINE
@@ -635,22 +631,6 @@ pmap_init(void)
  * Low level helper routines.....
  ***************************************************/
 
-#if defined(PMAP_DIAGNOSTIC)
-
-/*
- * This code checks for non-writeable/modified pages.
- * This should be an invalid condition.
- */
-static int
-pmap_nw_modified(pt_entry_t pte)
-{
-	if ((pte & (PTE_D | PTE_RO)) == (PTE_D | PTE_RO))
-		return (1);
-	else
-		return (0);
-}
-#endif
-
 static __inline void
 pmap_invalidate_all_local(pmap_t pmap)
 {
@@ -1598,13 +1578,9 @@ pmap_remove_pte(struct pmap *pmap, pt_en
 	if (page_is_managed(pa)) {
 		m = PHYS_TO_VM_PAGE(pa);
 		if (pte_test(&oldpte, PTE_D)) {
-#if defined(PMAP_DIAGNOSTIC)
-			if (pmap_nw_modified(oldpte)) {
-				printf(
-				    "pmap_remove: modified page not writable: va: 0x%x, pte: 0x%x\n",
-				    va, oldpte);
-			}
-#endif
+			KASSERT(!pte_test(&oldpte, PTE_RO),
+			    ("%s: modified page not writable: va: %p, pte: 0x%x",
+			    __func__, (void *)va, oldpte));
 			vm_page_dirty(m);
 		}
 		if (m->md.pv_flags & PV_TABLE_REF)
@@ -1761,13 +1737,9 @@ pmap_remove_all(vm_page_t m)
 		 * Update the vm_page_t clean and reference bits.
 		 */
 		if (pte_test(&tpte, PTE_D)) {
-#if defined(PMAP_DIAGNOSTIC)
-			if (pmap_nw_modified(tpte)) {
-				printf(
-				    "pmap_remove_all: modified page not writable: va: 0x%x, pte: 0x%x\n",
-				    pv->pv_va, tpte);
-			}
-#endif
+			KASSERT(!pte_test(&tpte, PTE_RO),
+			    ("%s: modified page not writable: va: %p, pte: 0x%x",
+			    __func__, (void *)pv->pv_va, tpte));
 			vm_page_dirty(m);
 		}
 		pmap_invalidate_page(pv->pv_pmap, pv->pv_va);
@@ -1908,7 +1880,7 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 	 * Page Directory table entry not valid, we need a new PT page
 	 */
 	if (pte == NULL) {
-		panic("pmap_enter: invalid page directory, pdir=%p, va=%p\n",
+		panic("pmap_enter: invalid page directory, pdir=%p, va=%p",
 		    (void *)pmap->pm_segtab, (void *)va);
 	}
 	pa = VM_PAGE_TO_PHYS(m);
@@ -1931,13 +1903,9 @@ pmap_enter(pmap_t pmap, vm_offset_t va, 
 		else if (!wired && pte_test(&origpte, PTE_W))
 			pmap->pm_stats.wired_count--;
 
-#if defined(PMAP_DIAGNOSTIC)
-		if (pmap_nw_modified(origpte)) {
-			printf(
-			    "pmap_enter: modified page not writable: va: 0x%x, pte: 0x%x\n",
-			    va, origpte);
-		}
-#endif
+		KASSERT(!pte_test(&origpte, PTE_D | PTE_RO),
+		    ("%s: modified page not writable: va: %p, pte: 0x%x",
+		    __func__, (void *)va, origpte));
 
 		/*
 		 * Remove extra pte reference
@@ -2529,13 +2497,11 @@ pmap_remove_pages(pmap_t pmap)
 	}
 	vm_page_lock_queues();
 	PMAP_LOCK(pmap);
-	sched_pin();
-	//XXX need to be TAILQ_FOREACH_SAFE ?
-	for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv; pv = npv) {
+	for (pv = TAILQ_FIRST(&pmap->pm_pvlist); pv != NULL; pv = npv) {
 
 		pte = pmap_pte(pv->pv_pmap, pv->pv_va);
 		if (!pte_test(pte, PTE_V))
-			panic("pmap_remove_pages: page on pm_pvlist has no pte\n");
+			panic("pmap_remove_pages: page on pm_pvlist has no pte");
 		tpte = *pte;
 
 /*
@@ -2570,7 +2536,6 @@ pmap_remove_pages(pmap_t pmap)
 		pmap_unuse_pt(pv->pv_pmap, pv->pv_va, pv->pv_ptem);
 		free_pv_entry(pv);
 	}
-	sched_unpin();
 	pmap_invalidate_all(pmap);
 	PMAP_UNLOCK(pmap);
 	vm_page_unlock_queues();
@@ -2596,12 +2561,6 @@ pmap_testbit(vm_page_t m, int bit)
 
 	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
-#if defined(PMAP_DIAGNOSTIC)
-		if (!pv->pv_pmap) {
-			printf("Null pmap (tb) at va: 0x%x\n", pv->pv_va);
-			continue;
-		}
-#endif
 		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_pte(pv->pv_pmap, pv->pv_va);
 		rv = pte_test(pte, bit);
@@ -2630,13 +2589,6 @@ pmap_changebit(vm_page_t m, int bit, boo
 	 * setting RO do we need to clear the VAC?
 	 */
 	TAILQ_FOREACH(pv, &m->md.pv_list, pv_list) {
-#if defined(PMAP_DIAGNOSTIC)
-		if (!pv->pv_pmap) {
-			printf("Null pmap (cb) at va: 0x%x\n", pv->pv_va);
-			continue;
-		}
-#endif
-
 		PMAP_LOCK(pv->pv_pmap);
 		pte = pmap_pte(pv->pv_pmap, pv->pv_va);
 		if (setem) {
@@ -2723,7 +2675,7 @@ pmap_remove_write(vm_page_t m)
 		npv = TAILQ_NEXT(pv, pv_plist);
 		pte = pmap_pte(pv->pv_pmap, pv->pv_va);
 		if (pte == NULL || !pte_test(pte, PTE_V))
-			panic("page on pm_pvlist has no pte\n");
+			panic("page on pm_pvlist has no pte");
 
 		va = pv->pv_va;
 		pmap_protect(pv->pv_pmap, va, va + PAGE_SIZE,


More information about the svn-src-all mailing list