aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBojan Novković <bnovkov@FreeBSD.org>2024-06-13 16:14:21 +0000
committerBojan Novković <bnovkov@FreeBSD.org>2024-06-16 16:19:27 +0000
commit774549fe06ac0f45a5a5a661a7fb4107a8695d4c (patch)
treeda534c22b598dea5fdc7b446c477e3cd51aa24d5
parente8816b4b66adf2e6052803cd0eb609ee63fbb3ed (diff)
riscv pmap: Release PTP reference on leaf ptpage allocation failure
d0941ed fixed an edge case invloving mlock() and superpage creation by creating and inserting a leaf pagetable page for mlock'd superpages. However, the code does not properly release the reference to the pagetable page in the error handling path. This commit fixes the issue by adding calls to 'pmap_abort_ptp' in the error handling path. Reported by: alc Approved by: markj (mentor) Fixes: d0941ed Differential Revision: https://reviews.freebsd.org/D45580
-rw-r--r--sys/riscv/riscv/pmap.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/sys/riscv/riscv/pmap.c b/sys/riscv/riscv/pmap.c
index 4f6305ed651d..1e4061935ca0 100644
--- a/sys/riscv/riscv/pmap.c
+++ b/sys/riscv/riscv/pmap.c
@@ -3291,12 +3291,14 @@ pmap_enter_l2(pmap_t pmap, vm_offset_t va, pd_entry_t new_l2, u_int flags,
if ((new_l2 & PTE_SW_WIRED) != 0 && pmap != kernel_pmap) {
uwptpg = vm_page_alloc_noobj(VM_ALLOC_WIRED);
if (uwptpg == NULL) {
+ pmap_abort_ptp(pmap, va, l2pg);
return (KERN_RESOURCE_SHORTAGE);
}
uwptpg->pindex = pmap_l2_pindex(va);
if (pmap_insert_pt_page(pmap, uwptpg, true, false)) {
vm_page_unwire_noq(uwptpg);
vm_page_free(uwptpg);
+ pmap_abort_ptp(pmap, va, l2pg);
return (KERN_RESOURCE_SHORTAGE);
}
pmap_resident_count_inc(pmap, 1);