Diff below switches the i386 pmap to use the modern km_alloc(9) functions and uses IPL_VM for the pmap pool, following the example of amd64.
Don't have easy access to an i386 machine right now, so this has only been compile tested. ok (if it works)? Index: arch/i386/i386/pmap.c =================================================================== RCS file: /cvs/src/sys/arch/i386/i386/pmap.c,v retrieving revision 1.209 diff -u -p -r1.209 pmap.c --- arch/i386/i386/pmap.c 24 Sep 2020 11:36:50 -0000 1.209 +++ arch/i386/i386/pmap.c 23 Dec 2020 17:17:29 -0000 @@ -1065,7 +1065,7 @@ pmap_bootstrap(vaddr_t kva_start) * initialize the pmap pool. */ - pool_init(&pmap_pmap_pool, sizeof(struct pmap), 32, IPL_NONE, 0, + pool_init(&pmap_pmap_pool, sizeof(struct pmap), 32, IPL_VM, 0, "pmappl", NULL); pool_init(&pmap_pv_pool, sizeof(struct pv_entry), 0, IPL_VM, 0, "pvpl", &pmap_pv_page_allocator); @@ -1363,11 +1363,10 @@ void pmap_pinit_pd_86(struct pmap *pmap) { /* allocate PDP */ - pmap->pm_pdir = uvm_km_alloc(kernel_map, NBPG); + pmap->pm_pdir = (vaddr_t)km_alloc(NBPG, &kv_any, &kp_dirty, &kd_waitok); if (pmap->pm_pdir == 0) panic("pmap_pinit_pd_86: kernel_map out of virtual space!"); - pmap_extract(pmap_kernel(), (vaddr_t)pmap->pm_pdir, - &pmap->pm_pdirpa); + pmap_extract(pmap_kernel(), (vaddr_t)pmap->pm_pdir, &pmap->pm_pdirpa); pmap->pm_pdirsize = NBPG; /* init PDP */ @@ -1395,7 +1394,8 @@ pmap_pinit_pd_86(struct pmap *pmap) * execution, one that lacks all kernel mappings. */ if (cpu_meltdown) { - pmap->pm_pdir_intel = uvm_km_zalloc(kernel_map, NBPG); + pmap->pm_pdir_intel = + (vaddr_t)km_alloc(NBPG, &kv_any, &kp_zero, &kd_waitok); if (pmap->pm_pdir_intel == 0) panic("%s: kernel_map out of virtual space!", __func__); @@ -1447,11 +1447,12 @@ pmap_destroy(struct pmap *pmap) uvm_pagefree(pg); } - uvm_km_free(kernel_map, pmap->pm_pdir, pmap->pm_pdirsize); + km_free((void *)pmap->pm_pdir, pmap->pm_pdirsize, &kv_any, &kp_dirty); pmap->pm_pdir = 0; if (pmap->pm_pdir_intel) { - uvm_km_free(kernel_map, pmap->pm_pdir_intel, pmap->pm_pdirsize); + km_free((void *)pmap->pm_pdir_intel, pmap->pm_pdirsize, + &kv_any, &kp_zero); pmap->pm_pdir_intel = 0; } @@ -2520,8 +2521,9 @@ pmap_enter_special_86(vaddr_t va, paddr_ __func__, va); if (!pmap->pm_pdir_intel) { - if ((pmap->pm_pdir_intel = uvm_km_zalloc(kernel_map, NBPG)) - == 0) + pmap->pm_pdir_intel = + (vaddr_t)km_alloc(NBPG, &kv_any, &kp_zero, &kd_waitok); + if (pmap->pm_pdir_intel == 0) panic("%s: kernel_map out of virtual space!", __func__); if (!pmap_extract(pmap, pmap->pm_pdir_intel, &pmap->pm_pdirpa_intel)) Index: arch/i386/i386/pmapae.c =================================================================== RCS file: /cvs/src/sys/arch/i386/i386/pmapae.c,v retrieving revision 1.60 diff -u -p -r1.60 pmapae.c --- arch/i386/i386/pmapae.c 23 Sep 2020 15:13:26 -0000 1.60 +++ arch/i386/i386/pmapae.c 23 Dec 2020 17:17:29 -0000 @@ -738,7 +738,7 @@ pmap_bootstrap_pae(void) (uint32_t)VM_PAGE_TO_PHYS(ptppg)); } } - uvm_km_free(kernel_map, (vaddr_t)pd, NBPG); + km_free(pd, NBPG, &kv_any, &kp_dirty); DPRINTF("%s: freeing PDP 0x%x\n", __func__, (uint32_t)pd); } @@ -944,7 +944,8 @@ pmap_pinit_pd_pae(struct pmap *pmap) paddr_t pdidx[4]; /* allocate PDP */ - pmap->pm_pdir = uvm_km_alloc(kernel_map, 4 * NBPG); + pmap->pm_pdir = (vaddr_t)km_alloc(4 * NBPG, &kv_any, + &kp_dirty, &kd_waitok); if (pmap->pm_pdir == 0) panic("pmap_pinit_pd_pae: kernel_map out of virtual space!"); /* page index is in the pmap! */ @@ -997,7 +998,8 @@ pmap_pinit_pd_pae(struct pmap *pmap) if (cpu_meltdown) { int i; - if ((va = uvm_km_zalloc(kernel_map, 4 * NBPG)) == 0) + va = (vaddr_t)km_alloc(4 * NBPG, &kv_any, &kp_zero, &kd_waitok); + if (va == 0) panic("%s: kernel_map out of virtual space!", __func__); if (!pmap_extract(pmap_kernel(), (vaddr_t)&pmap->pm_pdidx_intel, &pmap->pm_pdirpa_intel)) @@ -1936,7 +1938,8 @@ pmap_enter_special_pae(vaddr_t va, paddr __func__, va); if (!pmap->pm_pdir_intel) { - if ((vapd = uvm_km_zalloc(kernel_map, 4 * NBPG)) == 0) + vapd = (vaddr_t)km_alloc(4 * NBPG, &kv_any, &kp_zero, &kd_waitok); + if (vapd == 0) panic("%s: kernel_map out of virtual space!", __func__); pmap->pm_pdir_intel = vapd; if (!pmap_extract(pmap, (vaddr_t)&pmap->pm_pdidx_intel, Index: arch/powerpc64/powerpc64/pmap.c =================================================================== RCS file: /cvs/src/sys/arch/powerpc64/powerpc64/pmap.c,v retrieving revision 1.54 diff -u -p -r1.54 pmap.c --- arch/powerpc64/powerpc64/pmap.c 27 Oct 2020 12:45:32 -0000 1.54 +++ arch/powerpc64/powerpc64/pmap.c 23 Dec 2020 17:17:30 -0000 @@ -995,7 +995,7 @@ pmap_init(void) { int i; - pool_init(&pmap_pmap_pool, sizeof(struct pmap), 0, IPL_NONE, 0, + pool_init(&pmap_pmap_pool, sizeof(struct pmap), 0, IPL_MPFLOOR, 0, "pmap", &pool_allocator_single); pool_setlowat(&pmap_pmap_pool, 2); pool_init(&pmap_vp_pool, sizeof(struct pmapvp1), 0, IPL_VM, 0, Index: uvm/uvm_map.c =================================================================== RCS file: /cvs/src/sys/uvm/uvm_map.c,v retrieving revision 1.269 diff -u -p -r1.269 uvm_map.c --- uvm/uvm_map.c 19 Oct 2020 08:19:46 -0000 1.269 +++ uvm/uvm_map.c 23 Dec 2020 17:17:31 -0000 @@ -2761,10 +2761,10 @@ uvm_map_teardown(struct vm_map *map) #endif uvm_unmap_detach(&dead_entries, UVM_PLA_WAITOK); - KERNEL_LOCK(); - pmap_destroy(map->pmap); map->pmap = NULL; + + KERNEL_LOCK(); } /*