svn commit: r353650 - head/sys/powerpc/aim
Mark Johnston
markj at FreeBSD.org
Wed Oct 16 15:50:12 UTC 2019
Author: markj
Date: Wed Oct 16 15:50:12 2019
New Revision: 353650
URL: https://svnweb.freebsd.org/changeset/base/353650
Log:
Clear PGA_WRITEABLE in moea_pvo_remove().
moea_pvo_remove() might remove the last mapping of a page, in which case
it is clearly no longer writeable. This can happen via pmap_remove(),
or when a CoW fault removes the last mapping of the old page.
Reported and tested by: bdragon
Reviewed by: alc, bdragon, kib
MFC after: 1 week
Sponsored by: The FreeBSD Foundation
Differential Revision: https://reviews.freebsd.org/D22044
Modified:
head/sys/powerpc/aim/mmu_oea.c
Modified: head/sys/powerpc/aim/mmu_oea.c
==============================================================================
--- head/sys/powerpc/aim/mmu_oea.c Wed Oct 16 15:21:05 2019 (r353649)
+++ head/sys/powerpc/aim/mmu_oea.c Wed Oct 16 15:50:12 2019 (r353650)
@@ -2108,23 +2108,26 @@ moea_pvo_remove(struct pvo_entry *pvo, int pteidx)
pvo->pvo_pmap->pm_stats.wired_count--;
/*
+ * Remove this PVO from the PV and pmap lists.
+ */
+ LIST_REMOVE(pvo, pvo_vlink);
+ RB_REMOVE(pvo_tree, &pvo->pvo_pmap->pmap_pvo, pvo);
+
+ /*
* Save the REF/CHG bits into their cache if the page is managed.
+ * Clear PGA_WRITEABLE if all mappings of the page have been removed.
*/
if ((pvo->pvo_vaddr & PVO_MANAGED) == PVO_MANAGED) {
- struct vm_page *pg;
+ struct vm_page *pg;
pg = PHYS_TO_VM_PAGE(pvo->pvo_pte.pte.pte_lo & PTE_RPGN);
if (pg != NULL) {
moea_attr_save(pg, pvo->pvo_pte.pte.pte_lo &
(PTE_REF | PTE_CHG));
+ if (LIST_EMPTY(&pg->md.mdpg_pvoh))
+ vm_page_aflag_clear(pg, PGA_WRITEABLE);
}
}
-
- /*
- * Remove this PVO from the PV and pmap lists.
- */
- LIST_REMOVE(pvo, pvo_vlink);
- RB_REMOVE(pvo_tree, &pvo->pvo_pmap->pmap_pvo, pvo);
/*
* Remove this from the overflow list and return it to the pool
More information about the svn-src-all
mailing list