From owner-svn-src-projects@FreeBSD.ORG Tue Apr 28 02:59:19 2009 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 42452106564A; Tue, 28 Apr 2009 02:59:19 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id EFD8F8FC15; Tue, 28 Apr 2009 02:59:18 +0000 (UTC) (envelope-from gonzo@FreeBSD.org) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id n3S2xIN0034694; Tue, 28 Apr 2009 02:59:18 GMT (envelope-from gonzo@svn.freebsd.org) Received: (from gonzo@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id n3S2xICj034693; Tue, 28 Apr 2009 02:59:18 GMT (envelope-from gonzo@svn.freebsd.org) Message-Id: <200904280259.n3S2xICj034693@svn.freebsd.org> From: Oleksandr Tymoshenko Date: Tue, 28 Apr 2009 02:59:18 +0000 (UTC) To: src-committers@freebsd.org, svn-src-projects@freebsd.org X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r191613 - projects/mips/sys/mips/mips X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 28 Apr 2009 02:59:19 -0000 Author: gonzo Date: Tue Apr 28 02:59:18 2009 New Revision: 191613 URL: http://svn.freebsd.org/changeset/base/191613 Log: - When destroying va -> pa mapping writeback all caches or we may endup with partial page content in SDRAM - style(9) fix Modified: projects/mips/sys/mips/mips/pmap.c Modified: projects/mips/sys/mips/mips/pmap.c ============================================================================== --- projects/mips/sys/mips/mips/pmap.c Mon Apr 27 23:43:28 2009 (r191612) +++ projects/mips/sys/mips/mips/pmap.c Tue Apr 28 02:59:18 2009 (r191613) @@ -699,6 +699,11 @@ pmap_kremove(vm_offset_t va) { register pt_entry_t *pte; + /* + * Write back all caches from the page being destroyed + */ + mips_dcache_wbinv_range(va, NBPG); + pte = pmap_pte(kernel_pmap, va); *pte = PTE_G; pmap_invalidate_page(kernel_pmap, va); @@ -1523,6 +1528,12 @@ pmap_remove_page(struct pmap *pmap, vm_o if (!ptq || !pmap_pte_v(ptq)) { return; } + + /* + * Write back all caches from the page being destroyed + */ + mips_dcache_wbinv_range(va, NBPG); + /* * get a local va for mappings for this pmap. */ @@ -1608,6 +1619,14 @@ pmap_remove_all(vm_page_t m) while ((pv = TAILQ_FIRST(&m->md.pv_list)) != NULL) { PMAP_LOCK(pv->pv_pmap); + + /* + * If it's last mapping writeback all caches from + * the page being destroyed + */ + if (m->md.pv_list_count == 1) + mips_dcache_wbinv_range(pv->pv_va, NBPG); + pv->pv_pmap->pm_stats.resident_count--; pte = pmap_pte(pv->pv_pmap, pv->pv_va); @@ -2501,9 +2520,7 @@ pmap_remove_pages(pmap_t pmap) 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; pv = npv) { pte = pmap_pte(pv->pv_pmap, pv->pv_va); if (!pmap_pte_v(pte))