CVS commit: [netbsd-6-1] src/sys/arch/mips/mips
Module Name:src Committed By: snj Date: Wed Nov 8 21:28:24 UTC 2017 Modified Files: src/sys/arch/mips/mips [netbsd-6-1]: pmap.c Log Message: Pull up following revision(s) (requested by skrll in ticket #1390): sys/arch/mips/mips/pmap.c: 1.221-1.223 Fix a bug introduced by me in 1.214 where unmanaged mappings would be affected by calls to pmap_page_protect which is wrong. Now PV_KENTER mappings are left intact. Thanks to chuq for spotting my mistake and reviewing this diff. Thanks to everyone who tested it as well. Fix PR/51288 reproducable panic on evbmips64-eb (erlite) pmap_page_remove from the previous change neglected to terminate the pv list correctly when it started with an initial unmanaged mapping and subsequent managed mappings. Fix this. Fix MIPS3_NO_PV_UNCACHED alias handling by looping through the pv_list looking for bad aliases and removing the bad entries. That is, revert to the code before the matt-mips64 merge. Additionally, fix the pmap_update call to not use the (recently removed/freed) pv for the pmap_t. Fixes the following two PRs PR/49903: Panic during installation on WorkPad Z50 (hpcmips) whilst uncompressing base.tgz PR/51226: Install bug for hpcmips NetBSD V7 using FTP Full installation To generate a diff of this commit: cvs rdiff -u -r1.207.2.1.6.2 -r1.207.2.1.6.3 src/sys/arch/mips/mips/pmap.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/mips/pmap.c diff -u src/sys/arch/mips/mips/pmap.c:1.207.2.1.6.2 src/sys/arch/mips/mips/pmap.c:1.207.2.1.6.3 --- src/sys/arch/mips/mips/pmap.c:1.207.2.1.6.2 Wed Nov 8 21:22:57 2017 +++ src/sys/arch/mips/mips/pmap.c Wed Nov 8 21:28:24 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.207.2.1.6.2 2017/11/08 21:22:57 snj Exp $ */ +/* $NetBSD: pmap.c,v 1.207.2.1.6.3 2017/11/08 21:28:24 snj Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ #include -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.207.2.1.6.2 2017/11/08 21:22:57 snj Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.207.2.1.6.3 2017/11/08 21:28:24 snj Exp $"); /* * Manages physical address maps. @@ -316,6 +316,7 @@ u_int pmap_page_colormask; (pm) == curlwp->l_proc->p_vmspace->vm_map.pmap) /* Forward function declarations */ +void pmap_page_remove(struct vm_page *); void pmap_remove_pv(pmap_t, vaddr_t, struct vm_page *, bool); void pmap_enter_pv(pmap_t, vaddr_t, struct vm_page *, u_int *, int); pt_entry_t *pmap_pte(pmap_t, vaddr_t); @@ -1063,6 +1064,10 @@ pmap_page_protect(struct vm_page *pg, vm while (pv != NULL) { const pmap_t pmap = pv->pv_pmap; const uint16_t gen = PG_MD_PVLIST_GEN(md); +if (pv->pv_va & PV_KENTER) { + pv = pv->pv_next; + continue; +} va = trunc_page(pv->pv_va); PG_MD_PVLIST_UNLOCK(md); pmap_protect(pmap, va, va + PAGE_SIZE, prot); @@ -1087,17 +1092,7 @@ pmap_page_protect(struct vm_page *pg, vm if (pmap_clear_mdpage_attributes(md, PG_MD_EXECPAGE)) { PMAP_COUNT(exec_uncached_page_protect); } - (void)PG_MD_PVLIST_LOCK(md, false); - pv = >pvh_first; - while (pv->pv_pmap != NULL) { - const pmap_t pmap = pv->pv_pmap; - va = trunc_page(pv->pv_va); - PG_MD_PVLIST_UNLOCK(md); - pmap_remove(pmap, va, va + PAGE_SIZE); - pmap_update(pmap); - (void)PG_MD_PVLIST_LOCK(md, false); - } - PG_MD_PVLIST_UNLOCK(md); + pmap_page_remove(pg); } } @@ -2069,6 +2064,32 @@ pmap_set_modified(paddr_t pa) / pv_entry management / static void +pmap_check_alias(struct vm_page *pg) +{ +#ifdef MIPS3_PLUS /* XXX mmu XXX */ +#ifndef MIPS3_NO_PV_UNCACHED + struct vm_page_md * const md = VM_PAGE_TO_MD(pg); + + if (MIPS_HAS_R4K_MMU && PG_MD_UNCACHED_P(md)) { + /* + * Page is currently uncached, check if alias mapping has been + * removed. If it was, then reenable caching. + */ + pv_entry_t pv = >pvh_first; + pv_entry_t pv0 = pv->pv_next; + + for (; pv0; pv0 = pv0->pv_next) { + if (mips_cache_badalias(pv->pv_va, pv0->pv_va)) +break; + } + if (pv0 == NULL) + pmap_page_cache(pg, true); + } +#endif +#endif /* MIPS3_PLUS */ +} + +static void pmap_check_pvlist(struct vm_page_md *md) { #ifdef PARANOIADIAG @@ -2155,12 +2176,12 @@ again: * be mapped with one index at any given time. */ - if (mips_cache_badalias(pv->pv_va, va)) { -for (npv = pv; npv; npv = npv->pv_next) { - vaddr_t nva = trunc_page(npv->pv_va); - pmap_remove(npv->pv_pmap, nva, - nva + PAGE_SIZE); - pmap_update(npv->pv_pmap); + for (npv = pv; npv; npv = npv->pv_next) { +vaddr_t nva = trunc_page(npv->pv_va); +pmap_t npm = npv->pv_pmap; +if (mips_cache_badalias(nva, va)) { + pmap_remove(npm, nva, nva + PAGE_SIZE); + pmap_update(npm); goto again; } } @@ -2283,6 +2304,114 @@ again: } /* + * Remove this page from all physical maps in which
CVS commit: [netbsd-6-1] src/sys/arch/mips/mips
Module Name:src Committed By: snj Date: Wed Nov 8 21:28:24 UTC 2017 Modified Files: src/sys/arch/mips/mips [netbsd-6-1]: pmap.c Log Message: Pull up following revision(s) (requested by skrll in ticket #1390): sys/arch/mips/mips/pmap.c: 1.221-1.223 Fix a bug introduced by me in 1.214 where unmanaged mappings would be affected by calls to pmap_page_protect which is wrong. Now PV_KENTER mappings are left intact. Thanks to chuq for spotting my mistake and reviewing this diff. Thanks to everyone who tested it as well. Fix PR/51288 reproducable panic on evbmips64-eb (erlite) pmap_page_remove from the previous change neglected to terminate the pv list correctly when it started with an initial unmanaged mapping and subsequent managed mappings. Fix this. Fix MIPS3_NO_PV_UNCACHED alias handling by looping through the pv_list looking for bad aliases and removing the bad entries. That is, revert to the code before the matt-mips64 merge. Additionally, fix the pmap_update call to not use the (recently removed/freed) pv for the pmap_t. Fixes the following two PRs PR/49903: Panic during installation on WorkPad Z50 (hpcmips) whilst uncompressing base.tgz PR/51226: Install bug for hpcmips NetBSD V7 using FTP Full installation To generate a diff of this commit: cvs rdiff -u -r1.207.2.1.6.2 -r1.207.2.1.6.3 src/sys/arch/mips/mips/pmap.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
CVS commit: [netbsd-6-1] src/sys/arch/mips/mips
Module Name:src Committed By: snj Date: Wed Nov 8 21:19:46 UTC 2017 Modified Files: src/sys/arch/mips/mips [netbsd-6-1]: pmap.c vm_machdep.c Log Message: Pull up following revision(s) (requested by skrll in ticket #1056): sys/arch/mips/mips/pmap.c: revision 1.210-1.213 sys/arch/mips/mips/vm_machdep.c: revision 1.143 Fix a logic inversion introduced with the matt-nb5-mips64 for pmap_{zero,copy}_page cache alias handing. The check previously used PG_MD_UNCACHED_P, where it now uses PG_MD_CACHED_P, when considering if a cache invalidation is required. Additionally flush the cache for the uarea va to avoid potential (future) cache aliases in cpu_uarea_free when handing pages back to uvm for later use. ok matt@ Hopefully this addresses the instability reported in the following PRs: PR/44900 - R5000/Rm5200 mips ports are broken PR/46170 - NetBSD/cobalt 6.0_BETA does not boot PR/46890 - upcoming NetBSD 6.0 release is very unstable / unusable on cobalt qube 2 PR/48628 - cobalt and hpcmips ports are dead Grab pv_list lock in pmap_unmap_ephemeral_page only when needed. Make PARANOIADIAG compile. Use pmap_tlb_asid_check to reduce code c To generate a diff of this commit: cvs rdiff -u -r1.207.2.1 -r1.207.2.1.6.1 src/sys/arch/mips/mips/pmap.c cvs rdiff -u -r1.141 -r1.141.14.1 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.
CVS commit: [netbsd-6-1] src/sys/arch/mips/mips
Module Name:src Committed By: snj Date: Wed Nov 8 21:19:46 UTC 2017 Modified Files: src/sys/arch/mips/mips [netbsd-6-1]: pmap.c vm_machdep.c Log Message: Pull up following revision(s) (requested by skrll in ticket #1056): sys/arch/mips/mips/pmap.c: revision 1.210-1.213 sys/arch/mips/mips/vm_machdep.c: revision 1.143 Fix a logic inversion introduced with the matt-nb5-mips64 for pmap_{zero,copy}_page cache alias handing. The check previously used PG_MD_UNCACHED_P, where it now uses PG_MD_CACHED_P, when considering if a cache invalidation is required. Additionally flush the cache for the uarea va to avoid potential (future) cache aliases in cpu_uarea_free when handing pages back to uvm for later use. ok matt@ Hopefully this addresses the instability reported in the following PRs: PR/44900 - R5000/Rm5200 mips ports are broken PR/46170 - NetBSD/cobalt 6.0_BETA does not boot PR/46890 - upcoming NetBSD 6.0 release is very unstable / unusable on cobalt qube 2 PR/48628 - cobalt and hpcmips ports are dead Grab pv_list lock in pmap_unmap_ephemeral_page only when needed. Make PARANOIADIAG compile. Use pmap_tlb_asid_check to reduce code c To generate a diff of this commit: cvs rdiff -u -r1.207.2.1 -r1.207.2.1.6.1 src/sys/arch/mips/mips/pmap.c cvs rdiff -u -r1.141 -r1.141.14.1 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/mips/pmap.c diff -u src/sys/arch/mips/mips/pmap.c:1.207.2.1 src/sys/arch/mips/mips/pmap.c:1.207.2.1.6.1 --- src/sys/arch/mips/mips/pmap.c:1.207.2.1 Thu Jul 5 18:39:42 2012 +++ src/sys/arch/mips/mips/pmap.c Wed Nov 8 21:19:46 2017 @@ -1,4 +1,4 @@ -/* $NetBSD: pmap.c,v 1.207.2.1 2012/07/05 18:39:42 riz Exp $ */ +/* $NetBSD: pmap.c,v 1.207.2.1.6.1 2017/11/08 21:19:46 snj Exp $ */ /*- * Copyright (c) 1998, 2001 The NetBSD Foundation, Inc. @@ -67,7 +67,7 @@ #include -__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.207.2.1 2012/07/05 18:39:42 riz Exp $"); +__KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.207.2.1.6.1 2017/11/08 21:19:46 snj Exp $"); /* * Manages physical address maps. @@ -453,19 +453,21 @@ pmap_unmap_ephemeral_page(struct vm_page struct vm_page_md * const md = VM_PAGE_TO_MD(pg); pv_entry_t pv = >pvh_first; - (void)PG_MD_PVLIST_LOCK(md, false); - if (MIPS_CACHE_VIRTUAL_ALIAS - && (PG_MD_UNCACHED_P(md) - || (pv->pv_pmap != NULL - && mips_cache_badalias(pv->pv_va, va { - /* - * If this page was previously uncached or we had to use an - * incompatible alias and it has a valid mapping, flush it - * from the cache. - */ - mips_dcache_wbinv_range(va, PAGE_SIZE); + if (MIPS_CACHE_VIRTUAL_ALIAS) { + (void)PG_MD_PVLIST_LOCK(md, false); + if (PG_MD_CACHED_P(md) + || (pv->pv_pmap != NULL + && mips_cache_badalias(pv->pv_va, va))) { + + /* + * If this page was previously cached or we had to use an + * incompatible alias and it has a valid mapping, flush it + * from the cache. + */ + mips_dcache_wbinv_range(va, PAGE_SIZE); + } + PG_MD_PVLIST_UNLOCK(md); } - PG_MD_PVLIST_UNLOCK(md); #ifndef _LP64 /* * If we had to map using a page table entry, unmap it now. @@ -575,7 +577,7 @@ pmap_bootstrap(void) /* * Now actually allocate the kernel PTE array (must be done - * after virtual_end is initialized). + * after mips_virtual_end is initialized). */ Sysmap = (pt_entry_t *) uvm_pageboot_alloc(sizeof(pt_entry_t) * Sysmapsize); @@ -1023,15 +1025,7 @@ pmap_remove(pmap_t pmap, vaddr_t sva, va if (eva > VM_MAXUSER_ADDRESS) panic("pmap_remove: uva not in range"); if (PMAP_IS_ACTIVE(pmap)) { - struct pmap_asid_info * const pai = PMAP_PAI(pmap, curcpu()); - uint32_t asid; - - __asm volatile("mfc0 %0,$10; nop" : "=r"(asid)); - asid = (MIPS_HAS_R4K_MMU) ? (asid & 0xff) : (asid & 0xfc0) >> 6; - if (asid != pai->pai_asid) { - panic("inconsistency for active TLB flush: %d <-> %d", - asid, pai->pai_asid); - } + pmap_tlb_asid_check(); } #endif #ifdef PMAP_FAULTINFO @@ -1214,15 +1208,7 @@ pmap_protect(pmap_t pmap, vaddr_t sva, v if (eva > VM_MAXUSER_ADDRESS) panic("pmap_protect: uva not in range"); if (PMAP_IS_ACTIVE(pmap)) { - struct pmap_asid_info * const pai = PMAP_PAI(pmap, curcpu()); - uint32_t asid; - - __asm volatile("mfc0 %0,$10; nop" : "=r"(asid)); - asid = (MIPS_HAS_R4K_MMU) ? (asid & 0xff) : (asid & 0xfc0) >> 6; - if (asid != pai->pai_asid) { - panic("inconsistency for active TLB update: %d <-> %d", - asid, pai->pai_asid); - } + pmap_tlb_asid_check(); } #endif @@ -1586,6 +1572,7 @@ pmap_enter(pmap_t pmap, vaddr_t va, padd #ifdef PARANOIADIAG if (PMAP_IS_ACTIVE(pmap)) { + struct pmap_asid_info * const pai = PMAP_PAI(pmap, curcpu()); uint32_t asid; __asm volatile("mfc0 %0,$10; nop" : "=r"(asid)); @@ -1774,7 +1761,7 @@ pmap_unwire(pmap_t pmap, vaddr_t va) if (pmap == pmap_kernel()) {