The logic to handle PMAP_CANFAIL, the logic was inverted originally. Code has been simplified so that it is test for if !CANFAIL then panic
diff --git a/sys/arch/arm64/arm64/pmap.c b/sys/arch/arm64/arm64/pmap.c index dfd91b4ce23..393ff202e39 100644 --- a/sys/arch/arm64/arm64/pmap.c +++ b/sys/arch/arm64/arm64/pmap.c @@ -370,8 +370,8 @@ pmap_vp_enter(pmap_t pm, vaddr_t va, struct pte_desc *pted, int flags) vp1 = pool_get(&pmap_vp_pool, vp_pool_flags); if (vp1 == NULL) { if ((flags & PMAP_CANFAIL) == 0) - return ENOMEM; - panic("unable to allocate L1"); + panic("pmap_vp_enter: unable to allocate L1"); + return ENOMEM; } pmap_set_l1(pm, va, vp1, 0); } @@ -384,8 +384,8 @@ pmap_vp_enter(pmap_t pm, vaddr_t va, struct pte_desc *pted, int flags) vp2 = pool_get(&pmap_vp_pool, vp_pool_flags); if (vp2 == NULL) { if ((flags & PMAP_CANFAIL) == 0) - return ENOMEM; - panic("unable to allocate L2"); + panic("pmap_vp_enter: unable to allocate L2"); + return ENOMEM; } pmap_set_l2(pm, va, vp2, 0); } @@ -395,8 +395,8 @@ pmap_vp_enter(pmap_t pm, vaddr_t va, struct pte_desc *pted, int flags) vp3 = pool_get(&pmap_vp_pool, vp_pool_flags); if (vp3 == NULL) { if ((flags & PMAP_CANFAIL) == 0) - return ENOMEM; - panic("unable to allocate L3"); + panic("pmap_vp_enter: unable to allocate L3"); + return ENOMEM; } pmap_set_l3(pm, va, vp3, 0); } @@ -503,19 +503,17 @@ pmap_enter(pmap_t pm, vaddr_t va, paddr_t pa, vm_prot_t prot, int flags) if (pted == NULL) { pted = pool_get(&pmap_pted_pool, PR_NOWAIT | PR_ZERO); if (pted == NULL) { - if ((flags & PMAP_CANFAIL) == 0) { - error = ENOMEM; - goto out; - } - panic("pmap_enter: failed to allocate pted"); + if ((flags & PMAP_CANFAIL) == 0) + panic("pmap_enter: failed to allocate pted"); + error = ENOMEM; + goto out; } if (pmap_vp_enter(pm, va, pted, flags)) { - if ((flags & PMAP_CANFAIL) == 0) { - error = ENOMEM; - pool_put(&pmap_pted_pool, pted); - goto out; - } - panic("pmap_enter: failed to allocate L2/L3"); + if ((flags & PMAP_CANFAIL) == 0) + panic("pmap_enter: failed to allocate L2/L3"); + error = ENOMEM; + pool_put(&pmap_pted_pool, pted); + goto out; } } Dale Rahn dr...@dalerahn.com