git: 774549fe06ac - main - riscv pmap: Release PTP reference on leaf ptpage allocation failure

From: Bojan Novković <bnovkov_at_FreeBSD.org>
Date: Sun, 16 Jun 2024 16:20:10 UTC
The branch main has been updated by bnovkov:

URL: https://cgit.FreeBSD.org/src/commit/?id=774549fe06ac0f45a5a5a661a7fb4107a8695d4c

commit 774549fe06ac0f45a5a5a661a7fb4107a8695d4c
Author:     Bojan Novković <bnovkov@FreeBSD.org>
AuthorDate: 2024-06-13 16:14:21 +0000
Commit:     Bojan Novković <bnovkov@FreeBSD.org>
CommitDate: 2024-06-16 16:19:27 +0000

    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
---
 sys/riscv/riscv/pmap.c | 2 ++
 1 file changed, 2 insertions(+)

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);