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