From owner-svn-src-all@FreeBSD.ORG Sun Aug 29 05:39:21 2010 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id A1FE810656A3; Sun, 29 Aug 2010 05:39:21 +0000 (UTC) (envelope-from jchandra@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 922528FC14; Sun, 29 Aug 2010 05:39:21 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id o7T5dL1Y054119; Sun, 29 Aug 2010 05:39:21 GMT (envelope-from jchandra@svn.freebsd.org) Received: (from jchandra@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id o7T5dL7T054116; Sun, 29 Aug 2010 05:39:21 GMT (envelope-from jchandra@svn.freebsd.org) Message-Id: <201008290539.o7T5dL7T054116@svn.freebsd.org> From: "Jayachandran C." Date: Sun, 29 Aug 2010 05:39:21 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r211958 - in head/sys/mips: include mips X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 29 Aug 2010 05:39:21 -0000 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 #include -#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,