Page MenuHomeFreeBSD

D43339.id132356.diff
No OneTemporary

D43339.id132356.diff

diff --git a/sys/powerpc/aim/mmu_radix.c b/sys/powerpc/aim/mmu_radix.c
--- a/sys/powerpc/aim/mmu_radix.c
+++ b/sys/powerpc/aim/mmu_radix.c
@@ -3183,6 +3183,7 @@
struct spglist free;
pml3_entry_t oldl3e, *l3e;
vm_page_t mt, pdpg;
+ vm_page_t uwptpg;
KASSERT((newpde & (PG_M | PG_RW)) != PG_RW,
("pmap_enter_pde: newpde is missing PG_M"));
@@ -3237,6 +3238,24 @@
KASSERT(be64toh(*l3e) == 0, ("pmap_enter_pde: non-zero pde %p",
l3e));
}
+
+ /*
+ * Allocate leaf ptpage for wired userspace pages.
+ */
+ uwptpg = NULL;
+ if ((newpde & PG_W) != 0 && pmap != kernel_pmap) {
+ uwptpg = vm_page_alloc_noobj(VM_ALLOC_WIRED);
+ if (uwptpg == NULL)
+ return (KERN_RESOURCE_SHORTAGE);
+ uwptpg->pindex = pmap_l3e_pindex(va);
+ if (pmap_insert_pt_page(pmap, uwptpg)) {
+ vm_page_unwire_noq(uwptpg);
+ vm_page_free(uwptpg);
+ return (KERN_RESOURCE_SHORTAGE);
+ }
+ pmap_resident_count_inc(pmap, 1);
+ uwptpg->ref_count = NPTEPG;
+ }
if ((newpde & PG_MANAGED) != 0) {
/*
* Abort this mapping if its PV entry could not be created.
@@ -3253,6 +3272,16 @@
pmap_invalidate_page(pmap, va);
vm_page_free_pages_toq(&free, true);
}
+ if (uwptpg != NULL) {
+ mt = pmap_remove_pt_page(pmap, va);
+ KASSERT(mt == uwptpg,
+ ("removed pt page %p, expected %p", mt,
+ uwptpg));
+ pmap_resident_count_dec(pmap, 1);
+ uwptpg->ref_count = 1;
+ vm_page_unwire_noq(uwptpg);
+ vm_page_free(uwptpg);
+ }
CTR2(KTR_PMAP, "pmap_enter_pde: failure for va %#lx"
" in pmap %p", va, pmap);
return (KERN_RESOURCE_SHORTAGE);
@@ -4938,7 +4967,7 @@
/*
* If the page table page is new, initialize it.
*/
- if (mpte->ref_count == 1) {
+ if (!vm_page_all_valid(mpte)) {
mpte->ref_count = NPTEPG;
pmap_fill_ptp(firstpte, oldpde);
}

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 21, 9:27 PM (9 h, 49 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
25742535
Default Alt Text
D43339.id132356.diff (1 KB)

Event Timeline