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();
 }
 
 /*

Reply via email to