? lib/libperfuse/sh.core
? sbin/routed/rtquery/.depend
? sbin/routed/rtquery/rtquery.d
? sys/arch/amd64/compile/APHRODITE
? sys/arch/amd64/compile/DIAGNOSTIC
? sys/arch/amd64/conf/APHRODITE
? sys/arch/amd64/conf/DIAGNOSTIC
? sys/arch/i386/compile/APHRODITE
? sys/arch/i386/conf/APHRODITE
? usr.sbin/pstat/.gdbinit
Index: external/cddl/osnet/dist/uts/common/fs/zfs/arc.c
===================================================================
RCS file: /cvsroot/src/external/cddl/osnet/dist/uts/common/fs/zfs/arc.c,v
retrieving revision 1.10
diff -u -p -r1.10 arc.c
--- external/cddl/osnet/dist/uts/common/fs/zfs/arc.c    20 Nov 2011 02:54:25 -0000      1.10
+++ external/cddl/osnet/dist/uts/common/fs/zfs/arc.c    23 Jan 2012 22:00:33 -0000
@@ -152,33 +152,12 @@
#define        curproc         curlwp
#define        proc_pageout    uvm.pagedaemon_lwp

-#define        heap_arena      kernel_map
-#define        VMEM_ALLOC      1
-#define        VMEM_FREE       2
-static inline size_t
-vmem_size(struct vm_map *map, int flag)
-{
-       switch (flag) {
-       case VMEM_ALLOC:
-               return map->size;
-       case VMEM_FREE:
-               return vm_map_max(map) - vm_map_min(map) - map->size;
-       case VMEM_FREE|VMEM_ALLOC:
-               return vm_map_max(map) - vm_map_min(map);
-       default:
-               panic("vmem_size");
-       }
-}
static void    *zio_arena;

#include <sys/callback.h>
/* Structures used for memory and kva space reclaim. */
static struct callback_entry arc_kva_reclaim_entry;

-#ifdef _KERNEL
-static struct uvm_reclaim_hook arc_hook;
-#endif
-
#endif /* __NetBSD__ */

static kmutex_t                arc_reclaim_thr_lock;
@@ -2028,7 +2007,7 @@ arc_reclaim_needed(void)
       /*
        * If we're on an i386 platform, it's possible that we'll exhaust the
        * kernel heap space before we ever run out of available physical
-        * memory.  Most checks of the size of the heap_area compare against
+        * memory.  Most checks of the size of the kmem_area compare against
        * tune.t_minarmem, which is the minimum available real memory that we
        * can have in the system.  However, this is generally fixed at 25 pages
        * which is so low that it's useless.  In this comparison, we seek to
@@ -2036,8 +2015,8 @@ arc_reclaim_needed(void)
        * heap is allocated.  (Or, in the calculation, if less than 1/4th is
        * free)
        */
-       if (btop(vmem_size(heap_arena, VMEM_FREE)) <
-           (btop(vmem_size(heap_arena, VMEM_FREE | VMEM_ALLOC)) >> 2))
+       if (btop(vmem_size(kmem_arena, VMEM_FREE)) <
+           (btop(vmem_size(kmem_arena, VMEM_FREE | VMEM_ALLOC)) >> 2))
               return (1);
#endif

@@ -3359,7 +3338,7 @@ arc_memory_throttle(uint64_t reserve, ui
       static uint64_t last_txg = 0;

       available_memory =
-           MIN(available_memory, vmem_size(heap_arena, VMEM_FREE));
+           MIN(available_memory, vmem_size(kmem_arena, VMEM_FREE));
       if (available_memory >= zfs_write_limit_max)
               return (0);

@@ -3511,7 +3490,7 @@ arc_init(void)
        * than the addressable space (intel in 32-bit mode), we may
        * need to limit the cache to 1/8 of VM size.
        */
-       arc_c = MIN(arc_c, vmem_size(heap_arena, VMEM_ALLOC | VMEM_FREE) / 8);
+       arc_c = MIN(arc_c, vmem_size(kmem_arena, VMEM_ALLOC | VMEM_FREE) / 8);
#endif

       /* set min cache to 1/32 of all memory, or 64MB, whichever is more */
@@ -3615,11 +3594,11 @@ arc_init(void)
           TS_RUN, maxclsyspri);

#if defined(__NetBSD__) && defined(_KERNEL)
-       arc_hook.uvm_reclaim_hook = &arc_uvm_reclaim_hook;
+/*     arc_hook.uvm_reclaim_hook = &arc_uvm_reclaim_hook;

       uvm_reclaim_hook_add(&arc_hook);
       callback_register(&vm_map_to_kernel(kernel_map)->vmk_reclaim_callback,
-           &arc_kva_reclaim_entry, NULL, arc_kva_reclaim_callback);
+           &arc_kva_reclaim_entry, NULL, arc_kva_reclaim_callback); */

#endif

@@ -3674,9 +3653,9 @@ arc_fini(void)
       mutex_destroy(&zfs_write_limit_lock);

#if defined(__NetBSD__) && defined(_KERNEL)
-       uvm_reclaim_hook_del(&arc_hook);
+/*     uvm_reclaim_hook_del(&arc_hook);
       callback_unregister(&vm_map_to_kernel(kernel_map)->vmk_reclaim_callback,
-           &arc_kva_reclaim_entry);
+           &arc_kva_reclaim_entry); */
#endif

       buf_fini();
Index: sys/arch/algor/dev/mainbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/algor/dev/mainbus.c,v
retrieving revision 1.25
diff -u -p -r1.25 mainbus.c
--- sys/arch/algor/dev/mainbus.c        9 Jul 2011 16:03:01 -0000       1.25
+++ sys/arch/algor/dev/mainbus.c        23 Jan 2012 22:01:36 -0000
@@ -159,9 +159,9 @@ mainbus_attach(device_t parent, device_t
        * Reserve the bottom 64K of the I/O space for ISA devices.
        */
       ioext  = extent_create("pciio",  0x00010000, 0x000effff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       memext = extent_create("pcimem", 0x01000000, 0x07ffffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

       pc = &p4032_configuration.ac_pc;
#elif defined(ALGOR_P5064)
@@ -171,9 +171,9 @@ mainbus_attach(device_t parent, device_t
        * a bug in the ISA bridge.
        */
       ioext  = extent_create("pciio",  0x00080000, 0x00ffffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       memext = extent_create("pcimem", 0x01000000, 0x07ffffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

       pc = &p5064_configuration.ac_pc;
#if defined(PCI_NETBSD_ENABLE_IDE)
@@ -184,9 +184,9 @@ mainbus_attach(device_t parent, device_t
        * Reserve the bottom 64K of the I/O space for ISA devices.
        */
       ioext  = extent_create("pciio",  0x00010000, 0x000effff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       memext = extent_create("pcimem", 0x01000000, 0x0affffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

       pc = &p6032_configuration.ac_pc;
#if defined(PCI_NETBSD_ENABLE_IDE)
Index: sys/arch/alpha/alpha/pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/alpha/pmap.c,v
retrieving revision 1.255
diff -u -p -r1.255 pmap.c
--- sys/arch/alpha/alpha/pmap.c 12 Nov 2010 07:59:25 -0000      1.255
+++ sys/arch/alpha/alpha/pmap.c 23 Jan 2012 22:01:37 -0000
@@ -757,11 +757,6 @@ pmap_bootstrap(paddr_t ptaddr, u_int max
#endif

       /*
-        * Compute the number of pages kmem_map will have.
-        */
-       kmeminit_nkmempages();
-
-       /*
        * Figure out how many initial PTE's are necessary to map the
        * kernel.  We also reserve space for kmem_alloc_pageable()
        * for vm_fork().
@@ -774,7 +769,7 @@ pmap_bootstrap(paddr_t ptaddr, u_int max
       lev3mapsize =
               (VM_PHYS_SIZE + (ubc_nwins << ubc_winshift) +
                bufsz + 16 * NCARGS + pager_map_size) / PAGE_SIZE +
-               (maxproc * UPAGES) + nkmempages;
+               (maxproc * UPAGES) + (256 * 1024 * 1024) / PAGE_SIZE;

#ifdef SYSVSHM
       lev3mapsize += shminfo.shmall;
Index: sys/arch/alpha/common/sgmap_common.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/common/sgmap_common.c,v
retrieving revision 1.25
diff -u -p -r1.25 sgmap_common.c
--- sys/arch/alpha/common/sgmap_common.c        1 Jul 2011 19:22:35 -0000       1.25
+++ sys/arch/alpha/common/sgmap_common.c        23 Jan 2012 22:01:37 -0000
@@ -107,7 +107,7 @@ alpha_sgmap_init(bus_dma_tag_t t, struct
        * space.
        */
       sgmap->aps_ex = extent_create(name, sgvabase, sgvasize - 1,
-           M_DMAMAP, NULL, 0, EX_NOWAIT|EX_NOCOALESCE);
+           NULL, 0, EX_NOWAIT|EX_NOCOALESCE);
       if (sgmap->aps_ex == NULL) {
               printf("unable to create extent map for sgmap `%s'\n",
                   name);
Index: sys/arch/alpha/pci/pci_bwx_bus_io_chipdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_bwx_bus_io_chipdep.c,v
retrieving revision 1.19
diff -u -p -r1.19 pci_bwx_bus_io_chipdep.c
--- sys/arch/alpha/pci/pci_bwx_bus_io_chipdep.c 25 Sep 2011 13:36:53 -0000      1.19
+++ sys/arch/alpha/pci/pci_bwx_bus_io_chipdep.c 23 Jan 2012 22:01:37 -0000
@@ -302,7 +302,7 @@ __C(CHIP,_bus_io_init)(t, v)
       t->abs_c_8 =            __C(CHIP,_io_copy_region_8);

       ex = extent_create(__S(__C(CHIP,_bus_io)), 0x0UL, 0xffffffffUL,
-           M_DEVBUF, (void *)CHIP_IO_EX_STORE(v), CHIP_IO_EX_STORE_SIZE(v),
+           (void *)CHIP_IO_EX_STORE(v), CHIP_IO_EX_STORE_SIZE(v),
           EX_NOWAIT|EX_NOCOALESCE);

       CHIP_IO_EXTENT(v) = ex;
Index: sys/arch/alpha/pci/pci_bwx_bus_mem_chipdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_bwx_bus_mem_chipdep.c,v
retrieving revision 1.23
diff -u -p -r1.23 pci_bwx_bus_mem_chipdep.c
--- sys/arch/alpha/pci/pci_bwx_bus_mem_chipdep.c        25 Sep 2011 13:36:53 -0000      1.23
+++ sys/arch/alpha/pci/pci_bwx_bus_mem_chipdep.c        23 Jan 2012 22:01:37 -0000
@@ -302,7 +302,7 @@ __C(CHIP,_bus_mem_init)(t, v)
       t->abs_c_8 =            __C(CHIP,_mem_copy_region_8);

       ex = extent_create(__S(__C(CHIP,_bus_mem)), 0x0UL, 0xffffffffUL,
-           M_DEVBUF, (void *)CHIP_MEM_EX_STORE(v), CHIP_MEM_EX_STORE_SIZE(v),
+           (void *)CHIP_MEM_EX_STORE(v), CHIP_MEM_EX_STORE_SIZE(v),
           EX_NOWAIT|EX_NOCOALESCE);

        CHIP_MEM_EXTENT(v) = ex;
Index: sys/arch/alpha/pci/pci_swiz_bus_io_chipdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_swiz_bus_io_chipdep.c,v
retrieving revision 1.39
diff -u -p -r1.39 pci_swiz_bus_io_chipdep.c
--- sys/arch/alpha/pci/pci_swiz_bus_io_chipdep.c        25 Sep 2011 13:36:53 -0000      1.39
+++ sys/arch/alpha/pci/pci_swiz_bus_io_chipdep.c        23 Jan 2012 22:01:38 -0000
@@ -307,7 +307,7 @@ __C(CHIP,_bus_io_init)(bus_space_tag_t t

       /* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
       ex = extent_create(__S(__C(CHIP,_bus_io)), 0x0UL, 0xffffffffUL,
-           M_DEVBUF, (void *)CHIP_IO_EX_STORE(v), CHIP_IO_EX_STORE_SIZE(v),
+           (void *)CHIP_IO_EX_STORE(v), CHIP_IO_EX_STORE_SIZE(v),
           EX_NOWAIT);
       extent_alloc_region(ex, 0, 0xffffffffUL, EX_NOWAIT);

Index: sys/arch/alpha/pci/pci_swiz_bus_mem_chipdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/alpha/pci/pci_swiz_bus_mem_chipdep.c,v
retrieving revision 1.44
diff -u -p -r1.44 pci_swiz_bus_mem_chipdep.c
--- sys/arch/alpha/pci/pci_swiz_bus_mem_chipdep.c       25 Sep 2011 13:36:53 -0000      1.44
+++ sys/arch/alpha/pci/pci_swiz_bus_mem_chipdep.c       23 Jan 2012 22:01:38 -0000
@@ -329,7 +329,7 @@ __C(CHIP,_bus_mem_init)(bus_space_tag_t
#ifdef CHIP_D_MEM_W1_SYS_START
       /* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
       dex = extent_create(__S(__C(CHIP,_bus_dmem)), 0x0UL,
-           0xffffffffffffffffUL, M_DEVBUF,
+           0xffffffffffffffffUL,
           (void *)CHIP_D_MEM_EX_STORE(v), CHIP_D_MEM_EX_STORE_SIZE(v),
           EX_NOWAIT);
       extent_alloc_region(dex, 0, 0xffffffffffffffffUL, EX_NOWAIT);
@@ -352,7 +352,7 @@ __C(CHIP,_bus_mem_init)(bus_space_tag_t

       /* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
       sex = extent_create(__S(__C(CHIP,_bus_smem)), 0x0UL,
-           0xffffffffffffffffUL, M_DEVBUF,
+           0xffffffffffffffffUL,
           (void *)CHIP_S_MEM_EX_STORE(v), CHIP_S_MEM_EX_STORE_SIZE(v),
           EX_NOWAIT);
       extent_alloc_region(sex, 0, 0xffffffffffffffffUL, EX_NOWAIT);
Index: sys/arch/amd64/amd64/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/amd64/amd64/machdep.c,v
retrieving revision 1.174
diff -u -p -r1.174 machdep.c
--- sys/arch/amd64/amd64/machdep.c      12 Jan 2012 19:49:37 -0000      1.174
+++ sys/arch/amd64/amd64/machdep.c      23 Jan 2012 22:01:39 -0000
@@ -278,7 +278,7 @@ vaddr_t lo32_vaddr;
paddr_t lo32_paddr;

vaddr_t module_start, module_end;
-static struct vm_map_kernel module_map_store;
+static struct vm_map module_map_store;
extern struct vm_map *module_map;
vaddr_t kern_end;

@@ -386,9 +386,9 @@ cpu_startup(void)
       phys_map = uvm_km_suballoc(kernel_map, &minaddr, &maxaddr,
                                  VM_PHYS_SIZE, 0, false, NULL);

-       uvm_map_setup_kernel(&module_map_store, module_start, module_end, 0);
-       module_map_store.vmk_map.pmap = pmap_kernel();
-       module_map = &module_map_store.vmk_map;
+       uvm_map_setup(&module_map_store, module_start, module_end, 0);
+       module_map_store.pmap = pmap_kernel();
+       module_map = &module_map_store;

       /* Say hello. */
       banner();
Index: sys/arch/arc/arc/bus_space.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arc/arc/bus_space.c,v
retrieving revision 1.11
diff -u -p -r1.11 bus_space.c
--- sys/arch/arc/arc/bus_space.c        17 Jul 2011 01:36:50 -0000      1.11
+++ sys/arch/arc/arc/bus_space.c        23 Jan 2012 22:01:40 -0000
@@ -343,7 +343,7 @@ arc_bus_space_init_extent(bus_space_tag_
{

       bst->bs_extent = extent_create(bst->bs_name,
-           bst->bs_start, bst->bs_start + bst->bs_size, M_DEVBUF,
+           bst->bs_start, bst->bs_start + bst->bs_size,
           storage, storagesize, EX_NOWAIT);
       if (bst->bs_extent == NULL)
               panic("arc_bus_space_init_extent: cannot create extent map %s",
Index: sys/arch/arc/arc/wired_map_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arc/arc/wired_map_machdep.c,v
retrieving revision 1.6
diff -u -p -r1.6 wired_map_machdep.c
--- sys/arch/arc/arc/wired_map_machdep.c        16 Dec 2009 23:19:06 -0000      1.6
+++ sys/arch/arc/arc/wired_map_machdep.c        23 Jan 2012 22:01:40 -0000
@@ -55,7 +55,7 @@ arc_init_wired_map(void)

       mips3_nwired_page = 0;
       arc_wired_map_ex = extent_create("wired_map",
-           VM_MIN_WIRED_MAP_ADDRESS, VM_MAX_WIRED_MAP_ADDRESS, M_DEVBUF,
+           VM_MIN_WIRED_MAP_ADDRESS, VM_MAX_WIRED_MAP_ADDRESS,
           (void *)wired_map_ex_storage, sizeof(wired_map_ex_storage),
           EX_NOWAIT);
       if (arc_wired_map_ex == NULL)
Index: sys/arch/arc/jazz/jazzdmatlb.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arc/jazz/jazzdmatlb.c,v
retrieving revision 1.15
diff -u -p -r1.15 jazzdmatlb.c
--- sys/arch/arc/jazz/jazzdmatlb.c      1 Jul 2011 19:25:41 -0000       1.15
+++ sys/arch/arc/jazz/jazzdmatlb.c      23 Jan 2012 22:01:40 -0000
@@ -85,8 +85,7 @@ jazz_dmatlb_init(bus_space_tag_t iot, bu
       mips_dcache_wbinv_all();/* Make sure no map entries are cached */
       memset((char *)dma_tlb, 0, JAZZ_DMATLB_SIZE);

-       dmatlbmap = extent_create("dmatlb", 0, NDMATLB, M_DEVBUF, NULL, 0,
-           EX_NOWAIT);
+       dmatlbmap = extent_create("dmatlb", 0, NDMATLB, NULL, 0, EX_NOWAIT);
       if (dmatlbmap == NULL)
               panic("jazz_dmatlb_init: cannot create extent map");

Index: sys/arch/arc/pci/necpb.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arc/pci/necpb.c,v
retrieving revision 1.37
diff -u -p -r1.37 necpb.c
--- sys/arch/arc/pci/necpb.c    1 Jul 2011 19:28:00 -0000       1.37
+++ sys/arch/arc/pci/necpb.c    23 Jan 2012 22:01:40 -0000
@@ -243,9 +243,9 @@ necpbattach(device_t parent, device_t se
       pc = &sc->sc_ncp->nc_pc;
#ifdef PCI_NETBSD_CONFIGURE
       pc->pc_ioext = extent_create("necpbio", 0x00100000, 0x01ffffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       pc->pc_memext = extent_create("necpbmem", 0x08000000, 0x3fffffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       pci_configure_bus(pc, pc->pc_ioext, pc->pc_memext, NULL, 0,
           mips_cache_info.mci_dcache_align);
#endif
Index: sys/arch/arm/arm/arm_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/arm/arm_machdep.c,v
retrieving revision 1.30
diff -u -p -r1.30 arm_machdep.c
--- sys/arch/arm/arm/arm_machdep.c      4 Mar 2011 22:25:25 -0000       1.30
+++ sys/arch/arm/arm/arm_machdep.c      23 Jan 2012 22:01:40 -0000
@@ -262,10 +262,6 @@ cpu_upcall(struct lwp *l, int type, int
void
cpu_need_resched(struct cpu_info *ci, int flags)
{
-       bool immed = (flags & RESCHED_IMMED) != 0;
-
-       if (ci->ci_want_resched && !immed)
-               return;

       ci->ci_want_resched = 1;
       if (curlwp != ci->ci_data.cpu_idlelwp)
Index: sys/arch/arm/arm32/pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/arm32/pmap.c,v
retrieving revision 1.224
diff -u -p -r1.224 pmap.c
--- sys/arch/arm/arm32/pmap.c   1 Jul 2011 20:57:45 -0000       1.224
+++ sys/arch/arm/arm32/pmap.c   23 Jan 2012 22:01:42 -0000
@@ -197,8 +197,9 @@
#include <sys/kernel.h>
#include <sys/systm.h>
#include <sys/proc.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/pool.h>
+#include <sys/kmem.h>
#include <sys/cdefs.h>
#include <sys/cpu.h>
#include <sys/sysctl.h>
@@ -5497,7 +5498,7 @@ pmap_postinit(void)
       needed = (maxproc / PMAP_DOMAINS) + ((maxproc % PMAP_DOMAINS) ? 1 : 0);
       needed -= 1;

-       l1 = malloc(sizeof(*l1) * needed, M_VMPMAP, M_WAITOK);
+       l1 = kmem_alloc(sizeof(*l1) * needed, KM_SLEEP);

       for (loop = 0; loop < needed; loop++, l1++) {
               /* Allocate a L1 page table */
@@ -5506,7 +5507,7 @@ pmap_postinit(void)
                       panic("Cannot allocate L1 KVM");

               error = uvm_pglistalloc(L1_TABLE_SIZE, physical_start,
-                   physical_end, L1_TABLE_SIZE, 0, &plist, 1, M_WAITOK);
+                   physical_end, L1_TABLE_SIZE, 0, &plist, 1, 1);
               if (error)
                       panic("Cannot allocate L1 physical pages");

Index: sys/arch/arm/gemini/gemini_pci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/gemini/gemini_pci.c,v
retrieving revision 1.10
diff -u -p -r1.10 gemini_pci.c
--- sys/arch/arm/gemini/gemini_pci.c    1 Jul 2011 19:32:28 -0000       1.10
+++ sys/arch/arm/gemini/gemini_pci.c    23 Jan 2012 22:01:42 -0000
@@ -211,7 +211,7 @@ gemini_pci_init(pci_chipset_tag_t pc, vo
       ioext  = extent_create("pciio",
               GEMINI_PCIIO_BASE,
               GEMINI_PCIIO_BASE + GEMINI_PCIIO_SIZE - 1,
-               M_DEVBUF, NULL, 0, EX_NOWAIT);
+               NULL, 0, EX_NOWAIT);

       /*
        * XXX PCI mem addr should be inherited ?
@@ -219,7 +219,7 @@ gemini_pci_init(pci_chipset_tag_t pc, vo
       memext = extent_create("pcimem",
               GEMINI_PCIMEM_BASE,
               GEMINI_PCIMEM_BASE + GEMINI_PCIMEM_SIZE - 1,
-               M_DEVBUF, NULL, 0, EX_NOWAIT);
+               NULL, 0, EX_NOWAIT);

       pci_configure_bus(pc, ioext, memext, NULL, 0, arm_dcache_align);

Index: sys/arch/arm/ixp12x0/ixp12x0_pci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/ixp12x0/ixp12x0_pci.c,v
retrieving revision 1.10
diff -u -p -r1.10 ixp12x0_pci.c
--- sys/arch/arm/ixp12x0/ixp12x0_pci.c  14 Mar 2009 21:04:05 -0000      1.10
+++ sys/arch/arm/ixp12x0/ixp12x0_pci.c  23 Jan 2012 22:01:42 -0000
@@ -95,12 +95,12 @@ ixp12x0_pci_init(pci_chipset_tag_t pc, v

#if NPCI > 0 && defined(PCI_NETBSD_CONFIGURE)
       ioext  = extent_create("pciio", 0, IXP12X0_PCI_IO_SIZE - 1,
-                               M_DEVBUF, NULL, 0, EX_NOWAIT);
+                               NULL, 0, EX_NOWAIT);
       /* PCI MEM space is mapped same address as real memory */
       memext = extent_create("pcimem", IXP12X0_PCI_MEM_HWBASE,
                               IXP12X0_PCI_MEM_HWBASE +
                               IXP12X0_PCI_MEM_SIZE - 1,
-                               M_DEVBUF, NULL, 0, EX_NOWAIT);
+                               NULL, 0, EX_NOWAIT);
       printf("%s: configuring PCI bus\n", sc->sc_dev.dv_xname);
       pci_configure_bus(pc, ioext, memext, NULL, 0 /* XXX bus = 0 */,
                         arm_dcache_align);
Index: sys/arch/arm/s3c2xx0/s3c2800_pci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/s3c2xx0/s3c2800_pci.c,v
retrieving revision 1.16
diff -u -p -r1.16 s3c2800_pci.c
--- sys/arch/arm/s3c2xx0/s3c2800_pci.c  1 Jul 2011 20:31:39 -0000       1.16
+++ sys/arch/arm/s3c2xx0/s3c2800_pci.c  23 Jan 2012 22:01:42 -0000
@@ -293,10 +293,10 @@ sspci_attach(struct device *parent, stru

#if defined(PCI_NETBSD_CONFIGURE)
       ioext = extent_create("pciio", 0x100, S3C2800_PCI_IOSPACE_SIZE - 0x100,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

       memext = extent_create("pcimem", 0, S3C2800_PCI_MEMSPACE_SIZE,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

       sspci_chipset.pc_conf_v = (void *) sc;
       sspci_chipset.pc_intr_v = (void *) sc;
Index: sys/arch/arm/xscale/becc_pci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/xscale/becc_pci.c,v
retrieving revision 1.10
diff -u -p -r1.10 becc_pci.c
--- sys/arch/arm/xscale/becc_pci.c      1 Jul 2011 20:32:51 -0000       1.10
+++ sys/arch/arm/xscale/becc_pci.c      23 Jan 2012 22:01:43 -0000
@@ -125,10 +125,10 @@ becc_pci_init(pci_chipset_tag_t pc, void
       /* Reserve the bottom 32K of the PCI address space. */
       ioext  = extent_create("pciio", sc->sc_ioout_xlate + (32 * 1024),
           sc->sc_ioout_xlate + (64 * 1024) - 1,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       memext = extent_create("pcimem", sc->sc_owin_xlate[0],
           sc->sc_owin_xlate[0] + BECC_PCI_MEM1_SIZE - 1,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

       aprint_normal("%s: configuring PCI bus\n", sc->sc_dev.dv_xname);
       pci_configure_bus(pc, ioext, memext, NULL, 0, arm_dcache_align);
Index: sys/arch/arm/xscale/i80312_pci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/xscale/i80312_pci.c,v
retrieving revision 1.10
diff -u -p -r1.10 i80312_pci.c
--- sys/arch/arm/xscale/i80312_pci.c    1 Jul 2011 20:32:51 -0000       1.10
+++ sys/arch/arm/xscale/i80312_pci.c    23 Jan 2012 22:01:43 -0000
@@ -108,10 +108,10 @@ i80312_pci_init(pci_chipset_tag_t pc, vo

       ioext  = extent_create("pciio", sc->sc_sioout_base,
           sc->sc_sioout_base + sc->sc_sioout_size - 1,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       memext = extent_create("pcimem", sc->sc_smemout_base,
           sc->sc_smemout_base + sc->sc_smemout_size - 1,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

       aprint_normal("%s: configuring Secondary PCI bus\n", sc->sc_dev.dv_xname);
       pci_configure_bus(pc, ioext, memext, NULL, sbus, arm_dcache_align);
Index: sys/arch/arm/xscale/i80321_pci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/xscale/i80321_pci.c,v
retrieving revision 1.10
diff -u -p -r1.10 i80321_pci.c
--- sys/arch/arm/xscale/i80321_pci.c    1 Jul 2011 20:32:51 -0000       1.10
+++ sys/arch/arm/xscale/i80321_pci.c    23 Jan 2012 22:01:43 -0000
@@ -110,16 +110,16 @@ i80321_pci_init(pci_chipset_tag_t pc, vo
       ioext  = extent_create("pciio",
           sc->sc_ioout_xlate + sc->sc_ioout_xlate_offset,
           sc->sc_ioout_xlate + VERDE_OUT_XLATE_IO_WIN_SIZE - 1,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

#ifdef I80321_USE_DIRECT_WIN
       memext = extent_create("pcimem", VERDE_OUT_DIRECT_WIN_BASE + VERDE_OUT_DIRECT_WIN_SKIP,
           VERDE_OUT_DIRECT_WIN_BASE + VERDE_OUT_DIRECT_WIN_SIZE- 1,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
#else
       memext = extent_create("pcimem", sc->sc_owin[0].owin_xlate_lo,
           sc->sc_owin[0].owin_xlate_lo + VERDE_OUT_XLATE_MEM_WIN_SIZE - 1,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
#endif

       aprint_normal("%s: configuring PCI bus\n", sc->sc_dev.dv_xname);
Index: sys/arch/arm/xscale/ixp425_pci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/xscale/ixp425_pci.c,v
retrieving revision 1.7
diff -u -p -r1.7 ixp425_pci.c
--- sys/arch/arm/xscale/ixp425_pci.c    1 Jul 2011 20:32:51 -0000       1.7
+++ sys/arch/arm/xscale/ixp425_pci.c    23 Jan 2012 22:01:43 -0000
@@ -89,12 +89,12 @@ ixp425_pci_init(struct ixp425_softc *sc)

#if NPCI > 0 && defined(PCI_NETBSD_CONFIGURE)
       ioext  = extent_create("pciio", 0, IXP425_PCI_IO_SIZE - 1,
-                               M_DEVBUF, NULL, 0, EX_NOWAIT);
+                               NULL, 0, EX_NOWAIT);
       /* PCI MEM space is mapped same address as real memory */
       memext = extent_create("pcimem", IXP425_PCI_MEM_HWBASE,
                               IXP425_PCI_MEM_HWBASE +
                               IXP425_PCI_MEM_SIZE - 1,
-                               M_DEVBUF, NULL, 0, EX_NOWAIT);
+                               NULL, 0, EX_NOWAIT);
       printf("%s: configuring PCI bus\n", sc->sc_dev.dv_xname);
       pci_configure_bus(pc, ioext, memext, NULL, 0 /* XXX bus = 0 */,
                         arm_dcache_align);
Index: sys/arch/atari/atari/atari_init.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/atari/atari_init.c,v
retrieving revision 1.96
diff -u -p -r1.96 atari_init.c
--- sys/arch/atari/atari/atari_init.c   26 Nov 2011 14:05:52 -0000      1.96
+++ sys/arch/atari/atari/atari_init.c   23 Jan 2012 22:01:43 -0000
@@ -588,7 +588,7 @@ start_c(int id, u_int ttphystart, u_int
        * on the machine.  When the amount of RAM is found, all
        * extents of RAM are allocated from the map.
        */
-       iomem_ex = extent_create("iomem", 0x0, 0xffffffff, M_DEVBUF,
+       iomem_ex = extent_create("iomem", 0x0, 0xffffffff,
           (void *)iomem_ex_storage, sizeof(iomem_ex_storage),
           EX_NOCOALESCE|EX_NOWAIT);

Index: sys/arch/atari/atari/bus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/atari/atari/bus.c,v
retrieving revision 1.56
diff -u -p -r1.56 bus.c
--- sys/arch/atari/atari/bus.c  1 Jul 2011 20:34:05 -0000       1.56
+++ sys/arch/atari/atari/bus.c  23 Jan 2012 22:01:43 -0000
@@ -86,7 +86,7 @@ static int    bootm_free(vaddr_t va, u_long
void
bootm_init(vaddr_t va, pt_entry_t *ptep, u_long size)
{
-       bootm_ex = extent_create("bootmem", va, va + size, M_DEVBUF,
+       bootm_ex = extent_create("bootmem", va, va + size,
           (void *)bootm_ex_storage, sizeof(bootm_ex_storage),
           EX_NOCOALESCE|EX_NOWAIT);
       bootm_ptep = ptep;
Index: sys/arch/bebox/bebox/mainbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/bebox/bebox/mainbus.c,v
retrieving revision 1.28
diff -u -p -r1.28 mainbus.c
--- sys/arch/bebox/bebox/mainbus.c      7 Aug 2011 15:31:35 -0000       1.28
+++ sys/arch/bebox/bebox/mainbus.c      23 Jan 2012 22:01:43 -0000
@@ -135,9 +135,9 @@ mainbus_attach(device_t parent, device_t
       SIMPLEQ_INSERT_TAIL(&genppc_pct->pc_pbi, pbi, next);

#ifdef PCI_NETBSD_CONFIGURE
-       ioext  = extent_create("pciio",  0x00008000, 0x0000ffff, M_DEVBUF,
+       ioext  = extent_create("pciio",  0x00008000, 0x0000ffff,
           NULL, 0, EX_NOWAIT);
-       memext = extent_create("pcimem", 0x00000000, 0x0fffffff, M_DEVBUF,
+       memext = extent_create("pcimem", 0x00000000, 0x0fffffff,
           NULL, 0, EX_NOWAIT);

       pci_configure_bus(genppc_pct, ioext, memext, NULL, 0, CACHELINESIZE);
Index: sys/arch/cobalt/dev/gt.c
===================================================================
RCS file: /cvsroot/src/sys/arch/cobalt/dev/gt.c,v
retrieving revision 1.27
diff -u -p -r1.27 gt.c
--- sys/arch/cobalt/dev/gt.c    9 Jul 2011 16:09:01 -0000       1.27
+++ sys/arch/cobalt/dev/gt.c    23 Jan 2012 22:01:44 -0000
@@ -126,9 +126,9 @@ gt_attach(device_t parent, device_t self

#ifdef PCI_NETBSD_CONFIGURE
       pc->pc_ioext = extent_create("pciio", 0x10001000, 0x11ffffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       pc->pc_memext = extent_create("pcimem", 0x12000000, 0x13ffffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       pci_configure_bus(pc, pc->pc_ioext, pc->pc_memext, NULL, 0,
           mips_cache_info.mci_dcache_align);
#endif
Index: sys/arch/dreamcast/dev/g2/gapspci_dma.c
===================================================================
RCS file: /cvsroot/src/sys/arch/dreamcast/dev/g2/gapspci_dma.c,v
retrieving revision 1.19
diff -u -p -r1.19 gapspci_dma.c
--- sys/arch/dreamcast/dev/g2/gapspci_dma.c     19 Jul 2011 15:52:29 -0000      1.19
+++ sys/arch/dreamcast/dev/g2/gapspci_dma.c     23 Jan 2012 22:01:44 -0000
@@ -109,7 +109,7 @@ gaps_dma_init(struct gaps_softc *sc)
        */
       sc->sc_dma_ex = extent_create("gaps dma",
           sc->sc_dmabase, sc->sc_dmabase + (sc->sc_dmasize - 1),
-           M_DEVBUF, NULL, 0, EX_WAITOK | EXF_NOCOALESCE);
+           NULL, 0, EX_WAITOK | EXF_NOCOALESCE);

       if (bus_space_map(sc->sc_memt, sc->sc_dmabase, sc->sc_dmasize,
           0, &sc->sc_dma_memh) != 0)
Index: sys/arch/emips/emips/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/emips/emips/machdep.c,v
retrieving revision 1.5
diff -u -p -r1.5 machdep.c
--- sys/arch/emips/emips/machdep.c      12 Jun 2011 03:21:21 -0000      1.5
+++ sys/arch/emips/emips/machdep.c      23 Jan 2012 22:01:44 -0000
@@ -338,7 +338,7 @@ consinit(void)
        */
       KASSERT(iospace != 0);
       iomap_ex = extent_create("iomap", iospace,
-           iospace + iospace_size - 1, M_DEVBUF,
+           iospace + iospace_size - 1,
           (void *) iomap_ex_storage, sizeof(iomap_ex_storage),
           EX_NOCOALESCE|EX_NOWAIT);

Index: sys/arch/evbarm/ifpga/ifpga.c
===================================================================
RCS file: /cvsroot/src/sys/arch/evbarm/ifpga/ifpga.c,v
retrieving revision 1.24
diff -u -p -r1.24 ifpga.c
--- sys/arch/evbarm/ifpga/ifpga.c       17 May 2011 17:34:49 -0000      1.24
+++ sys/arch/evbarm/ifpga/ifpga.c       23 Jan 2012 22:01:44 -0000
@@ -296,13 +296,13 @@ ifpga_attach(device_t parent, device_t s

#if defined(PCI_NETBSD_CONFIGURE)
       ioext = extent_create("pciio", 0x00000000,
-           0x00000000 + IFPGA_PCI_IO_VSIZE, M_DEVBUF, NULL, 0, EX_NOWAIT);
+           0x00000000 + IFPGA_PCI_IO_VSIZE, NULL, 0, EX_NOWAIT);
       memext = extent_create("pcimem", IFPGA_PCI_APP0_BASE,
           IFPGA_PCI_APP0_BASE + IFPGA_PCI_APP0_SIZE,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       pmemext = extent_create("pcipmem", IFPGA_PCI_APP1_BASE,
           IFPGA_PCI_APP1_BASE + IFPGA_PCI_APP1_SIZE,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       ifpga_pci_chipset.pc_conf_v = (void *)pci_sc;
       pci_configure_bus(&ifpga_pci_chipset, ioext, memext, pmemext, 0,
           arm_dcache_align);
Index: sys/arch/evbarm/tsarm/isa/isa_io.c
===================================================================
RCS file: /cvsroot/src/sys/arch/evbarm/tsarm/isa/isa_io.c,v
retrieving revision 1.8
diff -u -p -r1.8 isa_io.c
--- sys/arch/evbarm/tsarm/isa/isa_io.c  1 Jul 2011 19:11:34 -0000       1.8
+++ sys/arch/evbarm/tsarm/isa/isa_io.c  23 Jan 2012 22:01:45 -0000
@@ -242,10 +242,10 @@ isa_io_init(vm_offset_t isa_io_addr, vm_
       isa_io_bs_tag.bs_cookie = (void *)isa_io_addr;
       isa_mem_bs_tag.bs_cookie = (void *)isa_mem_addr;

-       isaio_ex = extent_create("isaio", 0x0, 0xffff, M_DEVBUF,
+       isaio_ex = extent_create("isaio", 0x0, 0xffff,
               (void *)isaio_ex_storage, sizeof(isaio_ex_storage),
               EX_NOWAIT|EX_NOCOALESCE);
-       isamem_ex = extent_create("isamem", 0x0, 0xfffff, M_DEVBUF,
+       isamem_ex = extent_create("isamem", 0x0, 0xfffff,
               (void *)isamem_ex_storage, sizeof(isamem_ex_storage),
               EX_NOWAIT|EX_NOCOALESCE);
       if (isaio_ex == NULL || isamem_ex == NULL)
Index: sys/arch/evbmips/gdium/mainbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/evbmips/gdium/mainbus.c,v
retrieving revision 1.3
diff -u -p -r1.3 mainbus.c
--- sys/arch/evbmips/gdium/mainbus.c    11 Aug 2009 02:32:38 -0000      1.3
+++ sys/arch/evbmips/gdium/mainbus.c    23 Jan 2012 22:01:45 -0000
@@ -103,9 +103,9 @@ mainbus_attach(device_t parent, device_t
               struct extent *ioext, *memext;

               ioext = extent_create("pciio",  0x00001000, 0x00003fff,
-                   M_DEVBUF, NULL, 0, EX_NOWAIT);
+                   NULL, 0, EX_NOWAIT);
               memext = extent_create("pcimem", 0, BONITO_PCILO_SIZE,
-                   M_DEVBUF, NULL, 0, EX_NOWAIT);
+                   NULL, 0, EX_NOWAIT);

               pci_configure_bus(&gdium_configuration.gc_pc, ioext, memext,
                   NULL, 0, mips_dcache_align);
Index: sys/arch/evbmips/rmixl/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/evbmips/rmixl/machdep.c,v
retrieving revision 1.9
diff -u -p -r1.9 machdep.c
--- sys/arch/evbmips/rmixl/machdep.c    12 Apr 2011 00:21:10 -0000      1.9
+++ sys/arch/evbmips/rmixl/machdep.c    23 Jan 2012 22:01:45 -0000
@@ -611,7 +611,7 @@ rmixl_physaddr_init(void)
       u_long size;
       uint32_t r;

-       ext = extent_create("physaddr", start, end, M_DEVBUF,
+       ext = extent_create("physaddr", start, end,
               (void *)rmixl_physaddr_storage, sizeof(rmixl_physaddr_storage),
               EX_NOWAIT | EX_NOCOALESCE);

Index: sys/arch/evbppc/mpc85xx/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/evbppc/mpc85xx/machdep.c,v
retrieving revision 1.21
diff -u -p -r1.21 machdep.c
--- sys/arch/evbppc/mpc85xx/machdep.c   2 Aug 2011 00:25:38 -0000       1.21
+++ sys/arch/evbppc/mpc85xx/machdep.c   23 Jan 2012 22:01:46 -0000
@@ -1369,12 +1369,12 @@ cpu_startup(void)
#if NPCI > 0 && defined(PCI_MEMBASE)
       pcimem_ex = extent_create("pcimem",
           PCI_MEMBASE, PCI_MEMBASE + 4*PCI_MEMSIZE,
-           M_DEVBUF, NULL, 0, EX_WAITOK);
+           NULL, 0, EX_WAITOK);
#endif
#if NPCI > 0 && defined(PCI_IOBASE)
       pciio_ex = extent_create("pciio",
           PCI_IOBASE, PCI_IOBASE + 4*PCI_IOSIZE,
-           M_DEVBUF, NULL, 0, EX_WAITOK);
+           NULL, 0, EX_WAITOK);
#endif
       mpc85xx_extirq_setup();
       /*
Index: sys/arch/ews4800mips/ews4800mips/bus_space.c
===================================================================
RCS file: /cvsroot/src/sys/arch/ews4800mips/ews4800mips/bus_space.c,v
retrieving revision 1.4
diff -u -p -r1.4 bus_space.c
--- sys/arch/ews4800mips/ews4800mips/bus_space.c        28 Apr 2008 20:23:18 -0000      1.4
+++ sys/arch/ews4800mips/ews4800mips/bus_space.c        23 Jan 2012 22:01:46 -0000
@@ -166,7 +166,7 @@ bus_space_create(bus_space_tag_t t, cons
               ebs->ebs_size = size;
       } else {
               ebs->ebs_extent = extent_create(name, addr, addr + size - 1,
-                   M_DEVBUF, 0, 0, EX_NOWAIT);
+                   0, 0, EX_NOWAIT);
               if (ebs->ebs_extent == NULL) {
                       panic("%s:: unable to create bus_space for "
                           "0x%08lx-%#lx", __func__, addr, size);
Index: sys/arch/hp300/hp300/autoconf.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hp300/hp300/autoconf.c,v
retrieving revision 1.98
diff -u -p -r1.98 autoconf.c
--- sys/arch/hp300/hp300/autoconf.c     10 May 2011 14:38:08 -0000      1.98
+++ sys/arch/hp300/hp300/autoconf.c     23 Jan 2012 22:01:46 -0000
@@ -900,7 +900,7 @@ iomap_init(void)

       /* extiobase is initialized by pmap_bootstrap(). */
       extio_ex = extent_create("extio", (u_long) extiobase,
-           (u_long) extiobase + (ptoa(EIOMAPSIZE) - 1), M_DEVBUF,
+           (u_long) extiobase + (ptoa(EIOMAPSIZE) - 1),
           (void *) extio_ex_storage, sizeof(extio_ex_storage),
           EX_NOCOALESCE|EX_NOWAIT);
}
Index: sys/arch/hp700/dev/astro.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hp700/dev/astro.c,v
retrieving revision 1.13
diff -u -p -r1.13 astro.c
--- sys/arch/hp700/dev/astro.c  13 Jan 2011 21:15:13 -0000      1.13
+++ sys/arch/hp700/dev/astro.c  23 Jan 2012 22:01:46 -0000
@@ -328,7 +328,7 @@ astro_attach(device_t parent, device_t s
       snprintf(sc->sc_dvmamapname, sizeof(sc->sc_dvmamapname),
           "%s_dvma", device_xname(sc->sc_dv));
       sc->sc_dvmamap = extent_create(sc->sc_dvmamapname, 0, (1 << iova_bits),
-           M_DEVBUF, 0, 0, EX_NOWAIT);
+           0, 0, EX_NOWAIT);

       sc->sc_dmatag = astro_dmat;
       sc->sc_dmatag._cookie = sc;
Index: sys/arch/hp700/dev/dino.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hp700/dev/dino.c,v
retrieving revision 1.32
diff -u -p -r1.32 dino.c
--- sys/arch/hp700/dev/dino.c   17 May 2011 17:34:49 -0000      1.32
+++ sys/arch/hp700/dev/dino.c   23 Jan 2012 22:01:47 -0000
@@ -1643,7 +1643,7 @@ dinoattach(device_t parent, device_t sel
       snprintf(sc->sc_ioexname, sizeof(sc->sc_ioexname),
           "%s_io", device_xname(self));
       if ((sc->sc_ioex = extent_create(sc->sc_ioexname, 0, 0xffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT | EX_MALLOCOK)) == NULL) {
+           NULL, 0, EX_NOWAIT | EX_MALLOCOK)) == NULL) {
               aprint_error(": can't allocate I/O extent map\n");
               bus_space_unmap(sc->sc_bt, sc->sc_bh, PAGE_SIZE);
               return;
Index: sys/arch/hp700/dev/elroy.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hp700/dev/elroy.c,v
retrieving revision 1.11
diff -u -p -r1.11 elroy.c
--- sys/arch/hp700/dev/elroy.c  17 May 2011 17:34:49 -0000      1.11
+++ sys/arch/hp700/dev/elroy.c  23 Jan 2012 22:01:47 -0000
@@ -454,7 +454,7 @@ elroy_alloc_parent(device_t self, struct
                       snprintf(sc->sc_memexname, sizeof(sc->sc_memexname),
                           "%s_mem", sc->sc_dv.dv_xname);
                       if ((sc->sc_memex = extent_create(sc->sc_memexname,
-                           mem_start, mem_start + ELROY_MEM_WINDOW, M_DEVBUF,
+                           mem_start, mem_start + ELROY_MEM_WINDOW,
                           NULL, 0, EX_NOWAIT | EX_MALLOCOK)) == NULL) {
                               extent_destroy(sc->sc_ioex);
                               bus_space_free(sc->sc_bt, memh,
Index: sys/arch/hp700/hp700/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hp700/hp700/machdep.c,v
retrieving revision 1.104
diff -u -p -r1.104 machdep.c
--- sys/arch/hp700/hp700/machdep.c      9 Jan 2012 19:40:54 -0000       1.104
+++ sys/arch/hp700/hp700/machdep.c      23 Jan 2012 22:01:48 -0000
@@ -515,7 +515,7 @@ hppa_init(paddr_t start, void *bi)

       /* we hope this won't fail */
       hp700_io_extent = extent_create("io",
-           HPPA_IOSPACE, 0xffffffff, M_DEVBUF,
+           HPPA_IOSPACE, 0xffffffff,
           (void *)hp700_io_extent_store, sizeof(hp700_io_extent_store),
           EX_NOCOALESCE|EX_NOWAIT);

Index: sys/arch/hpcmips/hpcmips/bus_space.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hpcmips/hpcmips/bus_space.c,v
retrieving revision 1.30
diff -u -p -r1.30 bus_space.c
--- sys/arch/hpcmips/hpcmips/bus_space.c        26 Feb 2011 12:07:45 -0000      1.30
+++ sys/arch/hpcmips/hpcmips/bus_space.c        23 Jan 2012 22:01:48 -0000
@@ -216,7 +216,7 @@ hpcmips_init_bus_space(struct bus_space_
       }

       t->extent = (void*)extent_create(t->name, t->base,
-           t->base + t->size, M_DEVBUF,
+           t->base + t->size,
           0, 0, EX_NOWAIT);
       if (!t->extent) {
               panic("hpcmips_init_bus_space_extent:"
Index: sys/arch/hpcmips/tx/tx3912video.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hpcmips/tx/tx3912video.c,v
retrieving revision 1.40
diff -u -p -r1.40 tx3912video.c
--- sys/arch/hpcmips/tx/tx3912video.c   14 Mar 2009 15:36:07 -0000      1.40
+++ sys/arch/hpcmips/tx/tx3912video.c   23 Jan 2012 22:01:48 -0000
@@ -366,7 +366,7 @@ tx3912video_framebuffer_alloc(struct vid

       /* extent V-RAM region */
       ex = extent_create("Frame buffer address", fb_start, *fb_end,
-           0, (void *)ex_fixed, sizeof ex_fixed,
+           (void *)ex_fixed, sizeof ex_fixed,
           EX_NOWAIT);
       if (ex == 0)
               return (1);
Index: sys/arch/hpcsh/hpcsh/bus_space.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hpcsh/hpcsh/bus_space.c,v
retrieving revision 1.18
diff -u -p -r1.18 bus_space.c
--- sys/arch/hpcsh/hpcsh/bus_space.c    20 Jul 2011 20:46:49 -0000      1.18
+++ sys/arch/hpcsh/hpcsh/bus_space.c    23 Jan 2012 22:01:48 -0000
@@ -156,7 +156,7 @@ bus_space_create(struct hpcsh_bus_space
               hbs->hbs_base_addr = addr; /* no extent */
       } else {
               hbs->hbs_extent = extent_create(name, addr, addr + size - 1,
-                                               M_DEVBUF, 0, 0, EX_NOWAIT);
+                                               0, 0, EX_NOWAIT);
               if (hbs->hbs_extent == NULL) {
                       panic("%s:: unable to create bus_space for "
                             "0x%08lx-%#lx", __func__, addr, size);
Index: sys/arch/hppa/hppa/hppa_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/hppa/hppa/hppa_machdep.c,v
retrieving revision 1.26
diff -u -p -r1.26 hppa_machdep.c
--- sys/arch/hppa/hppa/hppa_machdep.c   8 Dec 2011 21:00:49 -0000       1.26
+++ sys/arch/hppa/hppa/hppa_machdep.c   23 Jan 2012 22:01:49 -0000
@@ -365,16 +365,12 @@ hppa_ras(struct lwp *l)
void
cpu_need_resched(struct cpu_info *ci, int flags)
{
-       bool immed = (flags & RESCHED_IMMED) != 0;
-
-       if (ci->ci_want_resched && !immed)
-               return;
       ci->ci_want_resched = 1;
       setsoftast(ci->ci_data.cpu_onproc);

#ifdef MULTIPROCESSOR
       if (ci->ci_curlwp != ci->ci_data.cpu_idlelwp) {
-               if (immed && ci != curcpu()) {
+               if (ci != curcpu()) {
                       /* XXX send IPI */
               }
       }
Index: sys/arch/ibmnws/ibmnws/mainbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/ibmnws/ibmnws/mainbus.c,v
retrieving revision 1.10
diff -u -p -r1.10 mainbus.c
--- sys/arch/ibmnws/ibmnws/mainbus.c    1 Jul 2011 20:47:43 -0000       1.10
+++ sys/arch/ibmnws/ibmnws/mainbus.c    23 Jan 2012 22:01:50 -0000
@@ -124,9 +124,9 @@ mainbus_attach(device_t parent, device_t
       ibmnws_pci_get_chipset_tag_indirect (genppc_pct);

#ifdef PCI_NETBSD_CONFIGURE
-       ioext  = extent_create("pciio",  0x00008000, 0x0000ffff, M_DEVBUF,
+       ioext  = extent_create("pciio",  0x00008000, 0x0000ffff,
           NULL, 0, EX_NOWAIT);
-       memext = extent_create("pcimem", 0x00000000, 0x0fffffff, M_DEVBUF,
+       memext = extent_create("pcimem", 0x00000000, 0x0fffffff,
           NULL, 0, EX_NOWAIT);

       pci_configure_bus(genppc_pct, ioext, memext, NULL, 0, CACHELINESIZE);
Index: sys/arch/m68k/m68k/pmap_motorola.c
===================================================================
RCS file: /cvsroot/src/sys/arch/m68k/m68k/pmap_motorola.c,v
retrieving revision 1.64
diff -u -p -r1.64 pmap_motorola.c
--- sys/arch/m68k/m68k/pmap_motorola.c  3 Nov 2011 14:39:05 -0000       1.64
+++ sys/arch/m68k/m68k/pmap_motorola.c  23 Jan 2012 22:01:51 -0000
@@ -243,7 +243,7 @@ vsize_t             Sysptsize = VM_KERNEL_PT_PAGES;
static struct pmap kernel_pmap_store;
struct pmap    *const kernel_pmap_ptr = &kernel_pmap_store;
struct vm_map  *st_map, *pt_map;
-struct vm_map_kernel st_map_store, pt_map_store;
+struct vm_map st_map_store, pt_map_store;

vaddr_t                lwp0uarea;      /* lwp0 u-area VA, initialized in bootstrap */

Index: sys/arch/mac68k/mac68k/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mac68k/mac68k/machdep.c,v
retrieving revision 1.342
diff -u -p -r1.342 machdep.c
--- sys/arch/mac68k/mac68k/machdep.c    12 Dec 2011 19:03:10 -0000      1.342
+++ sys/arch/mac68k/mac68k/machdep.c    23 Jan 2012 22:01:51 -0000
@@ -278,7 +278,7 @@ mac68k_init(void)
        * on the machine.  When the amount of RAM is found, all
        * extents of RAM are allocated from the map.
        */
-       iomem_ex = extent_create("iomem", 0x0, 0xffffffff, M_DEVBUF,
+       iomem_ex = extent_create("iomem", 0x0, 0xffffffff,
           (void *)iomem_ex_storage, sizeof(iomem_ex_storage),
           EX_NOCOALESCE|EX_NOWAIT);

Index: sys/arch/mips/alchemy/au_himem_space.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/alchemy/au_himem_space.c,v
retrieving revision 1.13
diff -u -p -r1.13 au_himem_space.c
--- sys/arch/mips/alchemy/au_himem_space.c      10 Jul 2011 23:13:23 -0000      1.13
+++ sys/arch/mips/alchemy/au_himem_space.c      23 Jan 2012 22:01:52 -0000
@@ -701,7 +701,7 @@ au_himem_space_init(bus_space_tag_t bst,
       c->c_physoff = physoff;

       /* allocate extent manager */
-       c->c_extent = extent_create(name, start, end, M_DEVBUF,
+       c->c_extent = extent_create(name, start, end,
           NULL, 0, EX_NOWAIT);
       if (c->c_extent == NULL)
               panic("au_himem_space_init: %s: cannot create extent", name);
Index: sys/arch/mips/alchemy/au_wired_space.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/alchemy/au_wired_space.c,v
retrieving revision 1.8
diff -u -p -r1.8 au_wired_space.c
--- sys/arch/mips/alchemy/au_wired_space.c      10 Jul 2011 23:13:23 -0000      1.8
+++ sys/arch/mips/alchemy/au_wired_space.c      23 Jan 2012 22:01:52 -0000
@@ -641,7 +641,7 @@ au_wired_space_init(bus_space_tag_t bst,
       c->c_size = size;

       /* allocate extent manager */
-       c->c_extent = extent_create(name, start, start + size, M_DEVBUF,
+       c->c_extent = extent_create(name, start, start + size,
           (void *)c->c_exstore, sizeof (c->c_exstore), EX_NOWAIT);
       if (c->c_extent == NULL)
               panic("au_wired_space_init: %s: cannot create extent", name);
Index: sys/arch/mips/alchemy/dev/aupci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/alchemy/dev/aupci.c,v
retrieving revision 1.12
diff -u -p -r1.12 aupci.c
--- sys/arch/mips/alchemy/dev/aupci.c   3 Jan 2012 07:36:02 -0000       1.12
+++ sys/arch/mips/alchemy/dev/aupci.c   23 Jan 2012 22:01:52 -0000
@@ -259,10 +259,10 @@ aupciattach(device_t parent, device_t se

#ifdef PCI_NETBSD_CONFIGURE
       mem_ex = extent_create("pcimem", mstart, 0xffffffff,
-           M_DEVBUF, NULL, 0, EX_WAITOK);
+           NULL, 0, EX_WAITOK);

       io_ex = extent_create("pciio", AUPCI_IO_START, AUPCI_IO_END,
-           M_DEVBUF, NULL, 0, EX_WAITOK);
+           NULL, 0, EX_WAITOK);

       pci_configure_bus(&sc->sc_pc,
           io_ex, mem_ex, NULL, 0, mips_cache_info.mci_dcache_align);
Index: sys/arch/mips/mips/bus_space_alignstride_chipdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/mips/bus_space_alignstride_chipdep.c,v
retrieving revision 1.18
diff -u -p -r1.18 bus_space_alignstride_chipdep.c
--- sys/arch/mips/mips/bus_space_alignstride_chipdep.c  23 Sep 2011 12:42:15 -0000      1.18
+++ sys/arch/mips/mips/bus_space_alignstride_chipdep.c  23 Jan 2012 22:01:52 -0000
@@ -1256,7 +1256,7 @@ __BS(init)(bus_space_tag_t t, void *v)

#ifdef CHIP_EXTENT
       /* XXX WE WANT EXTENT_NOCOALESCE, BUT WE CAN'T USE IT. XXX */
-       ex = extent_create(__S(__BS(bus)), 0x0UL, ~0UL, M_DEVBUF,
+       ex = extent_create(__S(__BS(bus)), 0x0UL, ~0UL,
           (void *)CHIP_EX_STORE(v), CHIP_EX_STORE_SIZE(v), EX_NOWAIT);
       extent_alloc_region(ex, 0, ~0UL, EX_NOWAIT);

Index: sys/arch/mips/mips/pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/mips/pmap.c,v
retrieving revision 1.205
diff -u -p -r1.205 pmap.c
--- sys/arch/mips/mips/pmap.c   23 Sep 2011 23:02:23 -0000      1.205
+++ sys/arch/mips/mips/pmap.c   23 Jan 2012 22:01:53 -0000
@@ -496,11 +496,6 @@ pmap_bootstrap(void)
       pmap_tlb_info_init(&pmap_tlb0_info);            /* init the lock */

       /*
-        * Compute the number of pages kmem_map will have.
-        */
-       kmeminit_nkmempages();
-
-       /*
        * Figure out how many PTE's are necessary to map the kernel.
        * We also reserve space for kmem_alloc_pageable() for vm_fork().
        */
@@ -512,7 +507,7 @@ pmap_bootstrap(void)

       Sysmapsize = (VM_PHYS_SIZE + (ubc_nwins << ubc_winshift) +
           bufsz + 16 * NCARGS + pager_map_size + iospace_size) / NBPG +
-           (maxproc * UPAGES) + nkmempages;
+           (maxproc * UPAGES) + 1024 * 1024;
#ifdef DEBUG
       {
               extern int kmem_guard_depth;
Index: sys/arch/mips/rmi/rmixl_pcie.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mips/rmi/rmixl_pcie.c,v
retrieving revision 1.8
diff -u -p -r1.8 rmixl_pcie.c
--- sys/arch/mips/rmi/rmixl_pcie.c      10 Jul 2011 23:13:22 -0000      1.8
+++ sys/arch/mips/rmi/rmixl_pcie.c      23 Jan 2012 22:01:54 -0000
@@ -703,12 +703,12 @@ rmixl_pcie_init(struct rmixl_pcie_softc
       ioext  = extent_create("pciio",
               rcp->rc_pci_io_pbase,
               rcp->rc_pci_io_pbase + rcp->rc_pci_io_size - 1,
-               M_DEVBUF, NULL, 0, EX_NOWAIT);
+               NULL, 0, EX_NOWAIT);

       memext = extent_create("pcimem",
               rcp->rc_pci_mem_pbase,
               rcp->rc_pci_mem_pbase + rcp->rc_pci_mem_size - 1,
-               M_DEVBUF, NULL, 0, EX_NOWAIT);
+               NULL, 0, EX_NOWAIT);

       pci_configure_bus(pc, ioext, memext, NULL, 0,
           mips_cache_info.mci_dcache_align);
Index: sys/arch/mipsco/mipsco/bus_space.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mipsco/mipsco/bus_space.c,v
retrieving revision 1.11
diff -u -p -r1.11 bus_space.c
--- sys/arch/mipsco/mipsco/bus_space.c  18 Mar 2009 10:22:32 -0000      1.11
+++ sys/arch/mipsco/mipsco/bus_space.c  23 Jan 2012 22:01:54 -0000
@@ -69,7 +69,7 @@ void
mipsco_bus_space_init_extent(bus_space_tag_t bst, void *storage, size_t storagesize)
{
       bst->bs_extent = extent_create(bst->bs_name,
-           bst->bs_start, bst->bs_start + bst->bs_size, M_DEVBUF,
+           bst->bs_start, bst->bs_start + bst->bs_size,
           storage, storagesize, EX_NOWAIT);
       if (bst->bs_extent == NULL)
           panic("mipsco_bus_space_init_extent: cannot create extent map %s",
Index: sys/arch/mvmeppc/mvmeppc/mainbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/mvmeppc/mvmeppc/mainbus.c,v
retrieving revision 1.14
diff -u -p -r1.14 mainbus.c
--- sys/arch/mvmeppc/mvmeppc/mainbus.c  1 Jul 2011 20:49:38 -0000       1.14
+++ sys/arch/mvmeppc/mvmeppc/mainbus.c  23 Jan 2012 22:01:54 -0000
@@ -118,9 +118,9 @@ mainbus_attach(device_t parent, device_t
       SIMPLEQ_INSERT_TAIL(&genppc_pct->pc_pbi, pbi, next);

#ifdef PCI_NETBSD_CONFIGURE
-       ioext  = extent_create("pciio",  0x00008000, 0x0000ffff, M_DEVBUF,
+       ioext  = extent_create("pciio",  0x00008000, 0x0000ffff,
           NULL, 0, EX_NOWAIT);
-       memext = extent_create("pcimem", 0x00000000, 0x0fffffff, M_DEVBUF,
+       memext = extent_create("pcimem", 0x00000000, 0x0fffffff,
           NULL, 0, EX_NOWAIT);

       pci_configure_bus(0, ioext, memext, NULL, 0, 32);
Index: sys/arch/ofppc/pci/ofwpci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/ofppc/pci/ofwpci.c,v
retrieving revision 1.10
diff -u -p -r1.10 ofwpci.c
--- sys/arch/ofppc/pci/ofwpci.c 18 Jun 2011 08:08:29 -0000      1.10
+++ sys/arch/ofppc/pci/ofwpci.c 23 Jan 2012 22:01:54 -0000
@@ -202,9 +202,9 @@ ofwpci_attach(device_t parent, device_t
       ioext  = extent_create("pciio",
           modeldata.pciiodata[device_unit(self)].start,
           modeldata.pciiodata[device_unit(self)].limit,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       memext = extent_create("pcimem", sc->sc_memt.pbs_base,
-           sc->sc_memt.pbs_limit-1, M_DEVBUF, NULL, 0, EX_NOWAIT);
+           sc->sc_memt.pbs_limit-1, NULL, 0, EX_NOWAIT);

       if (pci_configure_bus(pc, ioext, memext, NULL, 0, CACHELINESIZE))
               aprint_error("pci_configure_bus() failed\n");
Index: sys/arch/powerpc/booke/booke_pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/booke/booke_pmap.c,v
retrieving revision 1.10
diff -u -p -r1.10 booke_pmap.c
--- sys/arch/powerpc/booke/booke_pmap.c 27 Sep 2011 01:02:35 -0000      1.10
+++ sys/arch/powerpc/booke/booke_pmap.c 23 Jan 2012 22:01:55 -0000
@@ -146,11 +146,6 @@ pmap_bootstrap(vaddr_t startkernel, vadd
       pmap_tlb_info_init(&pmap_tlb0_info);            /* init the lock */

       /*
-        * Compute the number of pages kmem_map will have.
-        */
-       kmeminit_nkmempages();
-
-       /*
        * Figure out how many PTE's are necessary to map the kernel.
        * We also reserve space for kmem_alloc_pageable() for vm_fork().
        */
@@ -169,7 +164,7 @@ pmap_bootstrap(vaddr_t startkernel, vadd
#ifdef SYSVSHM
           + NBPG * shminfo.shmall
#endif
-           + NBPG * nkmempages);
+           + NBPG * 32 * 1024);

       /*
        * Initialize `FYI' variables.  Note we're relying on
Index: sys/arch/powerpc/booke/pci/pq3pci.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/booke/pci/pq3pci.c,v
retrieving revision 1.11
diff -u -p -r1.11 pq3pci.c
--- sys/arch/powerpc/booke/pci/pq3pci.c 27 Sep 2011 01:02:35 -0000      1.11
+++ sys/arch/powerpc/booke/pci/pq3pci.c 23 Jan 2012 22:01:55 -0000
@@ -858,9 +858,9 @@ pq3pci_cpunode_attach(device_t parent, d
               }

               struct extent *ioext = extent_create("pciio", 0, PCI_IOSIZE,
-                    M_DEVBUF, NULL, 0, EX_NOWAIT);
+                    NULL, 0, EX_NOWAIT);
               struct extent *memext = extent_create("pcimem", membase,
-                    membase + PCI_MEMSIZE, M_DEVBUF, NULL, 0, EX_NOWAIT);
+                    membase + PCI_MEMSIZE, NULL, 0, EX_NOWAIT);

               error = pci_configure_bus(pc, ioext, memext, NULL, 0,
                   curcpu()->ci_ci.dcache_line_size);
Index: sys/arch/powerpc/ibm4xx/pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/ibm4xx/pmap.c,v
retrieving revision 1.71
diff -u -p -r1.71 pmap.c
--- sys/arch/powerpc/ibm4xx/pmap.c      9 Jan 2012 06:49:25 -0000       1.71
+++ sys/arch/powerpc/ibm4xx/pmap.c      23 Jan 2012 22:01:55 -0000
@@ -72,7 +72,7 @@ __KERNEL_RCSID(0, "$NetBSD: pmap.c,v 1.7
#include <sys/param.h>
#include <sys/cpu.h>
#include <sys/device.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/pool.h>
#include <sys/proc.h>
#include <sys/queue.h>
@@ -612,7 +612,7 @@ pmap_create(void)
{
       struct pmap *pm;

-       pm = malloc(sizeof *pm, M_VMPMAP, M_WAITOK);
+       pm = kmem_alloc(sizeof(*pm), KM_SLEEP);
       memset(pm, 0, sizeof *pm);
       pm->pm_refs = 1;
       return pm;
@@ -650,7 +650,7 @@ pmap_destroy(struct pmap *pm)
               }
       if (pm->pm_ctx)
               ctx_free(pm);
-       free(pm, M_VMPMAP);
+       kmem_free(pm, sizeof(*pm));
}

/*
Index: sys/arch/powerpc/ibm4xx/pci/pchb.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/ibm4xx/pci/pchb.c,v
retrieving revision 1.10
diff -u -p -r1.10 pchb.c
--- sys/arch/powerpc/ibm4xx/pci/pchb.c  22 Jun 2011 18:06:34 -0000      1.10
+++ sys/arch/powerpc/ibm4xx/pci/pchb.c  23 Jan 2012 22:01:55 -0000
@@ -161,11 +161,11 @@ pchbattach(device_t parent, device_t sel
#ifdef PCI_NETBSD_CONFIGURE
       struct extent *memext = extent_create("pcimem",
           IBM405GP_PCI_MEM_START,
-           IBM405GP_PCI_MEM_START + 0x1fffffff, M_DEVBUF, NULL, 0,
+           IBM405GP_PCI_MEM_START + 0x1fffffff, NULL, 0,
           EX_NOWAIT);
       struct extent *ioext = extent_create("pciio",
           IBM405GP_PCI_PCI_IO_START,
-           IBM405GP_PCI_PCI_IO_START + 0xffff, M_DEVBUF, NULL, 0, EX_NOWAIT);
+           IBM405GP_PCI_PCI_IO_START + 0xffff, NULL, 0, EX_NOWAIT);
       pci_configure_bus(pc, ioext, memext, NULL, 0, 32);
       extent_destroy(ioext);
       extent_destroy(memext);
Index: sys/arch/powerpc/powerpc/bus_space.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/powerpc/bus_space.c,v
retrieving revision 1.29
diff -u -p -r1.29 bus_space.c
--- sys/arch/powerpc/powerpc/bus_space.c        17 Dec 2011 19:34:07 -0000      1.29
+++ sys/arch/powerpc/powerpc/bus_space.c        23 Jan 2012 22:01:56 -0000
@@ -401,7 +401,7 @@ bus_space_init(struct powerpc_bus_space
{
       if (t->pbs_extent == NULL && extent_name != NULL) {
               t->pbs_extent = extent_create(extent_name, t->pbs_base,
-                   t->pbs_limit-1, M_DEVBUF, storage, storage_size,
+                   t->pbs_limit-1, storage, storage_size,
                   EX_NOCOALESCE|EX_NOWAIT);
               if (t->pbs_extent == NULL)
                       return ENOMEM;
Index: sys/arch/powerpc/powerpc/powerpc_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/powerpc/powerpc/powerpc_machdep.c,v
retrieving revision 1.61
diff -u -p -r1.61 powerpc_machdep.c
--- sys/arch/powerpc/powerpc/powerpc_machdep.c  12 Dec 2011 19:03:11 -0000      1.61
+++ sys/arch/powerpc/powerpc/powerpc_machdep.c  23 Jan 2012 22:01:56 -0000
@@ -434,7 +434,7 @@ cpu_need_resched(struct cpu_info *ci, in
#endif
       l->l_md.md_astpending = 1;              /* force call to ast() */
#if defined(MULTIPROCESSOR)
-       if (ci != cur_ci && (flags & RESCHED_IMMED)) {
+       if (ci != cur_ci) {
               cpu_send_ipi(cpu_index(ci), IPI_NOMESG);
       }
#endif
Index: sys/arch/prep/prep/mainbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/prep/prep/mainbus.c,v
retrieving revision 1.32
diff -u -p -r1.32 mainbus.c
--- sys/arch/prep/prep/mainbus.c        1 Jul 2011 20:52:02 -0000       1.32
+++ sys/arch/prep/prep/mainbus.c        23 Jan 2012 22:01:56 -0000
@@ -144,9 +144,9 @@ mainbus_attach(device_t parent, device_t
       setup_pciintr_map(pbi, 0, 0, 0);

#ifdef PCI_NETBSD_CONFIGURE
-       ioext  = extent_create("pciio",  0x00008000, 0x0000ffff, M_DEVBUF,
+       ioext  = extent_create("pciio",  0x00008000, 0x0000ffff,
           NULL, 0, EX_NOWAIT);
-       memext = extent_create("pcimem", 0x00000000, 0x0fffffff, M_DEVBUF,
+       memext = extent_create("pcimem", 0x00000000, 0x0fffffff,
           NULL, 0, EX_NOWAIT);

       pci_configure_bus(genppc_pct, ioext, memext, NULL, 0, CACHELINESIZE);
Index: sys/arch/sandpoint/sandpoint/mainbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sandpoint/sandpoint/mainbus.c,v
retrieving revision 1.27
diff -u -p -r1.27 mainbus.c
--- sys/arch/sandpoint/sandpoint/mainbus.c      14 Jan 2012 19:39:25 -0000      1.27
+++ sys/arch/sandpoint/sandpoint/mainbus.c      23 Jan 2012 22:01:56 -0000
@@ -112,9 +112,9 @@ mainbus_attach(device_t parent, device_t
        */
#if NPCI > 0
#if defined(PCI_NETBSD_CONFIGURE)
-       ioext  = extent_create("pciio",  0x00001000, 0x0000ffff, M_DEVBUF,
+       ioext  = extent_create("pciio",  0x00001000, 0x0000ffff,
           NULL, 0, EX_NOWAIT);
-       memext = extent_create("pcimem", 0x80000000, 0x8fffffff, M_DEVBUF,
+       memext = extent_create("pcimem", 0x80000000, 0x8fffffff,
           NULL, 0, EX_NOWAIT);

       pci_configure_bus(0, ioext, memext, NULL, 0, 32);
Index: sys/arch/sgimips/gio/pci_gio.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sgimips/gio/pci_gio.c,v
retrieving revision 1.9
diff -u -p -r1.9 pci_gio.c
--- sys/arch/sgimips/gio/pci_gio.c      1 Jul 2011 18:53:46 -0000       1.9
+++ sys/arch/sgimips/gio/pci_gio.c      23 Jan 2012 22:01:56 -0000
@@ -214,7 +214,7 @@ giopci_attach(struct device *parent, str

#ifdef PCI_NETBSD_CONFIGURE
       pc->pc_memext = extent_create("giopcimem", m_start, m_end,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       pci_configure_bus(pc, NULL, pc->pc_memext, NULL, 0,
           mips_cache_info.mci_dcache_align);
#endif
Index: sys/arch/sgimips/mace/pci_mace.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sgimips/mace/pci_mace.c,v
retrieving revision 1.13
diff -u -p -r1.13 pci_mace.c
--- sys/arch/sgimips/mace/pci_mace.c    1 Jul 2011 18:53:47 -0000       1.13
+++ sys/arch/sgimips/mace/pci_mace.c    23 Jan 2012 22:01:57 -0000
@@ -146,9 +146,9 @@ macepci_attach(struct device *parent, st

#if NPCI > 0
       pc->pc_ioext = extent_create("macepciio", 0x00001000, 0x01ffffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       pc->pc_memext = extent_create("macepcimem", 0x80100000, 0x81ffffff,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       pci_configure_bus(pc, pc->pc_ioext, pc->pc_memext, NULL, 0,
           mips_cache_info.mci_dcache_align);
       memset(&pba, 0, sizeof pba);
Index: sys/arch/sh3/dev/shpcic.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sh3/dev/shpcic.c,v
retrieving revision 1.16
diff -u -p -r1.16 shpcic.c
--- sys/arch/sh3/dev/shpcic.c   21 Jan 2012 19:44:30 -0000      1.16
+++ sys/arch/sh3/dev/shpcic.c   23 Jan 2012 22:01:57 -0000
@@ -228,10 +228,10 @@ shpcic_attach(device_t parent, device_t
#ifdef PCI_NETBSD_CONFIGURE
       ioext  = extent_create("pciio",
           SH4_PCIC_IO, SH4_PCIC_IO + SH4_PCIC_IO_SIZE - 1,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       memext = extent_create("pcimem",
           SH4_PCIC_MEM, SH4_PCIC_MEM + SH4_PCIC_MEM_SIZE - 1,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

       pci_configure_bus(NULL, ioext, memext, NULL, 0, sh_cache_line_size);

Index: sys/arch/sparc/dev/vme_machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc/dev/vme_machdep.c,v
retrieving revision 1.65
diff -u -p -r1.65 vme_machdep.c
--- sys/arch/sparc/dev/vme_machdep.c    18 Jul 2011 00:31:13 -0000      1.65
+++ sys/arch/sparc/dev/vme_machdep.c    23 Jan 2012 22:01:57 -0000
@@ -315,7 +315,7 @@ vmeattach_mainbus(device_t parent, devic
               sizeof(vmebus_translations)/sizeof(vmebus_translations[0]);

       vme_dvmamap = extent_create("vmedvma", VME4_DVMA_BASE, VME4_DVMA_END,
-                                   M_DEVBUF, 0, 0, EX_NOWAIT);
+                                   0, 0, EX_NOWAIT);
       if (vme_dvmamap == NULL)
               panic("vme: unable to allocate DVMA map");

Index: sys/arch/sparc/sparc/iommu.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc/sparc/iommu.c,v
retrieving revision 1.94
diff -u -p -r1.94 iommu.c
--- sys/arch/sparc/sparc/iommu.c        17 Jul 2011 23:18:23 -0000      1.94
+++ sys/arch/sparc/sparc/iommu.c        23 Jan 2012 22:01:58 -0000
@@ -276,7 +276,7 @@ iommu_attach(device_t parent, device_t s

       sc->sc_dvmamap = extent_create("iommudvma",
                                       IOMMU_DVMA_BASE, IOMMU_DVMA_END,
-                                       M_DEVBUF, 0, 0, EX_NOWAIT);
+                                       0, 0, EX_NOWAIT);
       if (sc->sc_dvmamap == NULL)
               panic("iommu: unable to allocate DVMA map");

Index: sys/arch/sparc/sparc/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc/sparc/machdep.c,v
retrieving revision 1.314
diff -u -p -r1.314 machdep.c
--- sys/arch/sparc/sparc/machdep.c      12 Dec 2011 19:03:11 -0000      1.314
+++ sys/arch/sparc/sparc/machdep.c      23 Jan 2012 22:02:00 -0000
@@ -323,7 +323,7 @@ cpu_startup(void)
                */
               dvmamap24 = extent_create("dvmamap24",
                                         D24_DVMA_BASE, D24_DVMA_END,
-                                         M_DEVBUF, 0, 0, EX_NOWAIT);
+                                         0, 0, EX_NOWAIT);
               if (dvmamap24 == NULL)
                       panic("unable to allocate DVMA map");
       }
Index: sys/arch/sparc64/dev/iommu.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/dev/iommu.c,v
retrieving revision 1.105
diff -u -p -r1.105 iommu.c
--- sys/arch/sparc64/dev/iommu.c        8 Oct 2011 08:49:07 -0000       1.105
+++ sys/arch/sparc64/dev/iommu.c        23 Jan 2012 22:02:01 -0000
@@ -200,7 +200,7 @@ iommu_init(char *name, struct iommu_stat
               (unsigned long long)(is->is_ptsb + size - 1));
       is->is_dvmamap = extent_create(name,
           is->is_dvmabase, is->is_dvmaend,
-           M_DEVBUF, 0, 0, EX_NOWAIT);
+           0, 0, EX_NOWAIT);
       /* XXXMRG Check is_dvmamap is valid. */

       /*
Index: sys/arch/sparc64/dev/psycho.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/dev/psycho.c,v
retrieving revision 1.111
diff -u -p -r1.111 psycho.c
--- sys/arch/sparc64/dev/psycho.c       4 Sep 2011 12:17:14 -0000       1.111
+++ sys/arch/sparc64/dev/psycho.c       23 Jan 2012 22:02:02 -0000
@@ -796,8 +796,7 @@ psycho_alloc_extent(struct psycho_pbm *p
       }

       /* create extent */
-       ex = extent_create(name, baddr, bsize - baddr - 1, M_DEVBUF, 0, 0,
-                          EX_NOWAIT);
+       ex = extent_create(name, baddr, bsize - baddr - 1, 0, 0, EX_NOWAIT);
       if (ex == NULL) {
               printf("psycho_alloc_extent: extent_create failed\n");
               goto ret;
Index: sys/arch/sparc64/sparc64/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sparc64/sparc64/machdep.c,v
retrieving revision 1.263
diff -u -p -r1.263 machdep.c
--- sys/arch/sparc64/sparc64/machdep.c  12 Dec 2011 19:03:11 -0000      1.263
+++ sys/arch/sparc64/sparc64/machdep.c  23 Jan 2012 22:02:02 -0000
@@ -2304,7 +2304,7 @@ sparc_bus_map(bus_space_tag_t t, bus_add
                */
               io_space = extent_create("IOSPACE",
                                        (u_long)IODEV_BASE, (u_long)IODEV_END,
-                                        M_DEVBUF, 0, 0, EX_NOWAIT);
+                                        0, 0, EX_NOWAIT);


       size = round_page(size);
Index: sys/arch/sun2/sun2/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sun2/sun2/machdep.c,v
retrieving revision 1.71
diff -u -p -r1.71 machdep.c
--- sys/arch/sun2/sun2/machdep.c        12 Dec 2011 19:03:11 -0000      1.71
+++ sys/arch/sun2/sun2/machdep.c        23 Jan 2012 22:02:03 -0000
@@ -358,7 +358,7 @@ cpu_startup(void)
        */
       dvmamap = extent_create("dvmamap",
           DVMA_MAP_BASE, DVMA_MAP_BASE + DVMA_MAP_AVAIL,
-           M_DEVBUF, 0, 0, EX_NOWAIT);
+           0, 0, EX_NOWAIT);
       if (dvmamap == NULL)
               panic("unable to allocate DVMA map");

Index: sys/arch/sun3/sun3/dvma.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sun3/sun3/dvma.c,v
retrieving revision 1.36
diff -u -p -r1.36 dvma.c
--- sys/arch/sun3/sun3/dvma.c   11 Dec 2009 13:52:57 -0000      1.36
+++ sys/arch/sun3/sun3/dvma.c   23 Jan 2012 22:02:03 -0000
@@ -43,7 +43,7 @@ __KERNEL_RCSID(0, "$NetBSD: dvma.c,v 1.3
#include <sys/core.h>
#include <sys/exec.h>

-#include <uvm/uvm.h> /* XXX: not _extern ... need uvm_map_create */
+#include <uvm/uvm.h> /* XXX: not _extern ... need uvm_map_setup */

#define _SUN68K_BUS_DMA_PRIVATE
#include <machine/autoconf.h>
@@ -82,11 +82,13 @@ dvma_init(void)
        * dvma_extent manages things handled in interrupt
        * context.
        */
-       phys_map = uvm_map_create(pmap_kernel(),
-           DVMA_MAP_BASE, DVMA_MAP_END, 0);
+       phys_map = kmem_alloc(sizeof(struct vm_map), KM_SLEEP);
       if (phys_map == NULL)
               panic("unable to create DVMA map");

+       uvm_map_setup(phys_map, DVMA_MAP_BASE, DVMA_MAP_END, 0);
+       phys_map->pmap = pmap_kernel();
+
       /*
        * Reserve the DVMA space used for segment remapping.
        * The remainder of phys_map is used for DVMA scratch
@@ -102,7 +104,7 @@ dvma_init(void)
        * into DVMA space for the purpose of data transfer.
        */
       dvma_extent = extent_create("dvma", segmap_addr,
-           segmap_addr + (dvma_segmap_size - 1), M_DEVBUF,
+           segmap_addr + (dvma_segmap_size - 1),
           NULL, 0, EX_NOCOALESCE|EX_NOWAIT);
}

Index: sys/arch/sun3/sun3x/dvma.c
===================================================================
RCS file: /cvsroot/src/sys/arch/sun3/sun3x/dvma.c,v
retrieving revision 1.40
diff -u -p -r1.40 dvma.c
--- sys/arch/sun3/sun3x/dvma.c  21 Nov 2009 04:16:53 -0000      1.40
+++ sys/arch/sun3/sun3x/dvma.c  23 Jan 2012 22:02:03 -0000
@@ -114,7 +114,7 @@ dvma_init(void)
        * Create the extent map for DVMA pages.
        */
       dvma_extent = extent_create("dvma", DVMA_MAP_BASE,
-           DVMA_MAP_BASE + (DVMA_MAP_AVAIL - 1), M_DEVBUF,
+           DVMA_MAP_BASE + (DVMA_MAP_AVAIL - 1),
           NULL, 0, EX_NOCOALESCE|EX_NOWAIT);

       /*
Index: sys/arch/vax/vax/machdep.c
===================================================================
RCS file: /cvsroot/src/sys/arch/vax/vax/machdep.c,v
retrieving revision 1.184
diff -u -p -r1.184 machdep.c
--- sys/arch/vax/vax/machdep.c  7 Jan 2012 16:47:42 -0000       1.184
+++ sys/arch/vax/vax/machdep.c  23 Jan 2012 22:02:03 -0000
@@ -309,7 +309,7 @@ consinit(void)
        */
       KASSERT(iospace != 0);
       iomap_ex = extent_create("iomap", iospace + VAX_NBPG,
-           iospace + ((IOSPSZ * VAX_NBPG) - 1), M_DEVBUF,
+           iospace + ((IOSPSZ * VAX_NBPG) - 1),
           (void *) iomap_ex_storage, sizeof(iomap_ex_storage),
           EX_NOCOALESCE|EX_NOWAIT);
#ifdef DEBUG
Index: sys/arch/vax/vax/sgmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/vax/vax/sgmap.c,v
retrieving revision 1.16
diff -u -p -r1.16 sgmap.c
--- sys/arch/vax/vax/sgmap.c    14 Dec 2010 23:44:50 -0000      1.16
+++ sys/arch/vax/vax/sgmap.c    23 Jan 2012 22:02:03 -0000
@@ -93,7 +93,7 @@ vax_sgmap_init(bus_dma_tag_t t, struct v
        * space.
        */
       sgmap->aps_ex = extent_create(name, sgvabase, sgvasize - 1,
-           M_DMAMAP, NULL, 0, EX_NOWAIT|EX_NOCOALESCE);
+           NULL, 0, EX_NOWAIT|EX_NOCOALESCE);
       if (sgmap->aps_ex == NULL) {
               printf("unable to create extent map for sgmap `%s'\n", name);
               goto die;
Index: sys/arch/x68k/dev/intio.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x68k/dev/intio.c,v
retrieving revision 1.42
diff -u -p -r1.42 intio.c
--- sys/arch/x68k/dev/intio.c   18 Jan 2009 05:00:39 -0000      1.42
+++ sys/arch/x68k/dev/intio.c   23 Jan 2012 22:02:04 -0000
@@ -162,7 +162,7 @@ intio_attach(device_t parent, device_t s
       sc->sc_map = extent_create("intiomap",
                                 INTIOBASE,
                                 INTIOBASE + 0x400000,
-                                 M_DEVBUF, NULL, 0, EX_NOWAIT);
+                                 NULL, 0, EX_NOWAIT);
       intio_alloc_system_ports(sc);

       sc->sc_bst = &intio_bus;
Index: sys/arch/x86/pci/pci_addr_fixup.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/pci/pci_addr_fixup.c,v
retrieving revision 1.8
diff -u -p -r1.8 pci_addr_fixup.c
--- sys/arch/x86/pci/pci_addr_fixup.c   28 Aug 2011 06:08:15 -0000      1.8
+++ sys/arch/x86/pci/pci_addr_fixup.c   23 Jan 2012 22:02:04 -0000
@@ -90,12 +90,12 @@ pci_addr_fixup(pci_chipset_tag_t pc, int
       pciaddr.extent_mem = extent_create("PCI I/O memory space",
                                          PCIADDR_MEM_START,
                                          PCIADDR_MEM_END,
-                                          M_DEVBUF, 0, 0, EX_NOWAIT);
+                                          0, 0, EX_NOWAIT);
       KASSERT(pciaddr.extent_mem);
       pciaddr.extent_port = extent_create("PCI I/O port space",
                                           PCIADDR_PORT_START,
                                           PCIADDR_PORT_END,
-                                           M_DEVBUF, 0, 0, EX_NOWAIT);
+                                           0, 0, EX_NOWAIT);
       KASSERT(pciaddr.extent_port);

       /*
Index: sys/arch/x86/x86/bus_space.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/bus_space.c,v
retrieving revision 1.37
diff -u -p -r1.37 bus_space.c
--- sys/arch/x86/x86/bus_space.c        25 Aug 2011 15:08:49 -0000      1.37
+++ sys/arch/x86/x86/bus_space.c        23 Jan 2012 22:02:04 -0000
@@ -126,10 +126,10 @@ x86_bus_space_init(void)
        * extents of RAM are allocated from the map (0 -> ISA hole
        * and end of ISA hole -> end of RAM).
        */
-       ioport_ex = extent_create("ioport", 0x0, 0xffff, M_DEVBUF,
+       ioport_ex = extent_create("ioport", 0x0, 0xffff,
           (void *)ioport_ex_storage, sizeof(ioport_ex_storage),
           EX_NOCOALESCE|EX_NOWAIT);
-       iomem_ex = extent_create("iomem", 0x0, 0xffffffff, M_DEVBUF,
+       iomem_ex = extent_create("iomem", 0x0, 0xffffffff,
           (void *)iomem_ex_storage, sizeof(iomem_ex_storage),
           EX_NOCOALESCE|EX_NOWAIT);

Index: sys/arch/x86/x86/intr.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/intr.c,v
retrieving revision 1.72
diff -u -p -r1.72 intr.c
--- sys/arch/x86/x86/intr.c     1 Aug 2011 10:42:24 -0000       1.72
+++ sys/arch/x86/x86/intr.c     23 Jan 2012 22:02:04 -0000
@@ -514,7 +514,7 @@ intr_allocate_slot(struct pic *pic, int
                       if ((lci->ci_schedstate.spc_flags & SPCF_NOINTR) != 0) {
                               continue;
                       }
-#if 0
+#if 0
                       if (ci == NULL ||
                           ci->ci_nintrhand > lci->ci_nintrhand) {
                               ci = lci;
@@ -988,7 +988,6 @@ cpu_intr_init(struct cpu_info *ci)
       struct intrsource *isp;
#if NLAPIC > 0 && defined(MULTIPROCESSOR)
       int i;
-       static int first = 1;
#endif
#ifdef INTRSTACKSIZE
       vaddr_t istack;
@@ -1003,10 +1002,8 @@ cpu_intr_init(struct cpu_info *ci)
       isp->is_handlers = &fake_timer_intrhand;
       isp->is_pic = &local_pic;
       ci->ci_isources[LIR_TIMER] = isp;
-       evcnt_attach_dynamic(&isp->is_evcnt,
-           first ? EVCNT_TYPE_INTR : EVCNT_TYPE_MISC, NULL,
+       evcnt_attach_dynamic(&isp->is_evcnt, EVCNT_TYPE_INTR, NULL,
           device_xname(ci->ci_dev), "timer");
-       first = 0;

#ifdef MULTIPROCESSOR
       isp = kmem_zalloc(sizeof(*isp), KM_SLEEP);
Index: sys/arch/x86/x86/pmap.c
===================================================================
RCS file: /cvsroot/src/sys/arch/x86/x86/pmap.c,v
retrieving revision 1.154
diff -u -p -r1.154 pmap.c
--- sys/arch/x86/x86/pmap.c     22 Jan 2012 18:16:35 -0000      1.154
+++ sys/arch/x86/x86/pmap.c     23 Jan 2012 22:02:06 -0000
@@ -1512,24 +1512,6 @@ pmap_bootstrap(vaddr_t kva_start)
       LIST_INIT(&pmaps);

       /*
-        * initialize caches.
-        */
-
-       pool_cache_bootstrap(&pmap_cache, sizeof(struct pmap), 0, 0, 0,
-           "pmappl", NULL, IPL_NONE, NULL, NULL, NULL);
-#ifdef PAE
-       pool_cache_bootstrap(&pmap_pdp_cache, PAGE_SIZE * PDP_SIZE, 0, 0, 0,
-           "pdppl", &pmap_pdp_allocator, IPL_NONE,
-           pmap_pdp_ctor, pmap_pdp_dtor, NULL);
-#else /* PAE */
-       pool_cache_bootstrap(&pmap_pdp_cache, PAGE_SIZE, 0, 0, 0,
-           "pdppl", NULL, IPL_NONE, pmap_pdp_ctor, pmap_pdp_dtor, NULL);
-#endif /* PAE */
-       pool_cache_bootstrap(&pmap_pv_cache, sizeof(struct pv_entry), 0, 0,
-           PR_LARGECACHE, "pvpl", &pool_allocator_meta, IPL_NONE, NULL,
-           NULL, NULL);
-
-       /*
        * ensure the TLB is sync'd with reality by flushing it...
        */

@@ -1633,6 +1615,24 @@ pmap_init(void)
               mutex_init(&pv_hash_locks[i].lock, MUTEX_NODEBUG, IPL_VM);
       }

+       /*
+        * initialize caches.
+        */
+
+       pool_cache_bootstrap(&pmap_cache, sizeof(struct pmap), 0, 0, 0,
+           "pmappl", NULL, IPL_NONE, NULL, NULL, NULL);
+#ifdef PAE
+       pool_cache_bootstrap(&pmap_pdp_cache, PAGE_SIZE * PDP_SIZE, 0, 0, 0,
+           "pdppl", &pmap_pdp_allocator, IPL_NONE,
+           pmap_pdp_ctor, pmap_pdp_dtor, NULL);
+#else /* PAE */
+       pool_cache_bootstrap(&pmap_pdp_cache, PAGE_SIZE, 0, 0, 0,
+           "pdppl", NULL, IPL_NONE, pmap_pdp_ctor, pmap_pdp_dtor, NULL);
+#endif /* PAE */
+       pool_cache_bootstrap(&pmap_pv_cache, sizeof(struct pv_entry), 0, 0,
+           PR_LARGECACHE, "pvpl", &pool_allocator_kmem, IPL_NONE, NULL,
+           NULL, NULL);
+
       pmap_tlb_init();

       evcnt_attach_dynamic(&pmap_iobmp_evcnt, EVCNT_TYPE_MISC,
Index: sys/arch/xen/xen/xbd_xenbus.c
===================================================================
RCS file: /cvsroot/src/sys/arch/xen/xen/xbd_xenbus.c,v
retrieving revision 1.50
diff -u -p -r1.50 xbd_xenbus.c
--- sys/arch/xen/xen/xbd_xenbus.c       7 Dec 2011 15:47:43 -0000       1.50
+++ sys/arch/xen/xen/xbd_xenbus.c       23 Jan 2012 22:02:06 -0000
@@ -1064,11 +1064,13 @@ static int
xbd_map_align(struct xbd_req *req)
{
       int s = splvm();
+       int rc;

-       req->req_data = (void *)uvm_km_alloc(kmem_map, req->req_bp->b_bcount,
-           PAGE_SIZE, UVM_KMF_WIRED | UVM_KMF_NOWAIT);
+       rc = uvm_km_kmem_alloc(kmem_va_arena,
+           req->req_bp->b_bcount, (VM_NOSLEEP | VM_INSTANTFIT),
+           req->req_data);
       splx(s);
-       if (__predict_false(req->req_data == NULL))
+       if (__predict_false(rc != 0))
               return ENOMEM;
       if ((req->req_bp->b_flags & B_READ) == 0)
               memcpy(req->req_data, req->req_bp->b_data,
@@ -1084,7 +1086,6 @@ xbd_unmap_align(struct xbd_req *req)
               memcpy(req->req_bp->b_data, req->req_data,
                   req->req_bp->b_bcount);
       s = splvm();
-       uvm_km_free(kmem_map, (vaddr_t)req->req_data, req->req_bp->b_bcount,
-           UVM_KMF_WIRED);
+       uvm_km_kmem_free(kmem_va_arena, (vaddr_t)req->req_data, req->req_bp->b_bcount);
       splx(s);
}
Index: sys/dev/cardbus/rbus.c
===================================================================
RCS file: /cvsroot/src/sys/dev/cardbus/rbus.c,v
retrieving revision 1.28
diff -u -p -r1.28 rbus.c
--- sys/dev/cardbus/rbus.c      15 Dec 2009 22:17:12 -0000      1.28
+++ sys/dev/cardbus/rbus.c      23 Jan 2012 22:02:07 -0000
@@ -258,7 +258,7 @@ rbus_new(rbus_tag_t parent, bus_addr_t s
       if (flags == RBUS_SPACE_SHARE) {
               ex = parent->rb_ext;
       } else if (flags == RBUS_SPACE_DEDICATE) {
-               if (NULL == (ex = extent_create("rbus", start, end, M_DEVBUF,
+               if (NULL == (ex = extent_create("rbus", start, end,
                   NULL, 0, EX_NOCOALESCE|EX_NOWAIT))) {
                       return NULL;
               }
@@ -295,7 +295,7 @@ rbus_new_root_delegate(bus_space_tag_t b
       struct extent *ex;

       if (NULL == (ex = extent_create("rbus root", start, start + size,
-           M_DEVBUF, NULL, 0, EX_NOCOALESCE|EX_NOWAIT))) {
+           NULL, 0, EX_NOCOALESCE|EX_NOWAIT))) {
               return NULL;
       }

Index: sys/dev/ic/cpc700.c
===================================================================
RCS file: /cvsroot/src/sys/dev/ic/cpc700.c,v
retrieving revision 1.18
diff -u -p -r1.18 cpc700.c
--- sys/dev/ic/cpc700.c 17 May 2011 17:34:54 -0000      1.18
+++ sys/dev/ic/cpc700.c 23 Jan 2012 22:02:07 -0000
@@ -191,9 +191,9 @@ cpc_attach(device_t self, pci_chipset_ta

#if NPCI > 0 && defined(PCI_NETBSD_CONFIGURE)
       ioext  = extent_create("pciio",  CPC_PCI_IO_START, CPC_PCI_IO_END,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);
       memext = extent_create("pcimem", CPC_PCI_MEM_BASE, CPC_PCI_MEM_END,
-           M_DEVBUF, NULL, 0, EX_NOWAIT);
+           NULL, 0, EX_NOWAIT);

       pci_configure_bus(0, ioext, memext, NULL, 0, 32);

Index: sys/dev/iscsi/iscsi_ioctl.c
===================================================================
RCS file: /cvsroot/src/sys/dev/iscsi/iscsi_ioctl.c,v
retrieving revision 1.1
diff -u -p -r1.1 iscsi_ioctl.c
--- sys/dev/iscsi/iscsi_ioctl.c 23 Oct 2011 21:15:02 -0000      1.1
+++ sys/dev/iscsi/iscsi_ioctl.c 23 Jan 2012 22:02:08 -0000
@@ -1166,7 +1166,7 @@ unmap_databuf(struct proc *p, void *buf,
       vm_map_lock(kernel_map);
       uvm_unmap_remove(kernel_map, databuf, databuf + datalen, &dead_entries
#if (__NetBSD_Version__ >= 399000500)
-                                        , NULL, 0
+                                        , 0
#elif   (__NetBSD_Version__ >= 300000000)
                                        , NULL
#endif
Index: sys/dev/marvell/gtpci.c
===================================================================
RCS file: /cvsroot/src/sys/dev/marvell/gtpci.c,v
retrieving revision 1.28
diff -u -p -r1.28 gtpci.c
--- sys/dev/marvell/gtpci.c     17 May 2011 17:34:54 -0000      1.28
+++ sys/dev/marvell/gtpci.c     23 Jan 2012 22:02:08 -0000
@@ -454,10 +454,8 @@ gtpci_pci_config(struct gtpci_softc *sc,
       p2pc = GTPCI_READ(sc, GTPCI_P2PC);

#ifdef PCI_NETBSD_CONFIGURE
-       ioext = extent_create("pciio", iostart, ioend, M_DEVBUF, NULL, 0,
-           EX_NOWAIT);
-       memext = extent_create("pcimem", memstart, memend, M_DEVBUF, NULL, 0,
-           EX_NOWAIT);
+       ioext = extent_create("pciio", iostart, ioend, NULL, 0, EX_NOWAIT);
+       memext = extent_create("pcimem", memstart, memend, NULL, 0, EX_NOWAIT);
       if (ioext != NULL && memext != NULL)
               pci_configure_bus(pc, ioext, memext, NULL,
                   GTPCI_P2PC_BUSNUMBER(p2pc), cacheline_size);
Index: sys/dev/marvell/mvpex.c
===================================================================
RCS file: /cvsroot/src/sys/dev/marvell/mvpex.c,v
retrieving revision 1.5
diff -u -p -r1.5 mvpex.c
--- sys/dev/marvell/mvpex.c     17 May 2011 17:34:54 -0000      1.5
+++ sys/dev/marvell/mvpex.c     23 Jan 2012 22:02:08 -0000
@@ -417,10 +417,8 @@ mvpex_pci_config(struct mvpex_softc *sc,
       stat = bus_space_read_4(sc->sc_iot, sc->sc_ioh, MVPEX_STAT);

#ifdef PCI_NETBSD_CONFIGURE
-       ioext = extent_create("pexio", iostart, ioend, M_DEVBUF, NULL, 0,
-           EX_NOWAIT);
-       memext = extent_create("pexmem", memstart, memend, M_DEVBUF, NULL, 0,
-           EX_NOWAIT);
+       ioext = extent_create("pexio", iostart, ioend, NULL, 0, EX_NOWAIT);
+       memext = extent_create("pexmem", memstart, memend, NULL, 0, EX_NOWAIT);
       if (ioext != NULL && memext != NULL)
               pci_configure_bus(pc, ioext, memext, NULL,
                   MVPEX_STAT_PEXBUSNUM(stat), cacheline_size);
Index: sys/dev/pci/btvmei.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/btvmei.c,v
retrieving revision 1.26
diff -u -p -r1.26 btvmei.c
--- sys/dev/pci/btvmei.c        26 Nov 2009 15:17:08 -0000      1.26
+++ sys/dev/pci/btvmei.c        23 Jan 2012 22:02:08 -0000
@@ -303,16 +303,16 @@ b3_617_init(struct b3_617_softc *sc)
        * set up scatter page allocation control
        */
       sc->vmeext = extent_create("pcivme", MR_PCI_VME,
-                                  MR_PCI_VME + MR_PCI_VME_SIZE - 1, M_DEVBUF,
+                                  MR_PCI_VME + MR_PCI_VME_SIZE - 1,
                                  sc->vmemap, sizeof(sc->vmemap),
                                  EX_NOCOALESCE);
#if 0
       sc->pciext = extent_create("vmepci", MR_VME_PCI,
-                                  MR_VME_PCI + MR_VME_PCI_SIZE - 1, M_DEVBUF,
+                                  MR_VME_PCI + MR_VME_PCI_SIZE - 1,
                                  sc->pcimap, sizeof(sc->pcimap),
                                  EX_NOCOALESCE);
       sc->dmaext = extent_create("dmapci", MR_DMA_PCI,
-                                  MR_DMA_PCI + MR_DMA_PCI_SIZE - 1, M_DEVBUF,
+                                  MR_DMA_PCI + MR_DMA_PCI_SIZE - 1,
                                  sc->dmamap, sizeof(sc->dmamap),
                                  EX_NOCOALESCE);
#endif
Index: sys/dev/pci/pciconf.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/pciconf.c,v
retrieving revision 1.33
diff -u -p -r1.33 pciconf.c
--- sys/dev/pci/pciconf.c       24 Aug 2011 20:27:35 -0000      1.33
+++ sys/dev/pci/pciconf.c       23 Jan 2012 22:02:09 -0000
@@ -708,7 +708,7 @@ setup_iowins(pciconf_bus_t *pb)
               }
               if (pd->ppb && pi->reg == 0) {
                       pd->ppb->ioext = extent_create("pciconf", pi->address,
-                           pi->address + pi->size, M_DEVBUF, NULL, 0,
+                           pi->address + pi->size, NULL, 0,
                           EX_NOWAIT);
                       if (pd->ppb->ioext == NULL) {
                               print_tag(pd->pc, pd->tag);
@@ -759,8 +759,7 @@ setup_memwins(pciconf_bus_t *pb)
               }
               if (pd->ppb && pm->reg == 0) {
                       ex = extent_create("pciconf", pm->address,
-                           pm->address + pm->size, M_DEVBUF, NULL, 0,
-                           EX_NOWAIT);
+                           pm->address + pm->size, NULL, 0, EX_NOWAIT);
                       if (ex == NULL) {
                               print_tag(pd->pc, pd->tag);
                               printf("Failed to alloc MEM ext. for bus %d\n",
Index: sys/dev/pci/twa.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/twa.c,v
retrieving revision 1.38
diff -u -p -r1.38 twa.c
--- sys/dev/pci/twa.c   31 Aug 2011 18:31:02 -0000      1.38
+++ sys/dev/pci/twa.c   23 Jan 2012 22:02:10 -0000
@@ -525,8 +525,8 @@ twa_unmap_request(struct twa_request *tr
       /* Free alignment buffer if it was used. */
       if (tr->tr_flags & TWA_CMD_DATA_COPY_NEEDED) {
               s = splvm();
-               uvm_km_free(kmem_map, (vaddr_t)tr->tr_data,
-                   tr->tr_length, UVM_KMF_WIRED);
+               uvm_km_kmem_free(kmem_va_arena, (vaddr_t)tr->tr_data,
+                   tr->tr_length);
               splx(s);
               tr->tr_data = tr->tr_real_data;
               tr->tr_length = tr->tr_real_length;
@@ -1786,7 +1786,7 @@ int
twa_map_request(struct twa_request *tr)
{
       struct twa_softc        *sc = tr->tr_sc;
-       int                      s, rv;
+       int                      s, rv, rc;

       /* If the command involves data, map that too. */
       if (tr->tr_data != NULL) {
@@ -1796,11 +1796,12 @@ twa_map_request(struct twa_request *tr)
                       tr->tr_real_data = tr->tr_data;
                       tr->tr_real_length = tr->tr_length;
                       s = splvm();
-                       tr->tr_data = (void *)uvm_km_alloc(kmem_map,
-                           tr->tr_length, 512, UVM_KMF_NOWAIT|UVM_KMF_WIRED);
+                       rc = uvm_km_kmem_alloc(kmem_va_arena,
+                           tr->tr_length, (VM_NOSLEEP | VM_INSTANTFIT),
+                           (vmem_addr_t *)&tr->tr_data);
                       splx(s);

-                       if (tr->tr_data == NULL) {
+                       if (rc != 0) {
                               tr->tr_data = tr->tr_real_data;
                               tr->tr_length = tr->tr_real_length;
                               return(ENOMEM);
@@ -1820,8 +1821,9 @@ twa_map_request(struct twa_request *tr)
               if (rv != 0) {
                       if ((tr->tr_flags & TWA_CMD_DATA_COPY_NEEDED) != 0) {
                               s = splvm();
-                               uvm_km_free(kmem_map, (vaddr_t)tr->tr_data,
-                                   tr->tr_length, UVM_KMF_WIRED);
+                               uvm_km_kmem_free(kmem_va_arena,
+                                   (vaddr_t)tr->tr_data,
+                                   tr->tr_length);
                               splx(s);
                       }
                       return (rv);
@@ -1833,8 +1835,8 @@ twa_map_request(struct twa_request *tr)

                       if (tr->tr_flags & TWA_CMD_DATA_COPY_NEEDED) {
                               s = splvm();
-                               uvm_km_free(kmem_map, (vaddr_t)tr->tr_data,
-                                   tr->tr_length, UVM_KMF_WIRED);
+                               uvm_km_kmem_free(kmem_va_arena, (vaddr_t)tr->tr_data,
+                                   tr->tr_length);
                               splx(s);
                               tr->tr_data = tr->tr_real_data;
                               tr->tr_length = tr->tr_real_length;
Index: sys/dev/pci/twe.c
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/twe.c,v
retrieving revision 1.95
diff -u -p -r1.95 twe.c
--- sys/dev/pci/twe.c   30 Jun 2011 20:09:40 -0000      1.95
+++ sys/dev/pci/twe.c   23 Jan 2012 22:02:10 -0000
@@ -1475,7 +1475,7 @@ int
twe_ccb_map(struct twe_softc *sc, struct twe_ccb *ccb)
{
       struct twe_cmd *tc;
-       int flags, nsegs, i, s, rv;
+       int flags, nsegs, i, s, rv, rc;
       void *data;

       /*
@@ -1484,8 +1484,9 @@ twe_ccb_map(struct twe_softc *sc, struct
       if (((u_long)ccb->ccb_data & (TWE_ALIGNMENT - 1)) != 0) {
               s = splvm();
               /* XXX */
-               ccb->ccb_abuf = uvm_km_alloc(kmem_map,
-                   ccb->ccb_datasize, 0, UVM_KMF_NOWAIT|UVM_KMF_WIRED);
+               rc = uvm_km_kmem_alloc(kmem_va_arena,
+                   ccb->ccb_datasize, (VM_NOSLEEP | VM_INSTANTFIT),
+                   (vmem_addr_t *)&ccb->ccb_abuf);
               splx(s);
               data = (void *)ccb->ccb_abuf;
               if ((ccb->ccb_flags & TWE_CCB_DATA_OUT) != 0)
@@ -1506,8 +1507,8 @@ twe_ccb_map(struct twe_softc *sc, struct
               if (ccb->ccb_abuf != (vaddr_t)0) {
                       s = splvm();
                       /* XXX */
-                       uvm_km_free(kmem_map, ccb->ccb_abuf,
-                           ccb->ccb_datasize, UVM_KMF_WIRED);
+                       uvm_km_kmem_free(kmem_va_arena, ccb->ccb_abuf,
+                           ccb->ccb_datasize);
                       splx(s);
               }
               return (rv);
@@ -1592,8 +1593,8 @@ twe_ccb_unmap(struct twe_softc *sc, stru
                           ccb->ccb_datasize);
               s = splvm();
               /* XXX */
-               uvm_km_free(kmem_map, ccb->ccb_abuf, ccb->ccb_datasize,
-                   UVM_KMF_WIRED);
+               uvm_km_kmem_free(kmem_va_arena, ccb->ccb_abuf,
+                   ccb->ccb_datasize);
               splx(s);
       }
}
Index: sys/dev/usb/usb_mem.c
===================================================================
RCS file: /cvsroot/src/sys/dev/usb/usb_mem.c,v
retrieving revision 1.50
diff -u -p -r1.50 usb_mem.c
--- sys/dev/usb/usb_mem.c       27 Sep 2011 01:02:38 -0000      1.50
+++ sys/dev/usb/usb_mem.c       23 Jan 2012 22:02:11 -0000
@@ -432,8 +432,7 @@ usb_setup_reserve(device_t dv, struct us

       rs->paddr = rs->map->dm_segs[0].ds_addr;
       rs->extent = extent_create(device_xname(dv), (u_long)rs->paddr,
-           (u_long)(rs->paddr + USB_MEM_RESERVE - 1),
-           M_USB, 0, 0, 0);
+           (u_long)(rs->paddr + USB_MEM_RESERVE - 1), 0, 0, 0);
       if (rs->extent == NULL) {
               rs->vaddr = 0;
               return ENOMEM;
Index: sys/dev/vme/vme.c
===================================================================
RCS file: /cvsroot/src/sys/dev/vme/vme.c,v
retrieving revision 1.24
diff -u -p -r1.24 vme.c
--- sys/dev/vme/vme.c   11 Dec 2010 18:12:45 -0000      1.24
+++ sys/dev/vme/vme.c   23 Jan 2012 22:02:11 -0000
@@ -187,22 +187,19 @@ vmeattach(device_t parent, device_t self
       /*
        * set up address space accounting - assume incomplete decoding
        */
-       sc->vme32ext = extent_create("vme32", 0, 0xffffffff,
-                                    M_DEVBUF, 0, 0, 0);
+       sc->vme32ext = extent_create("vme32", 0, 0xffffffff, 0, 0, 0);
       if (!sc->vme32ext) {
               printf("error creating A32 map\n");
               return;
       }

-       sc->vme24ext = extent_create("vme24", 0, 0x00ffffff,
-                                    M_DEVBUF, 0, 0, 0);
+       sc->vme24ext = extent_create("vme24", 0, 0x00ffffff, 0, 0, 0);
       if (!sc->vme24ext) {
               printf("error creating A24 map\n");
               return;
       }

-       sc->vme16ext = extent_create("vme16", 0, 0x0000ffff,
-                                    M_DEVBUF, 0, 0, 0);
+       sc->vme16ext = extent_create("vme16", 0, 0x0000ffff, 0, 0, 0);
       if (!sc->vme16ext) {
               printf("error creating A16 map\n");
               return;
Index: sys/external/bsd/drm/dist/bsd-core/drm_bufs.c
===================================================================
RCS file: /cvsroot/src/sys/external/bsd/drm/dist/bsd-core/drm_bufs.c,v
retrieving revision 1.8
diff -u -p -r1.8 drm_bufs.c
--- sys/external/bsd/drm/dist/bsd-core/drm_bufs.c       21 Jul 2010 09:06:38 -0000      1.8
+++ sys/external/bsd/drm/dist/bsd-core/drm_bufs.c       23 Jan 2012 22:02:11 -0000
@@ -36,6 +36,10 @@
#include "dev/pci/pcireg.h"
#endif

+#if defined(__NetBSD__)
+#include <sys/kmem.h>
+#endif
+
#include "drmP.h"

/* Allocation of PCI memory resources (framebuffer, registers, etc.) for
@@ -184,7 +188,11 @@ int drm_addmap(struct drm_device * dev,
                       map->mtrr = 1;
               break;
       case _DRM_SHM:
+#if defined(__NetBSD__)
+               map->handle = kmem_alloc(map->size, KM_NOSLEEP);
+#else
               map->handle = malloc(map->size, DRM_MEM_MAPS, M_NOWAIT);
+#endif
               DRM_DEBUG("%lu %d %p\n",
                   map->size, drm_order(map->size), map->handle);
               if (!map->handle) {
@@ -198,7 +206,11 @@ int drm_addmap(struct drm_device * dev,
                       DRM_LOCK();
                       if (dev->lock.hw_lock != NULL) {
                               DRM_UNLOCK();
+#if defined(__NetBSD__)
+                               kmem_free(map->handle, map->size);
+#else
                               free(map->handle, DRM_MEM_MAPS);
+#endif
                               free(map, DRM_MEM_MAPS);
                               return EBUSY;
                       }
@@ -338,7 +350,11 @@ void drm_rmmap(struct drm_device *dev, d
               }
               break;
       case _DRM_SHM:
+#if defined(__NetBSD__)
+               kmem_free(map->handle, map->size);
+#else
               free(map->handle, DRM_MEM_MAPS);
+#endif
               break;
       case _DRM_AGP:
       case _DRM_SCATTER_GATHER:
Index: sys/fs/efs/efs_ihash.c
===================================================================
RCS file: /cvsroot/src/sys/fs/efs/efs_ihash.c,v
retrieving revision 1.7
diff -u -p -r1.7 efs_ihash.c
--- sys/fs/efs/efs_ihash.c      12 Jun 2011 03:35:52 -0000      1.7
+++ sys/fs/efs/efs_ihash.c      23 Jan 2012 22:02:12 -0000
@@ -40,6 +40,7 @@ __KERNEL_RCSID(0, "$NetBSD: efs_ihash.c,

#include <sys/param.h>
#include <sys/systm.h>
+#include <sys/malloc.h>
#include <sys/vnode.h>
#include <sys/proc.h>
#include <sys/mutex.h>
Index: sys/fs/ntfs/ntfs_ihash.c
===================================================================
RCS file: /cvsroot/src/sys/fs/ntfs/ntfs_ihash.c,v
retrieving revision 1.9
diff -u -p -r1.9 ntfs_ihash.c
--- sys/fs/ntfs/ntfs_ihash.c    15 Mar 2009 17:15:58 -0000      1.9
+++ sys/fs/ntfs/ntfs_ihash.c    23 Jan 2012 22:02:12 -0000
@@ -42,6 +42,7 @@ __KERNEL_RCSID(0, "$NetBSD: ntfs_ihash.c
#include <sys/vnode.h>
#include <sys/proc.h>
#include <sys/mount.h>
+#include <sys/mallocvar.h>

#include <fs/ntfs/ntfs.h>
#include <fs/ntfs/ntfs_inode.h>
Index: sys/fs/smbfs/smbfs_kq.c
===================================================================
RCS file: /cvsroot/src/sys/fs/smbfs/smbfs_kq.c,v
retrieving revision 1.24
diff -u -p -r1.24 smbfs_kq.c
--- sys/fs/smbfs/smbfs_kq.c     23 Oct 2011 08:42:06 -0000      1.24
+++ sys/fs/smbfs/smbfs_kq.c     23 Jan 2012 22:02:12 -0000
@@ -47,6 +47,7 @@ __KERNEL_RCSID(0, "$NetBSD: smbfs_kq.c,v
#include <sys/kthread.h>
#include <sys/file.h>
#include <sys/dirent.h>
+#include <sys/mallocvar.h>

#include <machine/limits.h>

Index: sys/fs/smbfs/smbfs_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/fs/smbfs/smbfs_vnops.c,v
retrieving revision 1.77
diff -u -p -r1.77 smbfs_vnops.c
--- sys/fs/smbfs/smbfs_vnops.c  30 Nov 2010 10:43:03 -0000      1.77
+++ sys/fs/smbfs/smbfs_vnops.c  23 Jan 2012 22:02:12 -0000
@@ -78,6 +78,7 @@ __KERNEL_RCSID(0, "$NetBSD: smbfs_vnops.
#include <sys/vnode.h>
#include <sys/lockf.h>
#include <sys/kauth.h>
+#include <sys/mallocvar.h>

#include <machine/limits.h>

Index: sys/kern/core_elf32.c
===================================================================
RCS file: /cvsroot/src/sys/kern/core_elf32.c,v
retrieving revision 1.35
diff -u -p -r1.35 core_elf32.c
--- sys/kern/core_elf32.c       14 Dec 2009 00:48:35 -0000      1.35
+++ sys/kern/core_elf32.c       23 Jan 2012 22:02:12 -0000
@@ -57,7 +57,7 @@ __KERNEL_RCSID(1, "$NetBSD: core_elf32.c
#include <sys/exec.h>
#include <sys/exec_elf.h>
#include <sys/ptrace.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/kauth.h>

#include <machine/reg.h>
@@ -104,6 +104,7 @@ ELFNAMEEND(coredump)(struct lwp *l, void
       struct proc *p;
       Elf_Ehdr ehdr;
       Elf_Phdr phdr, *psections;
+       size_t psectionssize;
       struct countsegs_state cs;
       struct writesegs_state ws;
       off_t notestart, secstart, offset;
@@ -180,8 +181,8 @@ ELFNAMEEND(coredump)(struct lwp *l, void
       notestart = offset + sizeof(phdr) * cs.npsections;
       secstart = notestart + notesize;

-       psections = malloc(cs.npsections * sizeof(Elf_Phdr),
-           M_TEMP, M_WAITOK|M_ZERO);
+       psectionssize = cs.npsections * sizeof(Elf_Phdr);
+       psections = kmem_zalloc(psectionssize, KM_SLEEP);

       /* Pass 2: now write the P-section headers. */
       ws.secoff = secstart;
@@ -250,7 +251,7 @@ ELFNAMEEND(coredump)(struct lwp *l, void

  out:
       if (psections)
-               free(psections, M_TEMP);
+               kmem_free(psections, psectionssize);
       return (error);
}

Index: sys/kern/kern_malloc.c
===================================================================
RCS file: /cvsroot/src/sys/kern/kern_malloc.c,v
retrieving revision 1.133
diff -u -p -r1.133 kern_malloc.c
--- sys/kern/kern_malloc.c      15 Oct 2011 21:14:57 -0000      1.133
+++ sys/kern/kern_malloc.c      23 Jan 2012 22:02:13 -0000
@@ -72,6 +72,7 @@ __KERNEL_RCSID(0, "$NetBSD: kern_malloc.
#include <sys/proc.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/systm.h>
#include <sys/debug.h>
#include <sys/mutex.h>
@@ -79,247 +80,23 @@ __KERNEL_RCSID(0, "$NetBSD: kern_malloc.

#include <uvm/uvm_extern.h>

-static struct vm_map_kernel kmem_map_store;
-struct vm_map *kmem_map = NULL;
-
-#include "opt_kmempages.h"
-
-#ifdef NKMEMCLUSTERS
-#error NKMEMCLUSTERS is obsolete; remove it from your kernel config file and use NKMEMPAGES instead or let the kernel auto-size
-#endif
-
-/*
- * Default number of pages in kmem_map.  We attempt to calculate this
- * at run-time, but allow it to be either patched or set in the kernel
- * config file.
- */
-#ifndef NKMEMPAGES
-#define        NKMEMPAGES      0
-#endif
-int    nkmempages = NKMEMPAGES;
-
-/*
- * Defaults for lower- and upper-bounds for the kmem_map page count.
- * Can be overridden by kernel config options.
- */
-#ifndef        NKMEMPAGES_MIN
-#define        NKMEMPAGES_MIN  NKMEMPAGES_MIN_DEFAULT
-#endif
-
-#ifndef NKMEMPAGES_MAX
-#define        NKMEMPAGES_MAX  NKMEMPAGES_MAX_DEFAULT
-#endif
-
#include "opt_kmemstats.h"
#include "opt_malloclog.h"
#include "opt_malloc_debug.h"

-#define        MINALLOCSIZE    (1 << MINBUCKET)
-#define        BUCKETINDX(size) \
-       ((size) <= (MINALLOCSIZE * 128) \
-               ? (size) <= (MINALLOCSIZE * 8) \
-                       ? (size) <= (MINALLOCSIZE * 2) \
-                               ? (size) <= (MINALLOCSIZE * 1) \
-                                       ? (MINBUCKET + 0) \
-                                       : (MINBUCKET + 1) \
-                               : (size) <= (MINALLOCSIZE * 4) \
-                                       ? (MINBUCKET + 2) \
-                                       : (MINBUCKET + 3) \
-                       : (size) <= (MINALLOCSIZE* 32) \
-                               ? (size) <= (MINALLOCSIZE * 16) \
-                                       ? (MINBUCKET + 4) \
-                                       : (MINBUCKET + 5) \
-                               : (size) <= (MINALLOCSIZE * 64) \
-                                       ? (MINBUCKET + 6) \
-                                       : (MINBUCKET + 7) \
-               : (size) <= (MINALLOCSIZE * 2048) \
-                       ? (size) <= (MINALLOCSIZE * 512) \
-                               ? (size) <= (MINALLOCSIZE * 256) \
-                                       ? (MINBUCKET + 8) \
-                                       : (MINBUCKET + 9) \
-                               : (size) <= (MINALLOCSIZE * 1024) \
-                                       ? (MINBUCKET + 10) \
-                                       : (MINBUCKET + 11) \
-                       : (size) <= (MINALLOCSIZE * 8192) \
-                               ? (size) <= (MINALLOCSIZE * 4096) \
-                                       ? (MINBUCKET + 12) \
-                                       : (MINBUCKET + 13) \
-                               : (size) <= (MINALLOCSIZE * 16384) \
-                                       ? (MINBUCKET + 14) \
-                                       : (MINBUCKET + 15))
-
-/*
- * Array of descriptors that describe the contents of each page
- */
-struct kmemusage {
-       short ku_indx;          /* bucket index */
-       union {
-               u_short freecnt;/* for small allocations, free pieces in page */
-               u_short pagecnt;/* for large allocations, pages alloced */
-       } ku_un;
-};
-#define        ku_freecnt ku_un.freecnt
-#define        ku_pagecnt ku_un.pagecnt
-
struct kmembuckets kmembuckets[MINBUCKET + 16];
struct kmemusage *kmemusage;
-char *kmembase, *kmemlimit;
-
-#ifdef DEBUG
-static void *malloc_freecheck;
-#endif
-
-/*
- * Turn virtual addresses into kmem map indicies
- */
-#define        btokup(addr)    (&kmemusage[((char *)(addr) - kmembase) >> PGSHIFT])
-
struct malloc_type *kmemstatistics;

-#ifdef MALLOCLOG
-#ifndef MALLOCLOGSIZE
-#define        MALLOCLOGSIZE   100000
-#endif
-
-struct malloclog {
-       void *addr;
-       long size;
-       struct malloc_type *type;
-       int action;
-       const char *file;
-       long line;
-} malloclog[MALLOCLOGSIZE];
-
-long   malloclogptr;
-
-/*
- * Fuzz factor for neighbour address match this must be a mask of the lower
- * bits we wish to ignore when comparing addresses
- */
-__uintptr_t malloclog_fuzz = 0x7FL;
-
-
-static void
-domlog(void *a, long size, struct malloc_type *type, int action,
-    const char *file, long line)
-{
-
-       malloclog[malloclogptr].addr = a;
-       malloclog[malloclogptr].size = size;
-       malloclog[malloclogptr].type = type;
-       malloclog[malloclogptr].action = action;
-       malloclog[malloclogptr].file = file;
-       malloclog[malloclogptr].line = line;
-       malloclogptr++;
-       if (malloclogptr >= MALLOCLOGSIZE)
-               malloclogptr = 0;
-}
-
-#ifdef DIAGNOSTIC
-static void
-hitmlog(void *a)
-{
-       struct malloclog *lp;
-       long l;
-
-#define        PRT do { \
-       lp = &malloclog[l]; \
-       if (lp->addr == a && lp->action) { \
-               printf("malloc log entry %ld:\n", l); \
-               printf("\taddr = %p\n", lp->addr); \
-               printf("\tsize = %ld\n", lp->size); \
-               printf("\ttype = %s\n", lp->type->ks_shortdesc); \
-               printf("\taction = %s\n", lp->action == 1 ? "alloc" : "free"); \
-               printf("\tfile = %s\n", lp->file); \
-               printf("\tline = %ld\n", lp->line); \
-       } \
-} while (/* CONSTCOND */0)
-
-/*
- * Print fuzzy matched "neighbour" - look for the memory block that has
- * been allocated below the address we are interested in.  We look for a
- * base address + size that is within malloclog_fuzz of our target
- * address. If the base address and target address are the same then it is
- * likely we have found a free (size is 0 in this case) so we won't report
- * those, they will get reported by PRT anyway.
- */
-#define        NPRT do { \
-       __uintptr_t fuzz_mask = ~(malloclog_fuzz); \
-       lp = &malloclog[l]; \
-       if ((__uintptr_t)lp->addr != (__uintptr_t)a && \
-           (((__uintptr_t)lp->addr + lp->size + malloclog_fuzz) & fuzz_mask) \
-           == ((__uintptr_t)a & fuzz_mask) && lp->action) {            \
-               printf("neighbour malloc log entry %ld:\n", l); \
-               printf("\taddr = %p\n", lp->addr); \
-               printf("\tsize = %ld\n", lp->size); \
-               printf("\ttype = %s\n", lp->type->ks_shortdesc); \
-               printf("\taction = %s\n", lp->action == 1 ? "alloc" : "free"); \
-               printf("\tfile = %s\n", lp->file); \
-               printf("\tline = %ld\n", lp->line); \
-       } \
-} while (/* CONSTCOND */0)
-
-       for (l = malloclogptr; l < MALLOCLOGSIZE; l++) {
-               PRT;
-               NPRT;
-       }
-
-
-       for (l = 0; l < malloclogptr; l++) {
-               PRT;
-               NPRT;
-       }
-
-#undef PRT
-}
-#endif /* DIAGNOSTIC */
-#endif /* MALLOCLOG */
-
-#ifdef DIAGNOSTIC
-/*
- * This structure provides a set of masks to catch unaligned frees.
- */
-const long addrmask[] = { 0,
-       0x00000001, 0x00000003, 0x00000007, 0x0000000f,
-       0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff,
-       0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff,
-       0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff,
-};
+kmutex_t malloc_lock;

-/*
- * The WEIRD_ADDR is used as known text to copy into free objects so
- * that modifications after frees can be detected.
- */
-#define        WEIRD_ADDR      ((uint32_t) 0xdeadbeef)
-#ifdef DEBUG
-#define        MAX_COPY        PAGE_SIZE
-#else
-#define        MAX_COPY        32
-#endif
+extern void *kmem_intr_alloc(size_t, km_flag_t);
+extern void *kmem_intr_zalloc(size_t, km_flag_t);
+extern void kmem_intr_free(void *, size_t);

-/*
- * Normally the freelist structure is used only to hold the list pointer
- * for free objects.  However, when running with diagnostics, the first
- * 8/16 bytes of the structure is unused except for diagnostic information,
- * and the free list pointer is at offset 8/16 in the structure.  Since the
- * first 8 bytes is the portion of the structure most often modified, this
- * helps to detect memory reuse problems and avoid free list corruption.
- */
-struct freelist {
-       uint32_t spare0;
-#ifdef _LP64
-       uint32_t spare1;                /* explicit padding */
-#endif
-       struct malloc_type *type;
-       void *  next;
-};
-#else /* !DIAGNOSTIC */
-struct freelist {
-       void *  next;
+struct malloc_header {
+       size_t mh_size;
};
-#endif /* DIAGNOSTIC */
-
-kmutex_t malloc_lock;

/*
 * Allocate a block of memory
@@ -333,212 +110,23 @@ void *
kern_malloc(unsigned long size, struct malloc_type *ksp, int flags)
#endif /* MALLOCLOG */
{
-       struct kmembuckets *kbp;
-       struct kmemusage *kup;
-       struct freelist *freep;
-       long indx, npg, allocsize;
-       char *va, *cp, *savedlist;
-#ifdef DIAGNOSTIC
-       uint32_t *end, *lp;
-       int copysize;
-#endif
+       struct malloc_header *mh;
+       int kmflags = ((flags & M_NOWAIT) != 0
+           ? KM_NOSLEEP : KM_SLEEP);
+       size_t allocsize = sizeof(struct malloc_header) + size;
+       void *p;
+
+       p = kmem_intr_alloc(allocsize, kmflags);
+       if (p == NULL)
+               return NULL;

-#ifdef LOCKDEBUG
-       if ((flags & M_NOWAIT) == 0) {
-               ASSERT_SLEEPABLE();
-       }
-#endif
-#ifdef MALLOC_DEBUG
-       if (debug_malloc(size, ksp, flags, (void *) &va)) {
-               if (va != 0) {
-                       FREECHECK_OUT(&malloc_freecheck, (void *)va);
-               }
-               return ((void *) va);
-       }
-#endif
-       indx = BUCKETINDX(size);
-       kbp = &kmembuckets[indx];
-       mutex_spin_enter(&malloc_lock);
-#ifdef KMEMSTATS
-       while (ksp->ks_memuse >= ksp->ks_limit) {
-               if (flags & M_NOWAIT) {
-                       mutex_spin_exit(&malloc_lock);
-                       return (NULL);
-               }
-               if (ksp->ks_limblocks < 65535)
-                       ksp->ks_limblocks++;
-               mtsleep((void *)ksp, PSWP+2, ksp->ks_shortdesc, 0,
-                       &malloc_lock);
-       }
-       ksp->ks_size |= 1 << indx;
-#ifdef DIAGNOSTIC
-       if (ksp->ks_active[indx - MINBUCKET] == UINT_MAX)
-               panic("too many allocations in bucket");
-#endif
-       ksp->ks_active[indx - MINBUCKET]++;
-#endif
-#ifdef DIAGNOSTIC
-       copysize = 1 << indx < MAX_COPY ? 1 << indx : MAX_COPY;
-#endif
-       if (kbp->kb_next == NULL) {
-               int s;
-               kbp->kb_last = NULL;
-               if (size > MAXALLOCSAVE)
-                       allocsize = round_page(size);
-               else
-                       allocsize = 1 << indx;
-               npg = btoc(allocsize);
-               mutex_spin_exit(&malloc_lock);
-               s = splvm();
-               va = (void *) uvm_km_alloc(kmem_map,
-                   (vsize_t)ctob(npg), 0,
-                   ((flags & M_NOWAIT) ? UVM_KMF_NOWAIT : 0) |
-                   ((flags & M_CANFAIL) ? UVM_KMF_CANFAIL : 0) |
-                   UVM_KMF_WIRED);
-               splx(s);
-               if (__predict_false(va == NULL)) {
-                       /*
-                        * Kmem_malloc() can return NULL, even if it can
-                        * wait, if there is no map space available, because
-                        * it can't fix that problem.  Neither can we,
-                        * right now.  (We should release pages which
-                        * are completely free and which are in kmembuckets
-                        * with too many free elements.)
-                        */
-                       if ((flags & (M_NOWAIT|M_CANFAIL)) == 0)
-                               panic("malloc: out of space in kmem_map");
-                       return (NULL);
-               }
-               mutex_spin_enter(&malloc_lock);
-#ifdef KMEMSTATS
-               kbp->kb_total += kbp->kb_elmpercl;
-#endif
-               kup = btokup(va);
-               kup->ku_indx = indx;
-               if (allocsize > MAXALLOCSAVE) {
-                       if (npg > 65535)
-                               panic("malloc: allocation too large");
-                       kup->ku_pagecnt = npg;
-#ifdef KMEMSTATS
-                       ksp->ks_memuse += allocsize;
-#endif
-                       goto out;
-               }
-#ifdef KMEMSTATS
-               kup->ku_freecnt = kbp->kb_elmpercl;
-               kbp->kb_totalfree += kbp->kb_elmpercl;
-#endif
-               /*
-                * Just in case we blocked while allocating memory,
-                * and someone else also allocated memory for this
-                * kmembucket, don't assume the list is still empty.
-                */
-               savedlist = kbp->kb_next;
-               kbp->kb_next = cp = va + (npg << PAGE_SHIFT) - allocsize;
-               for (;;) {
-                       freep = (struct freelist *)cp;
-#ifdef DIAGNOSTIC
-                       /*
-                        * Copy in known text to detect modification
-                        * after freeing.
-                        */
-                       end = (uint32_t *)&cp[copysize];
-                       for (lp = (uint32_t *)cp; lp < end; lp++)
-                               *lp = WEIRD_ADDR;
-                       freep->type = M_FREE;
-#endif /* DIAGNOSTIC */
-                       if (cp <= va)
-                               break;
-                       cp -= allocsize;
-                       freep->next = cp;
-               }
-               freep->next = savedlist;
-               if (savedlist == NULL)
-                       kbp->kb_last = (void *)freep;
-       }
-       va = kbp->kb_next;
-       kbp->kb_next = ((struct freelist *)va)->next;
-#ifdef DIAGNOSTIC
-       freep = (struct freelist *)va;
-       /* XXX potential to get garbage pointer here. */
-       if (kbp->kb_next) {
-               int rv;
-               vaddr_t addr = (vaddr_t)kbp->kb_next;
-
-               vm_map_lock(kmem_map);
-               rv = uvm_map_checkprot(kmem_map, addr,
-                   addr + sizeof(struct freelist), VM_PROT_WRITE);
-               vm_map_unlock(kmem_map);
-
-               if (__predict_false(rv == 0)) {
-                       printf("Data modified on freelist: "
-                           "word %ld of object %p size %ld previous type %s "
-                           "(invalid addr %p)\n",
-                           (long)((int32_t *)&kbp->kb_next - (int32_t *)kbp),
-                           va, size, "foo", kbp->kb_next);
-#ifdef MALLOCLOG
-                       hitmlog(va);
-#endif
-                       kbp->kb_next = NULL;
-               }
-       }
-
-       /* Fill the fields that we've used with WEIRD_ADDR */
-#ifdef _LP64
-       freep->type = (struct malloc_type *)
-           (WEIRD_ADDR | (((u_long) WEIRD_ADDR) << 32));
-#else
-       freep->type = (struct malloc_type *) WEIRD_ADDR;
-#endif
-       end = (uint32_t *)&freep->next +
-           (sizeof(freep->next) / sizeof(int32_t));
-       for (lp = (uint32_t *)&freep->next; lp < end; lp++)
-               *lp = WEIRD_ADDR;
-
-       /* and check that the data hasn't been modified. */
-       end = (uint32_t *)&va[copysize];
-       for (lp = (uint32_t *)va; lp < end; lp++) {
-               if (__predict_true(*lp == WEIRD_ADDR))
-                       continue;
-               printf("Data modified on freelist: "
-                   "word %ld of object %p size %ld previous type %s "
-                   "(0x%x != 0x%x)\n",
-                   (long)(lp - (uint32_t *)va), va, size,
-                   "bar", *lp, WEIRD_ADDR);
-#ifdef MALLOCLOG
-               hitmlog(va);
-#endif
-               break;
+       if ((flags & M_ZERO) != 0) {
+               memset(p, 0, allocsize);
       }
+       mh = (void *)p;
+       mh->mh_size = allocsize;

-       freep->spare0 = 0;
-#endif /* DIAGNOSTIC */
-#ifdef KMEMSTATS
-       kup = btokup(va);
-       if (kup->ku_indx != indx)
-               panic("malloc: wrong bucket");
-       if (kup->ku_freecnt == 0)
-               panic("malloc: lost data");
-       kup->ku_freecnt--;
-       kbp->kb_totalfree--;
-       ksp->ks_memuse += 1 << indx;
-out:
-       kbp->kb_calls++;
-       ksp->ks_inuse++;
-       ksp->ks_calls++;
-       if (ksp->ks_memuse > ksp->ks_maxused)
-               ksp->ks_maxused = ksp->ks_memuse;
-#else
-out:
-#endif
-#ifdef MALLOCLOG
-       domlog(va, size, ksp, 1, file, line);
-#endif
-       mutex_spin_exit(&malloc_lock);
-       if ((flags & M_ZERO) != 0)
-               memset(va, 0, size);
-       FREECHECK_OUT(&malloc_freecheck, (void *)va);
-       return ((void *) va);
+       return mh + 1;
}

/*
@@ -552,145 +140,12 @@ void
kern_free(void *addr, struct malloc_type *ksp)
#endif /* MALLOCLOG */
{
-       struct kmembuckets *kbp;
-       struct kmemusage *kup;
-       struct freelist *freep;
-       long size;
-#ifdef DIAGNOSTIC
-       void *cp;
-       int32_t *end, *lp;
-       long alloc, copysize;
-#endif
+       struct malloc_header *mh;

-       FREECHECK_IN(&malloc_freecheck, addr);
-#ifdef MALLOC_DEBUG
-       if (debug_free(addr, ksp))
-               return;
-#endif
+       mh = addr;
+       mh--;

-#ifdef DIAGNOSTIC
-       /*
-        * Ensure that we're free'ing something that we could
-        * have allocated in the first place.  That is, check
-        * to see that the address is within kmem_map.
-        */
-       if (__predict_false((vaddr_t)addr < vm_map_min(kmem_map) ||
-           (vaddr_t)addr >= vm_map_max(kmem_map)))
-               panic("free: addr %p not within kmem_map", addr);
-#endif
-
-       kup = btokup(addr);
-       size = 1 << kup->ku_indx;
-       kbp = &kmembuckets[kup->ku_indx];
-
-       LOCKDEBUG_MEM_CHECK(addr,
-           size <= MAXALLOCSAVE ? size : ctob(kup->ku_pagecnt));
-
-       mutex_spin_enter(&malloc_lock);
-#ifdef MALLOCLOG
-       domlog(addr, 0, ksp, 2, file, line);
-#endif
-#ifdef DIAGNOSTIC
-       /*
-        * Check for returns of data that do not point to the
-        * beginning of the allocation.
-        */
-       if (size > PAGE_SIZE)
-               alloc = addrmask[BUCKETINDX(PAGE_SIZE)];
-       else
-               alloc = addrmask[kup->ku_indx];
-       if (((u_long)addr & alloc) != 0)
-               panic("free: unaligned addr %p, size %ld, type %s, mask %ld",
-                   addr, size, ksp->ks_shortdesc, alloc);
-#endif /* DIAGNOSTIC */
-       if (size > MAXALLOCSAVE) {
-               uvm_km_free(kmem_map, (vaddr_t)addr, ctob(kup->ku_pagecnt),
-                   UVM_KMF_WIRED);
-#ifdef KMEMSTATS
-               size = kup->ku_pagecnt << PGSHIFT;
-               ksp->ks_memuse -= size;
-#ifdef DIAGNOSTIC
-               if (ksp->ks_active[kup->ku_indx - MINBUCKET] == 0)
-                       panic("no active allocation(1), probably double free");
-#endif
-               ksp->ks_active[kup->ku_indx - MINBUCKET]--;
-               kup->ku_indx = 0;
-               kup->ku_pagecnt = 0;
-               if (ksp->ks_memuse + size >= ksp->ks_limit &&
-                   ksp->ks_memuse < ksp->ks_limit)
-                       wakeup((void *)ksp);
-#ifdef DIAGNOSTIC
-               if (ksp->ks_inuse == 0)
-                       panic("free 1: inuse 0, probable double free");
-#endif
-               ksp->ks_inuse--;
-               kbp->kb_total -= 1;
-#endif
-               mutex_spin_exit(&malloc_lock);
-               return;
-       }
-       freep = (struct freelist *)addr;
-#ifdef DIAGNOSTIC
-       /*
-        * Check for multiple frees. Use a quick check to see if
-        * it looks free before laboriously searching the freelist.
-        */
-       if (__predict_false(freep->spare0 == WEIRD_ADDR)) {
-               for (cp = kbp->kb_next; cp;
-                   cp = ((struct freelist *)cp)->next) {
-                       if (addr != cp)
-                               continue;
-                       printf("multiply freed item %p\n", addr);
-#ifdef MALLOCLOG
-                       hitmlog(addr);
-#endif
-                       panic("free: duplicated free");
-               }
-       }
-
-       /*
-        * Copy in known text to detect modification after freeing
-        * and to make it look free. Also, save the type being freed
-        * so we can list likely culprit if modification is detected
-        * when the object is reallocated.
-        */
-       copysize = size < MAX_COPY ? size : MAX_COPY;
-       end = (int32_t *)&((char *)addr)[copysize];
-       for (lp = (int32_t *)addr; lp < end; lp++)
-               *lp = WEIRD_ADDR;
-       freep->type = ksp;
-#endif /* DIAGNOSTIC */
-#ifdef KMEMSTATS
-       kup->ku_freecnt++;
-       if (kup->ku_freecnt >= kbp->kb_elmpercl) {
-               if (kup->ku_freecnt > kbp->kb_elmpercl)
-                       panic("free: multiple frees");
-               else if (kbp->kb_totalfree > kbp->kb_highwat)
-                       kbp->kb_couldfree++;
-       }
-       kbp->kb_totalfree++;
-       ksp->ks_memuse -= size;
-#ifdef DIAGNOSTIC
-       if (ksp->ks_active[kup->ku_indx - MINBUCKET] == 0)
-               panic("no active allocation(2), probably double free");
-#endif
-       ksp->ks_active[kup->ku_indx - MINBUCKET]--;
-       if (ksp->ks_memuse + size >= ksp->ks_limit &&
-           ksp->ks_memuse < ksp->ks_limit)
-               wakeup((void *)ksp);
-#ifdef DIAGNOSTIC
-       if (ksp->ks_inuse == 0)
-               panic("free 2: inuse 0, probable double free");
-#endif
-       ksp->ks_inuse--;
-#endif
-       if (kbp->kb_next == NULL)
-               kbp->kb_next = addr;
-       else
-               ((struct freelist *)kbp->kb_last)->next = addr;
-       freep->next = NULL;
-       kbp->kb_last = addr;
-       mutex_spin_exit(&malloc_lock);
+       kmem_intr_free(mh, mh->mh_size);
}

/*
@@ -700,12 +155,9 @@ void *
kern_realloc(void *curaddr, unsigned long newsize, struct malloc_type *ksp,
    int flags)
{
-       struct kmemusage *kup;
+       struct malloc_header *mh;
       unsigned long cursize;
       void *newaddr;
-#ifdef DIAGNOSTIC
-       long alloc;
-#endif

       /*
        * realloc() with a NULL pointer is the same as malloc().
@@ -727,30 +179,10 @@ kern_realloc(void *curaddr, unsigned lon
       }
#endif

-       /*
-        * Find out how large the old allocation was (and do some
-        * sanity checking).
-        */
-       kup = btokup(curaddr);
-       cursize = 1 << kup->ku_indx;
-
-#ifdef DIAGNOSTIC
-       /*
-        * Check for returns of data that do not point to the
-        * beginning of the allocation.
-        */
-       if (cursize > PAGE_SIZE)
-               alloc = addrmask[BUCKETINDX(PAGE_SIZE)];
-       else
-               alloc = addrmask[kup->ku_indx];
-       if (((u_long)curaddr & alloc) != 0)
-               panic("realloc: "
-                   "unaligned addr %p, size %ld, type %s, mask %ld\n",
-                   curaddr, cursize, ksp->ks_shortdesc, alloc);
-#endif /* DIAGNOSTIC */
+       mh = curaddr;
+       mh--;

-       if (cursize > MAXALLOCSAVE)
-               cursize = ctob(kup->ku_pagecnt);
+       cursize = mh->mh_size;

       /*
        * If we already actually have as much as they want, we're done.
@@ -782,28 +214,12 @@ kern_realloc(void *curaddr, unsigned lon
}

/*
- * Roundup size to the actual allocation size.
- */
-unsigned long
-malloc_roundup(unsigned long size)
-{
-
-       if (size > MAXALLOCSAVE)
-               return (roundup(size, PAGE_SIZE));
-       else
-               return (1 << BUCKETINDX(size));
-}
-
-/*
 * Add a malloc type to the system.
 */
void
malloc_type_attach(struct malloc_type *type)
{

-       if (nkmempages == 0)
-               panic("malloc_type_attach: nkmempages == 0");
-
       if (type->ks_magic != M_MAGIC)
               panic("malloc_type_attach: bad magic");

@@ -819,8 +235,6 @@ malloc_type_attach(struct malloc_type *t
#endif

#ifdef KMEMSTATS
-       if (type->ks_limit == 0)
-               type->ks_limit = ((u_long)nkmempages << PAGE_SHIFT) * 6U / 10U;
#else
       type->ks_limit = 0;
#endif
@@ -874,34 +288,6 @@ malloc_type_setlimit(struct malloc_type
}

/*
- * Compute the number of pages that kmem_map will map, that is,
- * the size of the kernel malloc arena.
- */
-void
-kmeminit_nkmempages(void)
-{
-       int npages;
-
-       if (nkmempages != 0) {
-               /*
-                * It's already been set (by us being here before, or
-                * by patching or kernel config options), bail out now.
-                */
-               return;
-       }
-
-       npages = physmem;
-
-       if (npages > NKMEMPAGES_MAX)
-               npages = NKMEMPAGES_MAX;
-
-       if (npages < NKMEMPAGES_MIN)
-               npages = NKMEMPAGES_MIN;
-
-       nkmempages = npages;
-}
-
-/*
 * Initialize the kernel memory allocator
 */
void
@@ -909,42 +295,12 @@ kmeminit(void)
{
       __link_set_decl(malloc_types, struct malloc_type);
       struct malloc_type * const *ksp;
-       vaddr_t kmb, kml;
#ifdef KMEMSTATS
       long indx;
#endif

-#if    ((MAXALLOCSAVE & (MAXALLOCSAVE - 1)) != 0)
-               ERROR!_kmeminit:_MAXALLOCSAVE_not_power_of_2
-#endif
-#if    (MAXALLOCSAVE > MINALLOCSIZE * 32768)
-               ERROR!_kmeminit:_MAXALLOCSAVE_too_big
-#endif
-#if    (MAXALLOCSAVE < NBPG)
-               ERROR!_kmeminit:_MAXALLOCSAVE_too_small
-#endif
-
-       if (sizeof(struct freelist) > (1 << MINBUCKET))
-               panic("minbucket too small/struct freelist too big");
-
       mutex_init(&malloc_lock, MUTEX_DEFAULT, IPL_VM);

-       /*
-        * Compute the number of kmem_map pages, if we have not
-        * done so already.
-        */
-       kmeminit_nkmempages();
-
-       kmemusage = (struct kmemusage *) uvm_km_alloc(kernel_map,
-           (vsize_t)(nkmempages * sizeof(struct kmemusage)), 0,
-           UVM_KMF_WIRED|UVM_KMF_ZERO);
-       kmb = 0;
-       kmem_map = uvm_km_suballoc(kernel_map, &kmb,
-           &kml, ((vsize_t)nkmempages << PAGE_SHIFT),
-           VM_MAP_INTRSAFE, false, &kmem_map_store);
-       uvm_km_vacache_init(kmem_map, "kvakmem", 0);
-       kmembase = (char *)kmb;
-       kmemlimit = (char *)kml;
#ifdef KMEMSTATS
       for (indx = 0; indx < MINBUCKET + 16; indx++) {
               if (1 << indx >= PAGE_SIZE)
Index: sys/kern/subr_extent.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_extent.c,v
retrieving revision 1.72
diff -u -p -r1.72 subr_extent.c
--- sys/kern/subr_extent.c      28 Apr 2008 20:24:04 -0000      1.72
+++ sys/kern/subr_extent.c      23 Jan 2012 22:02:13 -0000
@@ -41,7 +41,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_extent.

#include <sys/param.h>
#include <sys/extent.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/pool.h>
#include <sys/time.h>
#include <sys/systm.h>
@@ -69,15 +69,15 @@ __KERNEL_RCSID(0, "$NetBSD: subr_extent.
 * in subr_extent.c rather than subr_prf.c.
 */
#define        \
-malloc(s, t, flags)            malloc(s)
+kmem_alloc(s, flags)           malloc(s)
#define        \
-free(p, t)                     free(p)
+kmem_free(p, s)                        free(p)
#define        \
cv_wait_sig(cv, lock)          (EWOULDBLOCK)
#define        \
-pool_get(pool, flags)          malloc((pool)->pr_size,0,0)
+pool_get(pool, flags)          kmem_alloc((pool)->pr_size,0)
#define        \
-pool_put(pool, rp)             free(rp,0)
+pool_put(pool, rp)             kmem_free(rp,0)
#define        \
panic(a)                       printf(a)
#define        mutex_init(a, b, c)
@@ -127,13 +127,6 @@ extent_alloc_region_descriptor(struct ex
       int exflags, error;

       /*
-        * If the kernel memory allocator is not yet running, we can't
-        * use it (obviously).
-        */
-       if (KMEM_IS_RUNNING == 0)
-               flags &= ~EX_MALLOCOK;
-
-       /*
        * XXX Make a static, create-time flags word, so we don't
        * XXX have to lock to read it!
        */
@@ -235,7 +228,7 @@ extent_free_region_descriptor(struct ext
 */
struct extent *
extent_create(const char *name, u_long start, u_long end,
-    struct malloc_type *mtype, void *storage, size_t storagesize, int flags)
+    void *storage, size_t storagesize, int flags)
{
       struct extent *ex;
       char *cp = storage;
@@ -291,8 +284,8 @@ extent_create(const char *name, u_long s
                       LIST_INSERT_HEAD(&fex->fex_freelist, rp, er_link);
               }
       } else {
-               ex = (struct extent *)malloc(sizeof(struct extent),
-                   mtype, (flags & EX_WAITOK) ? M_WAITOK : M_NOWAIT);
+               ex = (struct extent *)kmem_alloc(sizeof(struct extent),
+                   (flags & EX_WAITOK) ? KM_SLEEP : KM_NOSLEEP);
               if (ex == NULL)
                       return (NULL);
       }
@@ -304,7 +297,6 @@ extent_create(const char *name, u_long s
       ex->ex_name = name;
       ex->ex_start = start;
       ex->ex_end = end;
-       ex->ex_mtype = mtype;
       ex->ex_flags = 0;
       if (fixed_extent)
               ex->ex_flags |= EXF_FIXED;
@@ -342,7 +334,7 @@ extent_destroy(struct extent *ex)

       /* If we're not a fixed extent, free the extent descriptor itself. */
       if ((ex->ex_flags & EXF_FIXED) == 0)
-               free(ex, ex->ex_mtype);
+               kmem_free(ex, sizeof(*ex));
}

/*
Index: sys/kern/subr_kmem.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_kmem.c,v
retrieving revision 1.38
diff -u -p -r1.38 subr_kmem.c
--- sys/kern/subr_kmem.c        20 Nov 2011 22:58:31 -0000      1.38
+++ sys/kern/subr_kmem.c        23 Jan 2012 22:02:13 -0000
@@ -58,8 +58,6 @@
/*
 * allocator of kernel wired memory.
 *
- * TODO:
- * -   worth to have "intrsafe" version?  maybe..
 */

#include <sys/cdefs.h>
@@ -68,7 +66,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_kmem.c,
#include <sys/param.h>
#include <sys/callback.h>
#include <sys/kmem.h>
-#include <sys/vmem.h>
+#include <sys/pool.h>
#include <sys/debug.h>
#include <sys/lockdebug.h>
#include <sys/cpu.h>
@@ -79,24 +77,51 @@ __KERNEL_RCSID(0, "$NetBSD: subr_kmem.c,

#include <lib/libkern/libkern.h>

-#define        KMEM_QUANTUM_SIZE       (ALIGNBYTES + 1)
-#define        KMEM_QCACHE_MAX         (KMEM_QUANTUM_SIZE * 32)
-#define        KMEM_CACHE_COUNT        16
-
-typedef struct kmem_cache {
-       pool_cache_t            kc_cache;
-       struct pool_allocator   kc_pa;
-       char                    kc_name[12];
-} kmem_cache_t;
+struct kmem_cache_info {
+       int kc_size;
+       const char *kc_name;
+};
+
+static const struct kmem_cache_info kmem_cache_sizes[] = {
+       {  8, "kmem-8" },
+       { 16, "kmem-16" },
+       { 24, "kmem-24" },
+       { 32, "kmem-32" },
+       { 40, "kmem-40" },
+       { 48, "kmem-48" },
+       { 56, "kmem-56" },
+       { 64, "kmem-64" },
+       { 80, "kmem-80" },
+       { 96, "kmem-96" },
+       { 112, "kmem-112" },
+       { 128, "kmem-128" },
+       { 160, "kmem-160" },
+       { 192, "kmem-192" },
+       { 224, "kmem-224" },
+       { 256, "kmem-256" },
+       { 320, "kmem-320" },
+       { 384, "kmem-384" },
+       { 448, "kmem-448" },
+       { 512, "kmem-512" },
+       { 768, "kmem-768" },
+       { 1024, "kmem-1024" },
+       { 2048, "kmem-2048" },
+       { 4096, "kmem-4096" },
+       { 0, NULL }
+};

-static vmem_t *kmem_arena;
-static struct callback_entry kmem_kva_reclaim_entry;
+/*
+ * KMEM_ALIGN is the smalles guaranteed alignment and
+ * also the smallest allocateable quanta.
+ * Every cache size which is a multiply of CACHE_LINE_SIZE
+ * gets CACHE_LINE_SIZE alignment.
+ */
+#define KMEM_ALIGN     8
+#define KMEM_SHIFT     3
+#define KMEM_MAXSIZE   4096

-static kmem_cache_t kmem_cache[KMEM_CACHE_COUNT + 1];
+static pool_cache_t kmem_cache[KMEM_MAXSIZE >> KMEM_SHIFT];
static size_t kmem_cache_max;
-static size_t kmem_cache_min;
-static size_t kmem_cache_mask;
-static int kmem_cache_shift;

#if defined(DEBUG)
int kmem_guard_depth = 0;
@@ -110,11 +135,12 @@ static void *kmem_freecheck;
#endif /* defined(DEBUG) */

#if defined(KMEM_POISON)
+static int kmem_poison_ctor(void *, void *, int);
static void kmem_poison_fill(void *, size_t);
static void kmem_poison_check(void *, size_t);
#else /* defined(KMEM_POISON) */
-#define        kmem_poison_fill(p, sz)         /* nothing */
-#define        kmem_poison_check(p, sz)        /* nothing */
+#define kmem_poison_fill(p, sz)                /* nothing */
+#define kmem_poison_check(p, sz)               /* nothing */
#endif /* defined(KMEM_POISON) */

#if defined(KMEM_REDZONE)
@@ -124,77 +150,30 @@ static void kmem_poison_check(void *, si
#endif /* defined(KMEM_REDZONE) */

#if defined(KMEM_SIZE)
-#define        SIZE_SIZE       (max(KMEM_QUANTUM_SIZE, sizeof(size_t)))
+#define        SIZE_SIZE       (max(KMEM_ALIGN, sizeof(size_t)))
static void kmem_size_set(void *, size_t);
-static void kmem_size_check(const void *, size_t);
+static void kmem_size_check(void *, size_t);
#else
#define        SIZE_SIZE       0
#define        kmem_size_set(p, sz)    /* nothing */
#define        kmem_size_check(p, sz)  /* nothing */
#endif

-static int kmem_backend_alloc(void *, vmem_size_t, vmem_size_t *,
-    vm_flag_t, vmem_addr_t *);
-static void kmem_backend_free(void *, vmem_addr_t, vmem_size_t);
-static int kmem_kva_reclaim_callback(struct callback_entry *, void *, void *);
-
CTASSERT(KM_SLEEP == PR_WAITOK);
CTASSERT(KM_NOSLEEP == PR_NOWAIT);

-static inline vm_flag_t
-kmf_to_vmf(km_flag_t kmflags)
-{
-       vm_flag_t vmflags;
-
-       KASSERT((kmflags & (KM_SLEEP|KM_NOSLEEP)) != 0);
-       KASSERT((~kmflags & (KM_SLEEP|KM_NOSLEEP)) != 0);
-
-       vmflags = 0;
-       if ((kmflags & KM_SLEEP) != 0) {
-               vmflags |= VM_SLEEP;
-       }
-       if ((kmflags & KM_NOSLEEP) != 0) {
-               vmflags |= VM_NOSLEEP;
-       }
-
-       return vmflags;
-}
-
-static void *
-kmem_poolpage_alloc(struct pool *pool, int prflags)
-{
-       vmem_addr_t addr;
-       int rc;
-
-       rc = vmem_alloc(kmem_arena, pool->pr_alloc->pa_pagesz,
-           kmf_to_vmf(prflags) | VM_INSTANTFIT, &addr);
-       return (rc == 0) ? (void *)addr : NULL;
-
-}
-
-static void
-kmem_poolpage_free(struct pool *pool, void *addr)
-{
-
-       vmem_free(kmem_arena, (vmem_addr_t)addr, pool->pr_alloc->pa_pagesz);
-}
-
-/* ---- kmem API */
-
-/*
- * kmem_alloc: allocate wired memory.
- *
- * => must not be called from interrupt context.
- */
+void * kmem_intr_alloc(size_t size, km_flag_t kmflags);
+void * kmem_intr_zalloc(size_t size, km_flag_t kmflags);
+void kmem_intr_free(void *, size_t size);

void *
-kmem_alloc(size_t size, km_flag_t kmflags)
+kmem_intr_alloc(size_t size, km_flag_t kmflags)
{
-       kmem_cache_t *kc;
+       size_t index;
+       size_t allocsz;
+       pool_cache_t pc;
       uint8_t *p;

-       KASSERT(!cpu_intr_p());
-       KASSERT(!cpu_softintr_p());
       KASSERT(size > 0);

#ifdef KMEM_GUARD
@@ -204,61 +183,48 @@ kmem_alloc(size_t size, km_flag_t kmflag
       }
#endif

-       size += REDZONE_SIZE + SIZE_SIZE;
-       if (size >= kmem_cache_min && size <= kmem_cache_max) {
-               kc = &kmem_cache[(size + kmem_cache_mask) >> kmem_cache_shift];
-               KASSERT(size <= kc->kc_pa.pa_pagesz);
-               kmflags &= (KM_SLEEP | KM_NOSLEEP);
-               p = pool_cache_get(kc->kc_cache, kmflags);
+       allocsz = kmem_roundup_size(size) + REDZONE_SIZE + SIZE_SIZE;
+       if ((index = ((allocsz - 1) >> KMEM_SHIFT))
+           < kmem_cache_max >> KMEM_SHIFT) {
+               pc = kmem_cache[index];
       } else {
-               vmem_addr_t addr;
-
-               if (vmem_alloc(kmem_arena, size,
-                   kmf_to_vmf(kmflags) | VM_INSTANTFIT, &addr) == 0)
-                       p = (void *)addr;
-               else
-                       p = NULL;
+               int rc;
+               rc = uvm_km_kmem_alloc(kmem_va_arena,
+                   (vsize_t)round_page(allocsz),
+                   ((kmflags & KM_SLEEP) ? VM_SLEEP : VM_NOSLEEP)
+                    | VM_INSTANTFIT, (vmem_addr_t *)&p);
+               return (rc != 0) ? NULL : p;
       }
+
+       p = pool_cache_get(pc, kmflags);
+
       if (__predict_true(p != NULL)) {
               kmem_poison_check(p, kmem_roundup_size(size));
               FREECHECK_OUT(&kmem_freecheck, p);
-               kmem_size_set(p, size);
-               p = (uint8_t *)p + SIZE_SIZE;
+               kmem_size_set(p, allocsz);
       }
       return p;
}

-/*
- * kmem_zalloc: allocate wired memory.
- *
- * => must not be called from interrupt context.
- */
-
void *
-kmem_zalloc(size_t size, km_flag_t kmflags)
+kmem_intr_zalloc(size_t size, km_flag_t kmflags)
{
       void *p;

-       p = kmem_alloc(size, kmflags);
+       p = kmem_intr_alloc(size, kmflags);
       if (p != NULL) {
               memset(p, 0, size);
       }
       return p;
}

-/*
- * kmem_free: free wired memory allocated by kmem_alloc.
- *
- * => must not be called from interrupt context.
- */
-
void
-kmem_free(void *p, size_t size)
+kmem_intr_free(void *p, size_t size)
{
-       kmem_cache_t *kc;
+       size_t index;
+       size_t allocsz;
+       pool_cache_t pc;

-       KASSERT(!cpu_intr_p());
-       KASSERT(!cpu_softintr_p());
       KASSERT(p != NULL);
       KASSERT(size > 0);

@@ -268,128 +234,135 @@ kmem_free(void *p, size_t size)
               return;
       }
#endif
-       size += SIZE_SIZE;
-       p = (uint8_t *)p - SIZE_SIZE;
-       kmem_size_check(p, size + REDZONE_SIZE);
-       FREECHECK_IN(&kmem_freecheck, p);
-       LOCKDEBUG_MEM_CHECK(p, size);
-       kmem_poison_check((char *)p + size,
-           kmem_roundup_size(size + REDZONE_SIZE) - size);
-       kmem_poison_fill(p, size);
-       size += REDZONE_SIZE;
-       if (size >= kmem_cache_min && size <= kmem_cache_max) {
-               kc = &kmem_cache[(size + kmem_cache_mask) >> kmem_cache_shift];
-               KASSERT(size <= kc->kc_pa.pa_pagesz);
-               pool_cache_put(kc->kc_cache, p);
+
+       allocsz = kmem_roundup_size(size) + REDZONE_SIZE + SIZE_SIZE;
+       if ((index = ((allocsz - 1) >> KMEM_SHIFT))
+           < kmem_cache_max >> KMEM_SHIFT) {
+               pc = kmem_cache[index];
       } else {
-               vmem_free(kmem_arena, (vmem_addr_t)p, size);
+               uvm_km_kmem_free(kmem_va_arena, (vaddr_t)p,
+                   round_page(allocsz));
+               return;
       }
+
+       kmem_size_check(p, allocsz);
+       FREECHECK_IN(&kmem_freecheck, p);
+       LOCKDEBUG_MEM_CHECK(p, allocsz - (REDZONE_SIZE + SIZE_SIZE));
+       kmem_poison_check((uint8_t *)p + size, allocsz - size - SIZE_SIZE);
+       kmem_poison_fill(p, allocsz);
+
+       pool_cache_put(pc, p);
}


-void
-kmem_init(void)
-{
-       kmem_cache_t *kc;
-       size_t sz;
-       int i;
+/* ---- kmem API */

-#ifdef KMEM_GUARD
-       uvm_kmguard_init(&kmem_guard, &kmem_guard_depth, &kmem_guard_size,
-           kernel_map);
-#endif
+/*
+ * kmem_alloc: allocate wired memory.
+ * => must not be called from interrupt context.
+ */

-       kmem_arena = vmem_create("kmem", 0, 0, KMEM_QUANTUM_SIZE,
-           kmem_backend_alloc, kmem_backend_free, NULL, KMEM_QCACHE_MAX,
-           VM_SLEEP, IPL_NONE);
-       callback_register(&vm_map_to_kernel(kernel_map)->vmk_reclaim_callback,
-           &kmem_kva_reclaim_entry, kmem_arena, kmem_kva_reclaim_callback);
-
-       /*
-        * kmem caches start at twice the size of the largest vmem qcache
-        * and end at PAGE_SIZE or earlier.  assert that KMEM_QCACHE_MAX
-        * is a power of two.
-        */
-       KASSERT(ffs(KMEM_QCACHE_MAX) != 0);
-       KASSERT(KMEM_QCACHE_MAX - (1 << (ffs(KMEM_QCACHE_MAX) - 1)) == 0);
-       kmem_cache_shift = ffs(KMEM_QCACHE_MAX);
-       kmem_cache_min = 1 << kmem_cache_shift;
-       kmem_cache_mask = kmem_cache_min - 1;
-       for (i = 1; i <= KMEM_CACHE_COUNT; i++) {
-               sz = i << kmem_cache_shift;
-               if (sz > PAGE_SIZE) {
-                       break;
-               }
-               kmem_cache_max = sz;
-               kc = &kmem_cache[i];
-               kc->kc_pa.pa_pagesz = sz;
-               kc->kc_pa.pa_alloc = kmem_poolpage_alloc;
-               kc->kc_pa.pa_free = kmem_poolpage_free;
-               sprintf(kc->kc_name, "kmem-%zu", sz);
-               kc->kc_cache = pool_cache_init(sz,
-                   KMEM_QUANTUM_SIZE, 0, PR_NOALIGN | PR_NOTOUCH,
-                   kc->kc_name, &kc->kc_pa, IPL_NONE,
-                   NULL, NULL, NULL);
-               KASSERT(kc->kc_cache != NULL);
-       }
+void *
+kmem_alloc(size_t size, km_flag_t kmflags)
+{
+
+       KASSERT(!cpu_intr_p());
+       KASSERT(!cpu_softintr_p());
+       return kmem_intr_alloc(size, kmflags);
}

-size_t
-kmem_roundup_size(size_t size)
+/*
+ * kmem_zalloc: allocate zeroed wired memory.
+ * => must not be called from interrupt context.
+ */
+
+void *
+kmem_zalloc(size_t size, km_flag_t kmflags)
{

-       return vmem_roundup_size(kmem_arena, size);
+       KASSERT(!cpu_intr_p());
+       KASSERT(!cpu_softintr_p());
+       return kmem_intr_zalloc(size, kmflags);
}

-/* ---- uvm glue */
+/*
+ * kmem_free: free wired memory allocated by kmem_alloc.
+ * => must not be called from interrupt context.
+ */

-static int
-kmem_backend_alloc(void *dummy, vmem_size_t size, vmem_size_t *resultsize,
-    vm_flag_t vmflags, vmem_addr_t *addrp)
+void
+kmem_free(void *p, size_t size)
{
-       uvm_flag_t uflags;
-       vaddr_t va;

-       KASSERT(dummy == NULL);
-       KASSERT(size != 0);
-       KASSERT((vmflags & (VM_SLEEP|VM_NOSLEEP)) != 0);
-       KASSERT((~vmflags & (VM_SLEEP|VM_NOSLEEP)) != 0);
+       KASSERT(!cpu_intr_p());
+       KASSERT(!cpu_softintr_p());
+       kmem_intr_free(p, size);
+}

-       if ((vmflags & VM_NOSLEEP) != 0) {
-               uflags = UVM_KMF_TRYLOCK | UVM_KMF_NOWAIT;
-       } else {
-               uflags = UVM_KMF_WAITVA;
+static void
+kmem_create_caches(const struct kmem_cache_info *array,
+    pool_cache_t alloc_table[], size_t maxsize)
+{
+       size_t table_unit = (1 << KMEM_SHIFT);
+       size_t size = table_unit;
+       int i;
+
+       for (i = 0; array[i].kc_size != 0 ; i++) {
+               size_t cache_size = array[i].kc_size;
+               size_t align;
+
+               if ((cache_size & (CACHE_LINE_SIZE - 1)) == 0)
+                       align = CACHE_LINE_SIZE;
+               else if ((cache_size & (PAGE_SIZE - 1)) == 0)
+                       align = PAGE_SIZE;
+               else
+                       align = KMEM_ALIGN;
+
+               const char *name = array[i].kc_name;
+               pool_cache_t pc;
+               int flags = PR_NOALIGN;
+               if (cache_size < CACHE_LINE_SIZE)
+                       flags |= PR_NOTOUCH;
+
+               /* check if we reached the requested size */
+               if (cache_size > maxsize)
+                       break;
+
+               kmem_cache_max = cache_size;
+
+#if defined(KMEM_POISON)
+               pc = pool_cache_init(cache_size, align, 0, flags,
+                   name, &pool_allocator_kmem, IPL_VM, kmem_poison_ctor,
+                   NULL, (void *)cache_size);
+#else /* defined(KMEM_POISON) */
+               pc = pool_cache_init(cache_size, align, 0, flags,
+                   name, &pool_allocator_kmem, IPL_VM, NULL, NULL, NULL);
+#endif /* defined(KMEM_POISON) */
+
+               while (size <= cache_size) {
+                       alloc_table[(size - 1) >> KMEM_SHIFT] = pc;
+                       size += table_unit;
+               }
       }
-       *resultsize = size = round_page(size);
-       va = uvm_km_alloc(kernel_map, size, 0,
-           uflags | UVM_KMF_WIRED | UVM_KMF_CANFAIL);
-       if (va == 0)
-               return ENOMEM;
-       kmem_poison_fill((void *)va, size);
-       *addrp = (vmem_addr_t)va;
-       return 0;
}

-static void
-kmem_backend_free(void *dummy, vmem_addr_t addr, vmem_size_t size)
+void
+kmem_init(void)
{

-       KASSERT(dummy == NULL);
-       KASSERT(addr != 0);
-       KASSERT(size != 0);
-       KASSERT(size == round_page(size));
+#ifdef KMEM_GUARD
+       uvm_kmguard_init(&kmem_guard, &kmem_guard_depth, &kmem_guard_size,
+               kernel_map);
+#endif

-       kmem_poison_check((void *)addr, size);
-       uvm_km_free(kernel_map, (vaddr_t)addr, size, UVM_KMF_WIRED);
+       kmem_create_caches(kmem_cache_sizes, kmem_cache, KMEM_MAXSIZE);
}

-static int
-kmem_kva_reclaim_callback(struct callback_entry *ce, void *obj, void *arg)
+size_t
+kmem_roundup_size(size_t size)
{
-       vmem_t *vm = obj;

-       vmem_reap(vm);
-       return CALLBACK_CHAIN_CONTINUE;
+       return (size + (KMEM_ALIGN - 1)) & ~(KMEM_ALIGN - 1);
}

/* ---- debug */
@@ -397,17 +370,27 @@ kmem_kva_reclaim_callback(struct callbac
#if defined(KMEM_POISON)

#if defined(_LP64)
-#define        PRIME   0x9e37fffffffc0001UL
+#define PRIME 0x9e37fffffffc0000UL
#else /* defined(_LP64) */
-#define        PRIME   0x9e3779b1
+#define PRIME 0x9e3779b1
#endif /* defined(_LP64) */

static inline uint8_t
kmem_poison_pattern(const void *p)
{

-       return (uint8_t)((((uintptr_t)p) * PRIME)
-           >> ((sizeof(uintptr_t) - sizeof(uint8_t))) * CHAR_BIT);
+       return (uint8_t)(((uintptr_t)p) * PRIME
+          >> ((sizeof(uintptr_t) - sizeof(uint8_t))) * CHAR_BIT);
+}
+
+static int
+kmem_poison_ctor(void *arg, void *obj, int flag)
+{
+       size_t sz = (size_t)arg;
+
+       kmem_poison_fill(obj, sz);
+
+       return 0;
}

static void
@@ -437,7 +420,7 @@ kmem_poison_check(void *p, size_t sz)

               if (*cp != expected) {
                       panic("%s: %p: 0x%02x != 0x%02x\n",
-                           __func__, cp, *cp, expected);
+                          __func__, cp, *cp, expected);
               }
               cp++;
       }
@@ -449,16 +432,20 @@ kmem_poison_check(void *p, size_t sz)
static void
kmem_size_set(void *p, size_t sz)
{
+       void *szp;

-       memcpy(p, &sz, sizeof(sz));
+       szp = (uint8_t *)p + sz - SIZE_SIZE;
+       memcpy(szp, &sz, sizeof(sz));
}

static void
-kmem_size_check(const void *p, size_t sz)
+kmem_size_check(void *p, size_t sz)
{
+       uint8_t *szp;
       size_t psz;

-       memcpy(&psz, p, sizeof(psz));
+       szp = (uint8_t *)p + sz - SIZE_SIZE;
+       memcpy(&psz, szp, sizeof(psz));
       if (psz != sz) {
               panic("kmem_free(%p, %zu) != allocated size %zu",
                   (const uint8_t *)p + SIZE_SIZE, sz - SIZE_SIZE, psz);
Index: sys/kern/subr_percpu.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_percpu.c,v
retrieving revision 1.15
diff -u -p -r1.15 subr_percpu.c
--- sys/kern/subr_percpu.c      2 Sep 2011 22:25:08 -0000       1.15
+++ sys/kern/subr_percpu.c      23 Jan 2012 22:02:13 -0000
@@ -161,7 +161,7 @@ percpu_cpu_enlarge(size_t size)
 */

static int
-percpu_backend_alloc(void *dummy, vmem_size_t size, vmem_size_t *resultsize,
+percpu_backend_alloc(vmem_t *dummy, vmem_size_t size, vmem_size_t *resultsize,
    vm_flag_t vmflags, vmem_addr_t *addrp)
{
       unsigned int offset;
@@ -218,7 +218,7 @@ percpu_init(void)
       mutex_init(&percpu_allocation_lock, MUTEX_DEFAULT, IPL_NONE);
       percpu_nextoff = PERCPU_QUANTUM_SIZE;

-       percpu_offset_arena = vmem_create("percpu", 0, 0, PERCPU_QUANTUM_SIZE,
+       percpu_offset_arena = vmem_xcreate("percpu", 0, 0, PERCPU_QUANTUM_SIZE,
           percpu_backend_alloc, NULL, NULL, PERCPU_QCACHE_MAX, VM_SLEEP,
           IPL_NONE);
}
Index: sys/kern/subr_pool.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_pool.c,v
retrieving revision 1.190
diff -u -p -r1.190 subr_pool.c
--- sys/kern/subr_pool.c        27 Sep 2011 01:02:39 -0000      1.190
+++ sys/kern/subr_pool.c        23 Jan 2012 22:02:14 -0000
@@ -46,6 +46,7 @@ __KERNEL_RCSID(0, "$NetBSD: subr_pool.c,
#include <sys/errno.h>
#include <sys/kernel.h>
#include <sys/malloc.h>
+#include <sys/vmem.h>
#include <sys/pool.h>
#include <sys/syslog.h>
#include <sys/debug.h>
@@ -55,9 +56,6 @@ __KERNEL_RCSID(0, "$NetBSD: subr_pool.c,
#include <sys/atomic.h>

#include <uvm/uvm_extern.h>
-#ifdef DIAGNOSTIC
-#include <uvm/uvm_km.h>        /* uvm_km_va_drain */
-#endif

/*
 * Pool resource management utility.
@@ -86,16 +84,14 @@ static struct pool phpool[PHPOOL_MAX];
static struct pool psppool;
#endif

-static SLIST_HEAD(, pool_allocator) pa_deferinitq =
-    SLIST_HEAD_INITIALIZER(pa_deferinitq);
-
static void *pool_page_alloc_meta(struct pool *, int);
static void pool_page_free_meta(struct pool *, void *);

/* allocator for pool metadata */
struct pool_allocator pool_allocator_meta = {
-       pool_page_alloc_meta, pool_page_free_meta,
-       .pa_backingmapptr = &kmem_map,
+       .pa_alloc = pool_page_alloc_meta,
+       .pa_free = pool_page_free_meta,
+       .pa_pagesz = 0
};

/* # of seconds to retain page after last use */
@@ -529,108 +525,59 @@ pr_rmpage(struct pool *pp, struct pool_i
       pool_update_curpage(pp);
}

-static bool
-pa_starved_p(struct pool_allocator *pa)
-{
-
-       if (pa->pa_backingmap != NULL) {
-               return vm_map_starved_p(pa->pa_backingmap);
-       }
-       return false;
-}
-
-static int
-pool_reclaim_callback(struct callback_entry *ce, void *obj, void *arg)
-{
-       struct pool *pp = obj;
-       struct pool_allocator *pa = pp->pr_alloc;
-
-       KASSERT(&pp->pr_reclaimerentry == ce);
-       pool_reclaim(pp);
-       if (!pa_starved_p(pa)) {
-               return CALLBACK_CHAIN_ABORT;
-       }
-       return CALLBACK_CHAIN_CONTINUE;
-}
-
-static void
-pool_reclaim_register(struct pool *pp)
-{
-       struct vm_map *map = pp->pr_alloc->pa_backingmap;
-       int s;
-
-       if (map == NULL) {
-               return;
-       }
-
-       s = splvm(); /* not necessary for INTRSAFE maps, but don't care. */
-       callback_register(&vm_map_to_kernel(map)->vmk_reclaim_callback,
-           &pp->pr_reclaimerentry, pp, pool_reclaim_callback);
-       splx(s);
-
-#ifdef DIAGNOSTIC
-       /* Diagnostic drain attempt. */
-       uvm_km_va_drain(map, 0);
-#endif
-}
-
-static void
-pool_reclaim_unregister(struct pool *pp)
-{
-       struct vm_map *map = pp->pr_alloc->pa_backingmap;
-       int s;
-
-       if (map == NULL) {
-               return;
-       }
-
-       s = splvm(); /* not necessary for INTRSAFE maps, but don't care. */
-       callback_unregister(&vm_map_to_kernel(map)->vmk_reclaim_callback,
-           &pp->pr_reclaimerentry);
-       splx(s);
-}
-
-static void
-pa_reclaim_register(struct pool_allocator *pa)
-{
-       struct vm_map *map = *pa->pa_backingmapptr;
-       struct pool *pp;
-
-       KASSERT(pa->pa_backingmap == NULL);
-       if (map == NULL) {
-               SLIST_INSERT_HEAD(&pa_deferinitq, pa, pa_q);
-               return;
-       }
-       pa->pa_backingmap = map;
-       TAILQ_FOREACH(pp, &pa->pa_list, pr_alloc_list) {
-               pool_reclaim_register(pp);
-       }
-}
-
/*
 * Initialize all the pools listed in the "pools" link set.
 */
void
pool_subsystem_init(void)
{
-       struct pool_allocator *pa;
+       int idx;
+       size_t size;

       mutex_init(&pool_head_lock, MUTEX_DEFAULT, IPL_NONE);
       mutex_init(&pool_allocator_lock, MUTEX_DEFAULT, IPL_NONE);
       cv_init(&pool_busy, "poolbusy");

-       while ((pa = SLIST_FIRST(&pa_deferinitq)) != NULL) {
-               KASSERT(pa->pa_backingmapptr != NULL);
-               KASSERT(*pa->pa_backingmapptr != NULL);
-               SLIST_REMOVE_HEAD(&pa_deferinitq, pa_q);
-               pa_reclaim_register(pa);
+       /*
+        * Initialize private page header pool and cache magazine pool if we
+        * haven't done so yet.
+        */
+       for (idx = 0; idx < PHPOOL_MAX; idx++) {
+               static char phpool_names[PHPOOL_MAX][6+1+6+1];
+               int nelem;
+               size_t sz;
+
+               nelem = PHPOOL_FREELIST_NELEM(idx);
+               snprintf(phpool_names[idx], sizeof(phpool_names[idx]),
+                   "phpool-%d", nelem);
+               sz = sizeof(struct pool_item_header);
+               if (nelem) {
+                       sz = offsetof(struct pool_item_header,
+                           ph_bitmap[howmany(nelem, BITMAP_SIZE)]);
+               }
+               pool_init(&phpool[idx], sz, 0, 0, 0,
+                   phpool_names[idx], &pool_allocator_meta, IPL_VM);
       }
+#ifdef POOL_SUBPAGE
+       pool_init(&psppool, POOL_SUBPAGE, POOL_SUBPAGE, 0,
+           PR_RECURSIVE, "psppool", &pool_allocator_meta, IPL_VM);
+#endif
+
+       size = sizeof(pcg_t) +
+           (PCG_NOBJECTS_NORMAL - 1) * sizeof(pcgpair_t);
+       pool_init(&pcg_normal_pool, size, coherency_unit, 0, 0,
+           "pcgnormal", &pool_allocator_meta, IPL_VM);
+
+       size = sizeof(pcg_t) +
+           (PCG_NOBJECTS_LARGE - 1) * sizeof(pcgpair_t);
+       pool_init(&pcg_large_pool, size, coherency_unit, 0, 0,
+           "pcglarge", &pool_allocator_meta, IPL_VM);

       pool_init(&cache_pool, sizeof(struct pool_cache), coherency_unit,
-           0, 0, "pcache", &pool_allocator_nointr, IPL_NONE);
+           0, 0, "pcache", &pool_allocator_meta, IPL_NONE);

       pool_init(&cache_cpu_pool, sizeof(pool_cache_cpu_t), coherency_unit,
-           0, 0, "pcachecpu", &pool_allocator_nointr, IPL_NONE);
+           0, 0, "pcachecpu", &pool_allocator_meta, IPL_NONE);
}

/*
@@ -688,10 +635,6 @@ pool_init(struct pool *pp, size_t size,
               mutex_init(&palloc->pa_lock, MUTEX_DEFAULT, IPL_VM);
               palloc->pa_pagemask = ~(palloc->pa_pagesz - 1);
               palloc->pa_pageshift = ffs(palloc->pa_pagesz) - 1;
-
-               if (palloc->pa_backingmapptr != NULL) {
-                       pa_reclaim_register(palloc);
-               }
       }
       if (!cold)
               mutex_exit(&pool_allocator_lock);
@@ -826,45 +769,6 @@ pool_init(struct pool *pp, size_t size,
       cv_init(&pp->pr_cv, wchan);
       pp->pr_ipl = ipl;

-       /*
-        * Initialize private page header pool and cache magazine pool if we
-        * haven't done so yet.
-        * XXX LOCKING.
-        */
-       if (phpool[0].pr_size == 0) {
-               int idx;
-               for (idx = 0; idx < PHPOOL_MAX; idx++) {
-                       static char phpool_names[PHPOOL_MAX][6+1+6+1];
-                       int nelem;
-                       size_t sz;
-
-                       nelem = PHPOOL_FREELIST_NELEM(idx);
-                       snprintf(phpool_names[idx], sizeof(phpool_names[idx]),
-                           "phpool-%d", nelem);
-                       sz = sizeof(struct pool_item_header);
-                       if (nelem) {
-                               sz = offsetof(struct pool_item_header,
-                                   ph_bitmap[howmany(nelem, BITMAP_SIZE)]);
-                       }
-                       pool_init(&phpool[idx], sz, 0, 0, 0,
-                           phpool_names[idx], &pool_allocator_meta, IPL_VM);
-               }
-#ifdef POOL_SUBPAGE
-               pool_init(&psppool, POOL_SUBPAGE, POOL_SUBPAGE, 0,
-                   PR_RECURSIVE, "psppool", &pool_allocator_meta, IPL_VM);
-#endif
-
-               size = sizeof(pcg_t) +
-                   (PCG_NOBJECTS_NORMAL - 1) * sizeof(pcgpair_t);
-               pool_init(&pcg_normal_pool, size, coherency_unit, 0, 0,
-                   "pcgnormal", &pool_allocator_meta, IPL_VM);
-
-               size = sizeof(pcg_t) +
-                   (PCG_NOBJECTS_LARGE - 1) * sizeof(pcgpair_t);
-               pool_init(&pcg_large_pool, size, coherency_unit, 0, 0,
-                   "pcglarge", &pool_allocator_meta, IPL_VM);
-       }
-
       /* Insert into the list of all pools. */
       if (!cold)
               mutex_enter(&pool_head_lock);
@@ -885,8 +789,6 @@ pool_init(struct pool *pp, size_t size,
       TAILQ_INSERT_TAIL(&palloc->pa_list, pp, pr_alloc_list);
       if (!cold)
               mutex_exit(&palloc->pa_lock);
-
-       pool_reclaim_register(pp);
}

/*
@@ -908,7 +810,6 @@ pool_destroy(struct pool *pp)
       mutex_exit(&pool_head_lock);

       /* Remove this pool from its allocator's list of pools. */
-       pool_reclaim_unregister(pp);
       mutex_enter(&pp->pr_alloc->pa_lock);
       TAILQ_REMOVE(&pp->pr_alloc->pa_list, pp, pr_alloc_list);
       mutex_exit(&pp->pr_alloc->pa_lock);
@@ -1674,8 +1575,7 @@ pool_reclaim(struct pool *pp)
                       break;

               KASSERT(ph->ph_nmissing == 0);
-               if (curtime - ph->ph_time < pool_inactive_time
-                   && !pa_starved_p(pp->pr_alloc))
+               if (curtime - ph->ph_time < pool_inactive_time)
                       continue;

               /*
@@ -2157,6 +2057,19 @@ pool_cache_bootstrap(pool_cache_t pc, si
void
pool_cache_destroy(pool_cache_t pc)
{
+
+       pool_cache_bootstrap_destroy(pc);
+       pool_put(&cache_pool, pc);
+}
+
+/*
+ * pool_cache_bootstrap_destroy:
+ *
+ *     Destroy a pool cache.
+ */
+void
+pool_cache_bootstrap_destroy(pool_cache_t pc)
+{
       struct pool *pp = &pc->pc_pool;
       u_int i;

@@ -2182,7 +2095,6 @@ pool_cache_destroy(pool_cache_t pc)
       /* Finally, destroy it. */
       mutex_destroy(&pc->pc_lock);
       pool_destroy(pp);
-       pool_put(&cache_pool, pc);
}

/*
@@ -2806,13 +2718,13 @@ void    pool_page_free(struct pool *, void

#ifdef POOL_SUBPAGE
struct pool_allocator pool_allocator_kmem_fullpage = {
-       pool_page_alloc, pool_page_free, 0,
-       .pa_backingmapptr = &kmem_map,
+       pool_page_alloc, pool_page_free, 0
};
#else
struct pool_allocator pool_allocator_kmem = {
-       pool_page_alloc, pool_page_free, 0,
-       .pa_backingmapptr = &kmem_map,
+       .pa_alloc = pool_page_alloc,
+       .pa_free = pool_page_free,
+       .pa_pagesz = 0
};
#endif

@@ -2822,12 +2734,12 @@ void    pool_page_free_nointr(struct pool *
#ifdef POOL_SUBPAGE
struct pool_allocator pool_allocator_nointr_fullpage = {
       pool_page_alloc_nointr, pool_page_free_nointr, 0,
-       .pa_backingmapptr = &kernel_map,
};
#else
struct pool_allocator pool_allocator_nointr = {
-       pool_page_alloc_nointr, pool_page_free_nointr, 0,
-       .pa_backingmapptr = &kernel_map,
+       .pa_alloc = pool_page_alloc,
+       .pa_free = pool_page_free,
+       .pa_pagesz = 0
};
#endif

@@ -2837,7 +2749,6 @@ void      pool_subpage_free(struct pool *, vo

struct pool_allocator pool_allocator_kmem = {
       pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE,
-       .pa_backingmapptr = &kmem_map,
};

void   *pool_subpage_alloc_nointr(struct pool *, int);
@@ -2845,7 +2756,6 @@ void      pool_subpage_free_nointr(struct poo

struct pool_allocator pool_allocator_nointr = {
       pool_subpage_alloc, pool_subpage_free, POOL_SUBPAGE,
-       .pa_backingmapptr = &kmem_map,
};
#endif /* POOL_SUBPAGE */

@@ -2882,30 +2792,48 @@ void *
pool_page_alloc(struct pool *pp, int flags)
{
       bool waitok = (flags & PR_WAITOK) ? true : false;
+       int rc;
+       vmem_addr_t va;
+
+       rc = uvm_km_kmem_alloc(kmem_va_arena,
+           pp->pr_alloc->pa_pagesz,
+           ((waitok ? VM_SLEEP : VM_NOSLEEP) | VM_INSTANTFIT), &va);

-       return ((void *) uvm_km_alloc_poolpage_cache(kmem_map, waitok));
+       if (rc != 0)
+               return NULL;
+       else
+               return (void *)va;
}

void
pool_page_free(struct pool *pp, void *v)
{

-       uvm_km_free_poolpage_cache(kmem_map, (vaddr_t) v);
+       uvm_km_kmem_free(kmem_va_arena, (vaddr_t)v, pp->pr_alloc->pa_pagesz);
}

static void *
pool_page_alloc_meta(struct pool *pp, int flags)
{
       bool waitok = (flags & PR_WAITOK) ? true : false;
+       int rc;
+       vmem_addr_t addr;
+
+       rc = vmem_alloc(kmem_meta_arena, pp->pr_alloc->pa_pagesz,
+           (waitok ? VM_SLEEP : VM_NOSLEEP) | VM_INSTANTFIT, &addr);

-       return ((void *) uvm_km_alloc_poolpage(kmem_map, waitok));
+       if (rc != 0)
+               return 0;
+       else
+               return (void *)addr;
}

static void
pool_page_free_meta(struct pool *pp, void *v)
{

-       uvm_km_free_poolpage(kmem_map, (vaddr_t) v);
+       vmem_free(kmem_meta_arena, (vmem_addr_t)v,
+           pp->pr_alloc->pa_pagesz);
}

#ifdef POOL_SUBPAGE
@@ -2937,20 +2865,6 @@ pool_subpage_free_nointr(struct pool *pp
       pool_subpage_free(pp, v);
}
#endif /* POOL_SUBPAGE */
-void *
-pool_page_alloc_nointr(struct pool *pp, int flags)
-{
-       bool waitok = (flags & PR_WAITOK) ? true : false;
-
-       return ((void *) uvm_km_alloc_poolpage_cache(kernel_map, waitok));
-}
-
-void
-pool_page_free_nointr(struct pool *pp, void *v)
-{
-
-       uvm_km_free_poolpage_cache(kernel_map, (vaddr_t) v);
-}

#if defined(DDB)
static bool
Index: sys/kern/subr_vmem.c
===================================================================
RCS file: /cvsroot/src/sys/kern/subr_vmem.c,v
retrieving revision 1.65
diff -u -p -r1.65 subr_vmem.c
--- sys/kern/subr_vmem.c        20 Oct 2011 03:05:14 -0000      1.65
+++ sys/kern/subr_vmem.c        23 Jan 2012 22:02:14 -0000
@@ -31,10 +31,6 @@
 * -   Magazines and Vmem: Extending the Slab Allocator
 *     to Many CPUs and Arbitrary Resources
 *     http://www.usenix.org/event/usenix01/bonwick.html
- *
- * todo:
- * -   decide how to import segments for vmem_xalloc.
- * -   don't rely on malloc(9).
 */

#include <sys/cdefs.h>
@@ -54,27 +50,54 @@ __KERNEL_RCSID(0, "$NetBSD: subr_vmem.c,
#include <sys/systm.h>
#include <sys/kernel.h>        /* hz */
#include <sys/callout.h>
-#include <sys/malloc.h>
-#include <sys/once.h>
+#include <sys/kmem.h>
#include <sys/pool.h>
#include <sys/vmem.h>
#include <sys/workqueue.h>
+#include <sys/atomic.h>
+#include <uvm/uvm.h>
+#include <uvm/uvm_extern.h>
+#include <uvm/uvm_km.h>
+#include <uvm/uvm_page.h>
+#include <uvm/uvm_pdaemon.h>
#else /* defined(_KERNEL) */
#include "../sys/vmem.h"
#endif /* defined(_KERNEL) */

+
#if defined(_KERNEL)
+#include <sys/evcnt.h>
+#define VMEM_EVCNT_DEFINE(name) \
+struct evcnt vmem_evcnt_##name = EVCNT_INITIALIZER(EVCNT_TYPE_MISC, NULL, \
+    "vmemev", #name); \
+EVCNT_ATTACH_STATIC(vmem_evcnt_##name);
+#define VMEM_EVCNT_INCR(ev)    vmem_evcnt_##ev.ev_count++
+#define VMEM_EVCNT_DECR(ev)    vmem_evcnt_##ev.ev_count--
+
+VMEM_EVCNT_DEFINE(bt_pages)
+VMEM_EVCNT_DEFINE(bt_count)
+VMEM_EVCNT_DEFINE(bt_inuse)
+
#define        LOCK_DECL(name)         \
    kmutex_t name; char lockpad[COHERENCY_UNIT - sizeof(kmutex_t)]
+
+#define CONDVAR_DECL(name)     \
+    kcondvar_t name;
+
#else /* defined(_KERNEL) */
#include <errno.h>
#include <assert.h>
#include <stdlib.h>
#include <string.h>

+#define VMEM_EVCNT_INCR(ev)    /* nothing */
+#define VMEM_EVCNT_DECR(ev)    /* nothing */
+
#define        UNITTEST
#define        KASSERT(a)              assert(a)
#define        LOCK_DECL(name)         /* nothing */
+#define        CONDVAR_DECL(name)      /* nothing */
+#define        VMEM_CONDVAR_INIT(vm, wchan)    /* nothing */
#define        mutex_init(a, b, c)     /* nothing */
#define        mutex_destroy(a)        /* nothing */
#define        mutex_enter(a)          /* nothing */
@@ -98,7 +121,7 @@ static void vmem_check(vmem_t *);

#define        VMEM_HASHSIZE_MIN       1       /* XXX */
#define        VMEM_HASHSIZE_MAX       65536   /* XXX */
-#define        VMEM_HASHSIZE_INIT      128
+#define        VMEM_HASHSIZE_INIT      1

#define        VM_FITMASK      (VM_BESTFIT | VM_INSTANTFIT)

@@ -124,19 +147,24 @@ typedef struct qcache qcache_t;

/* vmem arena */
struct vmem {
+       CONDVAR_DECL(vm_cv);
       LOCK_DECL(vm_lock);
-       int (*vm_importfn)(void *, vmem_size_t, vmem_size_t *,
-           vm_flag_t, vmem_addr_t *);
-       void (*vm_releasefn)(void *, vmem_addr_t, vmem_size_t);
-       vmem_t *vm_source;
+       vm_flag_t vm_flags;
+       vmem_import_t *vm_importfn;
+       vmem_release_t *vm_releasefn;
+       size_t vm_nfreetags;
+       LIST_HEAD(, vmem_btag) vm_freetags;
       void *vm_arg;
       struct vmem_seglist vm_seglist;
       struct vmem_freelist vm_freelist[VMEM_MAXORDER];
       size_t vm_hashsize;
       size_t vm_nbusytag;
       struct vmem_hashlist *vm_hashlist;
+       struct vmem_hashlist vm_hash0;
       size_t vm_quantum_mask;
       int vm_quantum_shift;
+       size_t vm_size;
+       size_t vm_inuse;
       char vm_name[VMEM_NAME_MAX+1];
       LIST_ENTRY(vmem) vm_alllist;

@@ -156,6 +184,13 @@ struct vmem {
#define        VMEM_LOCK_DESTROY(vm)   mutex_destroy(&vm->vm_lock)
#define        VMEM_ASSERT_LOCKED(vm)  KASSERT(mutex_owned(&vm->vm_lock))

+#if defined(_KERNEL)
+#define        VMEM_CONDVAR_INIT(vm, wchan)    cv_init(&vm->vm_cv, wchan)
+#define        VMEM_CONDVAR_DESTROY(vm)        cv_destroy(&vm->vm_cv)
+#define        VMEM_CONDVAR_WAIT(vm)           cv_wait(&vm->vm_cv, &vm->vm_lock)
+#define        VMEM_CONDVAR_BROADCAST(vm)      cv_broadcast(&vm->vm_cv)
+#endif /* defined(_KERNEL) */
+
/* boundary tag */
struct vmem_btag {
       CIRCLEQ_ENTRY(vmem_btag) bt_seglist;
@@ -180,6 +215,12 @@ struct vmem_btag {

typedef struct vmem_btag bt_t;

+#if defined(_KERNEL)
+static kmutex_t vmem_list_lock;
+static LIST_HEAD(, vmem) vmem_list = LIST_HEAD_INITIALIZER(vmem_list);
+#endif /* defined(_KERNEL) */
+
+
/* ---- misc */

#define        VMEM_ALIGNUP(addr, align) \
@@ -198,36 +239,180 @@ typedef struct vmem_btag bt_t;
#define        bt_free(vm, bt)         free(bt)
#else  /* !defined(_KERNEL) */

-static MALLOC_DEFINE(M_VMEM, "vmem", "vmem");
-
static inline void *
xmalloc(size_t sz, vm_flag_t flags)
{
-       return malloc(sz, M_VMEM,
-           M_CANFAIL | ((flags & VM_SLEEP) ? M_WAITOK : M_NOWAIT));
+
+#if defined(_KERNEL)
+       return kmem_alloc(sz, (flags & VM_SLEEP) ? KM_SLEEP : KM_NOSLEEP);
+#else /* defined(_KERNEL) */
+       return malloc(sz);
+#endif /* defined(_KERNEL) */
}

static inline void
-xfree(void *p)
+xfree(void *p, size_t sz)
{
-       free(p, M_VMEM);
+
+#if defined(_KERNEL)
+       kmem_free(p, sz);
+#else /* defined(_KERNEL) */
+       free(p);
+#endif /* defined(_KERNEL) */
}

+#if defined(_KERNEL)
+
+#define BT_MINRESERVE 6
+#define BT_MAXFREE 64
+#define STATIC_VMEM_COUNT 5
+#define STATIC_BT_COUNT 200
+#define STATIC_QC_POOL_COUNT (VMEM_QCACHE_IDX_MAX + 1)
+
+static struct vmem static_vmems[STATIC_VMEM_COUNT];
+static int static_vmem_count = STATIC_VMEM_COUNT;
+
+static struct vmem_btag static_bts[STATIC_BT_COUNT];
+static int static_bt_count = STATIC_BT_COUNT;
+
+static struct pool_cache static_qc_pools[STATIC_QC_POOL_COUNT];
+static int static_qc_pool_count = STATIC_QC_POOL_COUNT;
+
+vmem_t *kmem_va_meta_arena;
+vmem_t *kmem_meta_arena;
+
+static kmutex_t vmem_btag_lock;
+static LIST_HEAD(, vmem_btag) vmem_btag_freelist;
+static size_t vmem_btag_freelist_count = 0;
+static size_t vmem_btag_count = STATIC_BT_COUNT;
+
/* ---- boundary tag */

-static struct pool_cache bt_cache;
+#define BT_PER_PAGE \
+       (PAGE_SIZE / sizeof(bt_t))
+
+static int bt_refill(vmem_t *vm, vm_flag_t flags);
+
+static int
+bt_refillglobal(vm_flag_t flags)
+{
+       vmem_addr_t va;
+       bt_t *btp;
+       bt_t *bt;
+       int i;
+
+       mutex_enter(&vmem_btag_lock);
+       if (vmem_btag_freelist_count > (BT_MINRESERVE * 16)) {
+               mutex_exit(&vmem_btag_lock);
+               return 0;
+       }
+
+       if (vmem_alloc(kmem_meta_arena, PAGE_SIZE,
+           (flags & ~VM_FITMASK) | VM_INSTANTFIT | VM_POPULATING, &va) != 0) {
+               mutex_exit(&vmem_btag_lock);
+               return ENOMEM;
+       }
+       VMEM_EVCNT_INCR(bt_pages);
+
+       btp = (void *) va;
+       for (i = 0; i < (BT_PER_PAGE); i++) {
+               bt = btp;
+               memset(bt, 0, sizeof(*bt));
+               LIST_INSERT_HEAD(&vmem_btag_freelist, bt,
+                   bt_freelist);
+               vmem_btag_freelist_count++;
+               vmem_btag_count++;
+               VMEM_EVCNT_INCR(bt_count);
+               btp++;
+       }
+       mutex_exit(&vmem_btag_lock);
+
+       bt_refill(kmem_arena, (flags & ~VM_FITMASK) | VM_INSTANTFIT);
+       bt_refill(kmem_va_meta_arena, (flags & ~VM_FITMASK) | VM_INSTANTFIT);
+       bt_refill(kmem_meta_arena, (flags & ~VM_FITMASK) | VM_INSTANTFIT);
+
+       return 0;
+}
+
+static int
+bt_refill(vmem_t *vm, vm_flag_t flags)
+{
+       bt_t *bt;
+
+       bt_refillglobal(flags);
+
+       VMEM_LOCK(vm);
+       mutex_enter(&vmem_btag_lock);
+       while (!LIST_EMPTY(&vmem_btag_freelist) &&
+           vm->vm_nfreetags < (BT_MINRESERVE * 2)) {
+               bt = LIST_FIRST(&vmem_btag_freelist);
+               LIST_REMOVE(bt, bt_freelist);
+               LIST_INSERT_HEAD(&vm->vm_freetags, bt, bt_freelist);
+               vm->vm_nfreetags++;
+               vmem_btag_freelist_count--;
+       }
+       mutex_exit(&vmem_btag_lock);
+
+       if (vm->vm_nfreetags == 0) {
+               VMEM_UNLOCK(vm);
+               return ENOMEM;
+       }
+       VMEM_UNLOCK(vm);
+
+       return 0;
+}
+#endif /* defined(_KERNEL) */

static inline bt_t *
bt_alloc(vmem_t *vm, vm_flag_t flags)
{
-       return pool_cache_get(&bt_cache,
-           (flags & VM_SLEEP) ? PR_WAITOK : PR_NOWAIT);
+       bt_t *bt;
+
+#if defined(_KERNEL)
+again:
+       VMEM_LOCK(vm);
+       if (vm->vm_nfreetags < BT_MINRESERVE &&
+           (flags & VM_POPULATING) == 0) {
+               VMEM_UNLOCK(vm);
+               if (bt_refill(vm, VM_NOSLEEP | VM_INSTANTFIT)) {
+                       return NULL;
+               }
+               goto again;
+       }
+       bt = LIST_FIRST(&vm->vm_freetags);
+       LIST_REMOVE(bt, bt_freelist);
+       vm->vm_nfreetags--;
+       VMEM_UNLOCK(vm);
+       VMEM_EVCNT_INCR(bt_inuse);
+#else /* defined(_KERNEL) */
+       bt = malloc(sizeof *bt);
+#endif /* defined(_KERNEL) */
+
+       return bt;
}

static inline void
bt_free(vmem_t *vm, bt_t *bt)
{
-       pool_cache_put(&bt_cache, bt);
+
+#if defined(_KERNEL)
+       VMEM_LOCK(vm);
+       LIST_INSERT_HEAD(&vm->vm_freetags, bt, bt_freelist);
+       vm->vm_nfreetags++;
+       while (vm->vm_nfreetags > BT_MAXFREE) {
+               bt = LIST_FIRST(&vm->vm_freetags);
+               LIST_REMOVE(bt, bt_freelist);
+               vm->vm_nfreetags--;
+               mutex_enter(&vmem_btag_lock);
+               LIST_INSERT_HEAD(&vmem_btag_freelist, bt, bt_freelist);
+               vmem_btag_freelist_count++;
+               mutex_exit(&vmem_btag_lock);
+       }
+       VMEM_UNLOCK(vm);
+       VMEM_EVCNT_DECR(bt_inuse);
+#else /* defined(_KERNEL) */
+       free(bt);
+#endif /* defined(_KERNEL) */
}

#endif /* !defined(_KERNEL) */
@@ -378,11 +563,6 @@ bt_insfree(vmem_t *vm, bt_t *bt)

/* ---- vmem internal functions */

-#if defined(_KERNEL)
-static kmutex_t vmem_list_lock;
-static LIST_HEAD(, vmem) vmem_list = LIST_HEAD_INITIALIZER(vmem_list);
-#endif /* defined(_KERNEL) */
-
#if defined(QCACHE)
static inline vm_flag_t
prf_to_vmf(int prflags)
@@ -468,19 +648,36 @@ qc_init(vmem_t *vm, size_t qcache_max, i
       for (i = qcache_idx_max; i > 0; i--) {
               qcache_t *qc = &vm->vm_qcache_store[i - 1];
               size_t size = i << vm->vm_quantum_shift;
+               pool_cache_t pc;

               qc->qc_vmem = vm;
               snprintf(qc->qc_name, sizeof(qc->qc_name), "%s-%zu",
                   vm->vm_name, size);
-               qc->qc_cache = pool_cache_init(size,
-                   ORDER2SIZE(vm->vm_quantum_shift), 0,
-                   PR_NOALIGN | PR_NOTOUCH /* XXX */,
-                   qc->qc_name, pa, ipl, NULL, NULL, NULL);
+
+               if (vm->vm_flags & VM_BOOTSTRAP) {
+                       KASSERT(static_qc_pool_count > 0);
+                       pc = &static_qc_pools[--static_qc_pool_count];
+                       pool_cache_bootstrap(pc, size,
+                           ORDER2SIZE(vm->vm_quantum_shift), 0,
+                           PR_NOALIGN | PR_NOTOUCH | PR_RECURSIVE /* XXX */,
+                           qc->qc_name, pa, ipl, NULL, NULL, NULL);
+               } else {
+                       pc = pool_cache_init(size,
+                           ORDER2SIZE(vm->vm_quantum_shift), 0,
+                           PR_NOALIGN | PR_NOTOUCH /* XXX */,
+                           qc->qc_name, pa, ipl, NULL, NULL, NULL);
+               }
+               qc->qc_cache = pc;
               KASSERT(qc->qc_cache != NULL);  /* XXX */
               if (prevqc != NULL &&
                   qc->qc_cache->pc_pool.pr_itemsperpage ==
                   prevqc->qc_cache->pc_pool.pr_itemsperpage) {
-                       pool_cache_destroy(qc->qc_cache);
+                       if (vm->vm_flags & VM_BOOTSTRAP) {
+                               pool_cache_bootstrap_destroy(pc);
+                               //static_qc_pool_count++;
+                       } else {
+                               pool_cache_destroy(qc->qc_cache);
+                       }
                       vm->vm_qcache[i - 1] = prevqc;
                       continue;
               }
@@ -505,46 +702,44 @@ qc_destroy(vmem_t *vm)
               if (prevqc == qc) {
                       continue;
               }
-               pool_cache_destroy(qc->qc_cache);
+               if (vm->vm_flags & VM_BOOTSTRAP) {
+                       pool_cache_bootstrap_destroy(qc->qc_cache);
+               } else {
+                       pool_cache_destroy(qc->qc_cache);
+               }
               prevqc = qc;
       }
}
+#endif

-static bool
-qc_reap(vmem_t *vm)
+#if defined(_KERNEL)
+void
+vmem_bootstrap(void)
{
-       const qcache_t *prevqc;
-       int i;
-       int qcache_idx_max;
-       bool didsomething = false;

-       qcache_idx_max = vm->vm_qcache_max >> vm->vm_quantum_shift;
-       prevqc = NULL;
-       for (i = 0; i < qcache_idx_max; i++) {
-               qcache_t *qc = vm->vm_qcache[i];
+       mutex_init(&vmem_list_lock, MUTEX_DEFAULT, IPL_VM);
+       mutex_init(&vmem_btag_lock, MUTEX_DEFAULT, IPL_VM);

-               if (prevqc == qc) {
-                       continue;
-               }
-               if (pool_cache_reclaim(qc->qc_cache) != 0) {
-                       didsomething = true;
-               }
-               prevqc = qc;
+       while (static_bt_count-- > 0) {
+               bt_t *bt = &static_bts[static_bt_count];
+               LIST_INSERT_HEAD(&vmem_btag_freelist, bt, bt_freelist);
+               VMEM_EVCNT_INCR(bt_count);
+               vmem_btag_freelist_count++;
       }
-
-       return didsomething;
}
-#endif /* defined(QCACHE) */

-#if defined(_KERNEL)
-static int
-vmem_init(void)
+void
+vmem_init(vmem_t *vm)
{

-       mutex_init(&vmem_list_lock, MUTEX_DEFAULT, IPL_NONE);
-       pool_cache_bootstrap(&bt_cache, sizeof(bt_t), 0, 0, 0, "vmembt",
-           NULL, IPL_VM, NULL, NULL, NULL);
-       return 0;
+       kmem_va_meta_arena = vmem_create("vmem-va", 0, 0, PAGE_SIZE,
+           vmem_alloc, vmem_free, vm,
+           0, VM_NOSLEEP | VM_BOOTSTRAP | VM_LARGEIMPORT,
+           IPL_VM);
+
+       kmem_meta_arena = vmem_create("vmem-meta", 0, 0, PAGE_SIZE,
+           uvm_km_kmem_alloc, uvm_km_kmem_free, kmem_va_meta_arena,
+           0, VM_NOSLEEP | VM_BOOTSTRAP, IPL_VM);
}
#endif /* defined(_KERNEL) */

@@ -582,6 +777,7 @@ vmem_add1(vmem_t *vm, vmem_addr_t addr,
       bt_insseg_tail(vm, btspan);
       bt_insseg(vm, btfree, btspan);
       bt_insfree(vm, btfree);
+       vm->vm_size += size;
       VMEM_UNLOCK(vm);

       return 0;
@@ -605,10 +801,26 @@ vmem_destroy1(vmem_t *vm)
                               bt_free(vm, bt);
                       }
               }
-               xfree(vm->vm_hashlist);
+               if (vm->vm_hashlist != &vm->vm_hash0) {
+                       xfree(vm->vm_hashlist,
+                           sizeof(struct vmem_hashlist *) * vm->vm_hashsize);
+               }
+       }
+
+       while (vm->vm_nfreetags > 0) {
+               bt_t *bt = LIST_FIRST(&vm->vm_freetags);
+               LIST_REMOVE(bt, bt_freelist);
+               vm->vm_nfreetags--;
+               mutex_enter(&vmem_btag_lock);
+#if defined (_KERNEL)
+               LIST_INSERT_HEAD(&vmem_btag_freelist, bt, bt_freelist);
+               vmem_btag_freelist_count++;
+#endif /* defined(_KERNEL) */
+               mutex_exit(&vmem_btag_lock);
       }
+
       VMEM_LOCK_DESTROY(vm);
-       xfree(vm);
+       xfree(vm, sizeof(*vm));
}

static int
@@ -621,9 +833,21 @@ vmem_import(vmem_t *vm, vmem_size_t size
               return EINVAL;
       }

-       rc = (*vm->vm_importfn)(vm->vm_arg, size, &size, flags, &addr);
-       if (rc != 0) {
-               return ENOMEM;
+       if (vm->vm_flags & VM_LARGEIMPORT) {
+               size *= 32;
+       }
+
+       if (vm->vm_flags & VM_XIMPORT) {
+               rc = ((vmem_ximport_t *)vm->vm_importfn)(vm->vm_arg, size,
+                   &size, flags, &addr);
+               if (rc != 0) {
+                       return ENOMEM;
+               }
+       } else {
+               rc = (vm->vm_importfn)(vm->vm_arg, size, flags, &addr);
+               if (rc != 0) {
+                       return ENOMEM;
+               }
       }

       if (vmem_add1(vm, addr, size, flags, BT_TYPE_SPAN) != 0) {
@@ -655,7 +879,8 @@ vmem_rehash(vmem_t *vm, size_t newhashsi
       }

       if (!VMEM_TRYLOCK(vm)) {
-               xfree(newhashlist);
+               xfree(newhashlist,
+                   sizeof(struct vmem_hashlist *) * newhashsize);
               return EBUSY;
       }
       oldhashlist = vm->vm_hashlist;
@@ -674,7 +899,10 @@ vmem_rehash(vmem_t *vm, size_t newhashsi
       }
       VMEM_UNLOCK(vm);

-       xfree(oldhashlist);
+       if (oldhashlist != &vm->vm_hash0) {
+               xfree(oldhashlist,
+                   sizeof(struct vmem_hashlist *) * oldhashsize);
+       }

       return 0;
}
@@ -735,43 +963,40 @@ vmem_fit(const bt_t const *bt, vmem_size
       return ENOMEM;
}

-/* ---- vmem API */

/*
- * vmem_create: create an arena.
- *
- * => must not be called from interrupt context.
+ * vmem_create_internal: creates a vmem arena.
 */

-vmem_t *
-vmem_create(const char *name, vmem_addr_t base, vmem_size_t size,
-    vmem_size_t quantum,
-    int (*importfn)(void *, vmem_size_t, vmem_size_t *, vm_flag_t,
-        vmem_addr_t *),
-    void (*releasefn)(void *, vmem_addr_t, vmem_size_t),
+static vmem_t *
+vmem_create_internal(const char *name, vmem_addr_t base, vmem_size_t size,
+    vmem_size_t quantum, vmem_import_t *importfn, vmem_release_t *releasefn,
    void *arg, vmem_size_t qcache_max, vm_flag_t flags, int ipl)
{
-       vmem_t *vm;
+       vmem_t *vm = NULL;
       int i;
-#if defined(_KERNEL)
-       static ONCE_DECL(control);
-#endif /* defined(_KERNEL) */

       KASSERT((flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
       KASSERT((~flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
       KASSERT(quantum > 0);

+       if (flags & VM_BOOTSTRAP) {
#if defined(_KERNEL)
-       if (RUN_ONCE(&control, vmem_init)) {
-               return NULL;
-       }
+               KASSERT(static_vmem_count > 0);
+               vm = &static_vmems[--static_vmem_count];
#endif /* defined(_KERNEL) */
-       vm = xmalloc(sizeof(*vm), flags);
+       } else {
+               vm = xmalloc(sizeof(*vm), flags);
+       }
       if (vm == NULL) {
               return NULL;
       }

+       VMEM_CONDVAR_INIT(vm, "vmem");
       VMEM_LOCK_INIT(vm, ipl);
+       vm->vm_flags = flags;
+       vm->vm_nfreetags = 0;
+       LIST_INIT(&vm->vm_freetags);
       strlcpy(vm->vm_name, name, sizeof(vm->vm_name));
       vm->vm_quantum_mask = quantum - 1;
       vm->vm_quantum_shift = SIZE2ORDER(quantum);
@@ -780,6 +1005,8 @@ vmem_create(const char *name, vmem_addr_
       vm->vm_releasefn = releasefn;
       vm->vm_arg = arg;
       vm->vm_nbusytag = 0;
+       vm->vm_size = 0;
+       vm->vm_inuse = 0;
#if defined(QCACHE)
       qc_init(vm, qcache_max, ipl);
#endif /* defined(QCACHE) */
@@ -789,7 +1016,10 @@ vmem_create(const char *name, vmem_addr_
               LIST_INIT(&vm->vm_freelist[i]);
       }
       vm->vm_hashlist = NULL;
-       if (vmem_rehash(vm, VMEM_HASHSIZE_INIT, flags)) {
+       if (flags & VM_BOOTSTRAP) {
+               vm->vm_hashsize = 1;
+               vm->vm_hashlist = &vm->vm_hash0;
+       } else if (vmem_rehash(vm, VMEM_HASHSIZE_INIT, flags)) {
               vmem_destroy1(vm);
               return NULL;
       }
@@ -802,6 +1032,10 @@ vmem_create(const char *name, vmem_addr_
       }

#if defined(_KERNEL)
+       if (flags & VM_BOOTSTRAP) {
+               bt_refill(vm, VM_NOSLEEP);
+       }
+
       mutex_enter(&vmem_list_lock);
       LIST_INSERT_HEAD(&vmem_list, vm, vm_alllist);
       mutex_exit(&vmem_list_lock);
@@ -810,6 +1044,52 @@ vmem_create(const char *name, vmem_addr_
       return vm;
}

+
+/* ---- vmem API */
+
+/*
+ * vmem_create: create an arena.
+ *
+ * => must not be called from interrupt context.
+ */
+
+vmem_t *
+vmem_create(const char *name, vmem_addr_t base, vmem_size_t size,
+    vmem_size_t quantum, vmem_import_t *importfn, vmem_release_t *releasefn,
+    vmem_t *source, vmem_size_t qcache_max, vm_flag_t flags,
+    int ipl)
+{
+
+       KASSERT((flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
+       KASSERT((~flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
+       KASSERT((flags & (VM_XIMPORT)) == 0);
+
+       return vmem_create_internal(name, base, size, quantum,
+           importfn, releasefn, source, qcache_max, flags, ipl);
+}
+
+/*
+ * vmem_xcreate: create an arena takes alternative import func.
+ *
+ * => must not be called from interrupt context.
+ */
+
+vmem_t *
+vmem_xcreate(const char *name, vmem_addr_t base, vmem_size_t size,
+    vmem_size_t quantum, vmem_ximport_t *importfn, vmem_release_t *releasefn,
+    vmem_t *source, vmem_size_t qcache_max, vm_flag_t flags,
+    int ipl)
+{
+
+       KASSERT((flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
+       KASSERT((~flags & (VM_SLEEP|VM_NOSLEEP)) != 0);
+       KASSERT((flags & (VM_XIMPORT)) == 0);
+
+       return vmem_create_internal(name, base, size, quantum,
+           (vmem_import_t *)importfn, releasefn, source,
+           qcache_max, flags | VM_XIMPORT, ipl);
+}
+
void
vmem_destroy(vmem_t *vm)
{
@@ -999,6 +1279,7 @@ retry:
               goto retry;
       }
       /* XXX */
+
fail:
       bt_free(vm, btnew);
       bt_free(vm, btnew2);
@@ -1083,6 +1364,9 @@ vmem_xfree(vmem_t *vm, vmem_addr_t addr,
{
       bt_t *bt;
       bt_t *t;
+       LIST_HEAD(, vmem_btag) tofree;
+
+       LIST_INIT(&tofree);

       KASSERT(size > 0);

@@ -1097,6 +1381,8 @@ vmem_xfree(vmem_t *vm, vmem_addr_t addr,
       bt_rembusy(vm, bt);
       bt->bt_type = BT_TYPE_FREE;

+       vm->vm_inuse -= bt->bt_size;
+
       /* coalesce */
       t = CIRCLEQ_NEXT(bt, bt_seglist);
       if (t != NULL && t->bt_type == BT_TYPE_FREE) {
@@ -1104,7 +1390,7 @@ vmem_xfree(vmem_t *vm, vmem_addr_t addr,
               bt_remfree(vm, t);
               bt_remseg(vm, t);
               bt->bt_size += t->bt_size;
-               bt_free(vm, t);
+               LIST_INSERT_HEAD(&tofree, t, bt_freelist);
       }
       t = CIRCLEQ_PREV(bt, bt_seglist);
       if (t != NULL && t->bt_type == BT_TYPE_FREE) {
@@ -1113,7 +1399,7 @@ vmem_xfree(vmem_t *vm, vmem_addr_t addr,
               bt_remseg(vm, t);
               bt->bt_size += t->bt_size;
               bt->bt_start = t->bt_start;
-               bt_free(vm, t);
+               LIST_INSERT_HEAD(&tofree, t, bt_freelist);
       }

       t = CIRCLEQ_PREV(bt, bt_seglist);
@@ -1128,15 +1414,25 @@ vmem_xfree(vmem_t *vm, vmem_addr_t addr,
               spanaddr = bt->bt_start;
               spansize = bt->bt_size;
               bt_remseg(vm, bt);
-               bt_free(vm, bt);
+               LIST_INSERT_HEAD(&tofree, bt, bt_freelist);
               bt_remseg(vm, t);
-               bt_free(vm, t);
+               LIST_INSERT_HEAD(&tofree, t, bt_freelist);
+               vm->vm_size -= spansize;
               VMEM_UNLOCK(vm);
               (*vm->vm_releasefn)(vm->vm_arg, spanaddr, spansize);
       } else {
               bt_insfree(vm, bt);
               VMEM_UNLOCK(vm);
       }
+
+       while (!LIST_EMPTY(&tofree)) {
+               t = LIST_FIRST(&tofree);
+               LIST_REMOVE(t, bt_freelist);
+               bt_free(vm, t);
+       }
+#if defined(_KERNEL)
+       VMEM_CONDVAR_BROADCAST(vm);
+#endif /* defined(_KERNEL) */
}

/*
@@ -1154,20 +1450,24 @@ vmem_add(vmem_t *vm, vmem_addr_t addr, v
}

/*
- * vmem_reap: reap unused resources.
+ * vmem_size: information about arenas size
 *
- * => return true if we successfully reaped something.
+ * => return free/allocated size in arena
 */
-
-bool
-vmem_reap(vmem_t *vm)
+vmem_size_t
+vmem_size(vmem_t *vm, int typemask)
{
-       bool didsomething = false;

-#if defined(QCACHE)
-       didsomething = qc_reap(vm);
-#endif /* defined(QCACHE) */
-       return didsomething;
+       switch (typemask) {
+       case VMEM_ALLOC:
+               return vm->vm_inuse;
+       case VMEM_FREE:
+               return vm->vm_size - vm->vm_inuse;
+       case VMEM_FREE|VMEM_ALLOC:
+               return vm->vm_size;
+       default:
+               panic("vmem_size");
+       }
}

/* ---- rehash */
@@ -1204,6 +1504,7 @@ vmem_rehash_all(struct work *wk, void *d
               if (desired > current * 2 || desired * 2 < current) {
                       vmem_rehash(vm, desired, VM_NOSLEEP);
               }
+               VMEM_CONDVAR_BROADCAST(vm);
       }
       mutex_exit(&vmem_list_lock);

@@ -1564,3 +1865,4 @@ main(void)
       exit(EXIT_SUCCESS);
}
#endif /* defined(UNITTEST) */
+
Index: sys/kern/uipc_mbuf.c
===================================================================
RCS file: /cvsroot/src/sys/kern/uipc_mbuf.c,v
retrieving revision 1.143
diff -u -p -r1.143 uipc_mbuf.c
--- sys/kern/uipc_mbuf.c        31 Aug 2011 18:31:02 -0000      1.143
+++ sys/kern/uipc_mbuf.c        23 Jan 2012 22:02:15 -0000
@@ -154,7 +154,7 @@ nmbclusters_limit(void)
       /* direct mapping, doesn't use space in kmem_map */
       vsize_t max_size = physmem / 4;
#else
-       vsize_t max_size = MIN(physmem / 4, nkmempages / 2);
+       vsize_t max_size = MIN(physmem / 4, (128 * 1024) / 2);
#endif

       max_size = max_size * PAGE_SIZE / MCLBYTES;
Index: sys/kern/uipc_socket.c
===================================================================
RCS file: /cvsroot/src/sys/kern/uipc_socket.c,v
retrieving revision 1.206
diff -u -p -r1.206 uipc_socket.c
--- sys/kern/uipc_socket.c      20 Dec 2011 23:56:28 -0000      1.206
+++ sys/kern/uipc_socket.c      23 Jan 2012 22:02:16 -0000
@@ -136,8 +136,6 @@ EVCNT_ATTACH_STATIC(sosend_kvalimit);

#endif /* SOSEND_COUNTERS */

-static struct callback_entry sokva_reclaimerentry;
-
#if defined(SOSEND_NO_LOAN) || defined(MULTIPROCESSOR)
int sock_loan_thresh = -1;
#else
@@ -384,19 +382,6 @@ sosend_loan(struct socket *so, struct ui
       return (space);
}

-static int
-sokva_reclaim_callback(struct callback_entry *ce, void *obj, void *arg)
-{
-
-       KASSERT(ce == &sokva_reclaimerentry);
-       KASSERT(obj == NULL);
-
-       if (!vm_map_starved_p(kernel_map)) {
-               return CALLBACK_CHAIN_ABORT;
-       }
-       return CALLBACK_CHAIN_CONTINUE;
-}
-
struct mbuf *
getsombuf(struct socket *so, int type)
{
@@ -479,9 +464,6 @@ soinit(void)
       if (sb_max_set(sb_max))
               panic("bad initial sb_max value: %lu", sb_max);

-       callback_register(&vm_map_to_kernel(kernel_map)->vmk_reclaim_callback,
-           &sokva_reclaimerentry, NULL, sokva_reclaim_callback);
-
       socket_listener = kauth_listen_scope(KAUTH_SCOPE_NETWORK,
           socket_listener_cb, NULL);
}
Index: sys/kern/vfs_bio.c
===================================================================
RCS file: /cvsroot/src/sys/kern/vfs_bio.c,v
retrieving revision 1.232
diff -u -p -r1.232 vfs_bio.c
--- sys/kern/vfs_bio.c  5 Oct 2011 01:53:03 -0000       1.232
+++ sys/kern/vfs_bio.c  23 Jan 2012 22:02:16 -0000
@@ -231,18 +231,24 @@ static struct vm_map *buf_map;
static void *
bufpool_page_alloc(struct pool *pp, int flags)
{
+       int rc;
+       vmem_addr_t va;

-       return (void *)uvm_km_alloc(buf_map,
-           MAXBSIZE, MAXBSIZE,
-           ((flags & PR_WAITOK) ? 0 : UVM_KMF_NOWAIT | UVM_KMF_TRYLOCK)
-           | UVM_KMF_WIRED);
+       rc = uvm_km_kmem_alloc(kmem_va_arena, MAXBSIZE,
+           ((flags & PR_WAITOK) ? VM_SLEEP : VM_NOSLEEP) | VM_INSTANTFIT,
+           &va);
+
+       if (rc != 0)
+               return NULL;
+       else
+               return (void *)va;
}

static void
bufpool_page_free(struct pool *pp, void *v)
{

-       uvm_km_free(buf_map, (vaddr_t)v, MAXBSIZE, UVM_KMF_WIRED);
+       uvm_km_kmem_free(kmem_va_arena, (vaddr_t)v, MAXBSIZE);
}

static struct pool_allocator bufmempool_allocator = {
@@ -474,7 +480,6 @@ bufinit(void)
       bufio_cache = pool_cache_init(sizeof(buf_t), 0, 0, 0,
           "biopl", NULL, IPL_BIO, NULL, NULL, NULL);

-       bufmempool_allocator.pa_backingmap = buf_map;
       for (i = 0; i < NMEMPOOLS; i++) {
               struct pool_allocator *pa;
               struct pool *pp = &bmempools[i];
@@ -489,7 +494,7 @@ bufinit(void)
               pa = (size <= PAGE_SIZE && use_std)
                       ? &pool_allocator_nointr
                       : &bufmempool_allocator;
-               pool_init(pp, size, 0, 0, 0, name, pa, IPL_NONE);
+               pool_init(pp, size, 0, 0, PR_NOALIGN, name, pa, IPL_NONE);
               pool_setlowat(pp, 1);
               pool_sethiwat(pp, 1);
       }
Index: sys/kern/vfs_dirhash.c
===================================================================
RCS file: /cvsroot/src/sys/kern/vfs_dirhash.c,v
retrieving revision 1.10
diff -u -p -r1.10 vfs_dirhash.c
--- sys/kern/vfs_dirhash.c      6 Feb 2009 23:56:26 -0000       1.10
+++ sys/kern/vfs_dirhash.c      23 Jan 2012 22:02:16 -0000
@@ -37,7 +37,7 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_dirhash.
#include <sys/dirent.h>
#include <sys/hash.h>
#include <sys/mutex.h>
-#include <sys/pool.h>
+#include <sys/kmem.h>
#include <sys/queue.h>
#include <sys/vnode.h>
#include <sys/sysctl.h>
@@ -65,8 +65,6 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_dirhash.
 */

static struct sysctllog *sysctl_log;
-static struct pool dirhash_pool;
-static struct pool dirhash_entry_pool;

static kmutex_t dirhashmutex;
static uint32_t maxdirhashsize = DIRHASH_SIZE;
@@ -78,24 +76,11 @@ void
dirhash_init(void)
{
       const struct sysctlnode *rnode, *cnode;
-       size_t sz;
-       uint32_t max_entries;

       /* initialise dirhash queue */
       TAILQ_INIT(&dirhash_queue);

-       /* init dirhash pools */
-       sz = sizeof(struct dirhash);
-       pool_init(&dirhash_pool, sz, 0, 0, 0,
-               "dirhpl", NULL, IPL_NONE);
-
-       sz = sizeof(struct dirhash_entry);
-       pool_init(&dirhash_entry_pool, sz, 0, 0, 0,
-               "dirhepl", NULL, IPL_NONE);
-
       mutex_init(&dirhashmutex, MUTEX_DEFAULT, IPL_NONE);
-       max_entries = maxdirhashsize / sz;
-       pool_sethiwat(&dirhash_entry_pool, max_entries);
       dirhashsize = 0;

       /* create sysctl knobs and dials */
@@ -124,8 +109,6 @@ dirhash_init(void)
void
dirhash_finish(void)
{
-       pool_destroy(&dirhash_pool);
-       pool_destroy(&dirhash_entry_pool);

       mutex_destroy(&dirhashmutex);

@@ -154,13 +137,13 @@ dirhash_purge_entries(struct dirhash *di
               while ((dirh_e =
                   LIST_FIRST(&dirh->entries[hashline])) != NULL) {
                       LIST_REMOVE(dirh_e, next);
-                       pool_put(&dirhash_entry_pool, dirh_e);
+                       kmem_free(dirh_e, sizeof(*dirh_e));
               }
       }

       while ((dirh_e = LIST_FIRST(&dirh->free_entries)) != NULL) {
               LIST_REMOVE(dirh_e, next);
-               pool_put(&dirhash_entry_pool, dirh_e);
+               kmem_free(dirh_e, sizeof(*dirh_e));
       }

       dirh->flags &= ~DIRH_COMPLETE;
@@ -187,7 +170,7 @@ dirhash_purge(struct dirhash **dirhp)
       TAILQ_REMOVE(&dirhash_queue, dirh, next);
       mutex_exit(&dirhashmutex);

-       pool_put(&dirhash_pool, dirh);
+       kmem_free(dirh, sizeof(*dirh));
       *dirhp = NULL;
}

@@ -201,8 +184,7 @@ dirhash_get(struct dirhash **dirhp)
       /* if no dirhash was given, allocate one */
       dirh = *dirhp;
       if (dirh == NULL) {
-               dirh = pool_get(&dirhash_pool, PR_WAITOK);
-               memset(dirh, 0, sizeof(struct dirhash));
+               dirh = kmem_zalloc(sizeof(struct dirhash), KM_SLEEP);
               for (hashline = 0; hashline < DIRHASH_HASHSIZE; hashline++) {
                       LIST_INIT(&dirh->entries[hashline]);
               }
@@ -275,7 +257,7 @@ dirhash_enter(struct dirhash *dirh,
               if (dirh_e->offset == offset) {
                       DPRINTF(("\tremoving free entry\n"));
                       LIST_REMOVE(dirh_e, next);
-                       pool_put(&dirhash_entry_pool, dirh_e);
+                       kmem_free(dirh_e, sizeof(*dirh_e));
                       break;
               }
       }
@@ -300,8 +282,7 @@ dirhash_enter(struct dirhash *dirh,
       }

       /* add to the hashline */
-       dirh_e = pool_get(&dirhash_entry_pool, PR_WAITOK);
-       memset(dirh_e, 0, sizeof(struct dirhash_entry));
+       dirh_e = kmem_zalloc(sizeof(struct dirhash_entry), KM_SLEEP);

       dirh_e->hashvalue = hashvalue;
       dirh_e->offset    = offset;
@@ -331,8 +312,7 @@ dirhash_enter_freed(struct dirhash *dirh

       DPRINTF(("dirhash enter FREED %"PRIu64", %d\n",
               offset, entry_size));
-       dirh_e = pool_get(&dirhash_entry_pool, PR_WAITOK);
-       memset(dirh_e, 0, sizeof(struct dirhash_entry));
+       dirh_e = kmem_zalloc(sizeof(struct dirhash_entry), KM_SLEEP);

       dirh_e->hashvalue = 0;          /* not relevant */
       dirh_e->offset    = offset;
Index: sys/kern/vfs_wapbl.c
===================================================================
RCS file: /cvsroot/src/sys/kern/vfs_wapbl.c,v
retrieving revision 1.49
diff -u -p -r1.49 vfs_wapbl.c
--- sys/kern/vfs_wapbl.c        11 Jan 2012 00:11:32 -0000      1.49
+++ sys/kern/vfs_wapbl.c        23 Jan 2012 22:02:17 -0000
@@ -64,9 +64,9 @@ __KERNEL_RCSID(0, "$NetBSD: vfs_wapbl.c,
#include <miscfs/specfs/specdev.h>

#if 0 /* notyet */
-#define        wapbl_malloc(s) kmem_alloc((s), KM_SLEEP)
-#define        wapbl_free(a, s) kmem_free((a), (s))
-#define        wapbl_calloc(n, s) kmem_zalloc((n)*(s), KM_SLEEP)
+#define        wapbl_malloc(s) kmem_intr_alloc((s), KM_SLEEP)
+#define        wapbl_free(a, s) kmem_intr_free((a), (s))
+#define        wapbl_calloc(n, s) kmem_intr_zalloc((n)*(s), KM_SLEEP)
#else
MALLOC_JUSTDEFINE(M_WAPBL, "wapbl", "write-ahead physical block logging");
#define        wapbl_malloc(s) malloc((s), M_WAPBL, M_WAITOK)
@@ -310,7 +310,7 @@ wapbl_sysctl_init(void)
static void
wapbl_init(void)
{
-       malloc_type_attach(M_WAPBL);
+       //malloc_type_attach(M_WAPBL);
       wapbl_sysctl_init();
}

Index: sys/rump/librump/rumpkern/vm.c
===================================================================
RCS file: /cvsroot/src/sys/rump/librump/rumpkern/vm.c,v
retrieving revision 1.120
diff -u -p -r1.120 vm.c
--- sys/rump/librump/rumpkern/vm.c      31 Oct 2011 13:23:55 -0000      1.120
+++ sys/rump/librump/rumpkern/vm.c      23 Jan 2012 22:02:18 -0000
@@ -48,6 +48,7 @@ __KERNEL_RCSID(0, "$NetBSD: vm.c,v 1.120
#include <sys/buf.h>
#include <sys/kernel.h>
#include <sys/kmem.h>
+#include <sys/vmem.h>
#include <sys/mman.h>
#include <sys/null.h>
#include <sys/vnode.h>
@@ -78,11 +79,12 @@ int *uvmexp_pageshift = &uvmexp.pageshif
#endif

struct vm_map rump_vmmap;
-static struct vm_map_kernel kmem_map_store;
-struct vm_map *kmem_map = &kmem_map_store.vmk_map;

-static struct vm_map_kernel kernel_map_store;
-struct vm_map *kernel_map = &kernel_map_store.vmk_map;
+static struct vm_map kernel_map_store;
+struct vm_map *kernel_map = &kernel_map_store;
+
+vmem_t *kmem_arena;
+vmem_t *kmem_va_arena;

static unsigned int pdaemon_waiters;
static kmutex_t pdaemonmtx;
@@ -327,9 +329,17 @@ uvm_init(void)
       cv_init(&oomwait, "oomwait");

       kernel_map->pmap = pmap_kernel();
-       callback_head_init(&kernel_map_store.vmk_reclaim_callback, IPL_VM);
-       kmem_map->pmap = pmap_kernel();
-       callback_head_init(&kmem_map_store.vmk_reclaim_callback, IPL_VM);
+
+       vmem_bootstrap();
+       kmem_arena = vmem_create("kmem", 0, 1024*1024, PAGE_SIZE,
+           NULL, NULL, NULL,
+           0, VM_NOSLEEP | VM_BOOTSTRAP, IPL_VM);
+
+       vmem_init(kmem_arena);
+
+       kmem_va_arena = vmem_create("kva", 0, 0, PAGE_SIZE,
+           vmem_alloc, vmem_free, kmem_arena,
+           32 * PAGE_SIZE, VM_NOSLEEP | VM_BOOTSTRAP, IPL_VM);

       pool_cache_bootstrap(&pagecache, sizeof(struct vm_page), 0, 0, 0,
           "page$", NULL, IPL_NONE, pgctor, pgdtor, NULL);
@@ -357,21 +367,6 @@ uvm_pageunwire(struct vm_page *pg)
       /* nada */
}

-/*
- * The uvm reclaim hook is not currently necessary because it is
- * used only by ZFS and implements exactly the same functionality
- * as the kva reclaim hook which we already run in the pagedaemon
- * (rump vm does not have a concept of uvm_map(), so we cannot
- * reclaim kva it when a mapping operation fails due to insufficient
- * available kva).
- */
-void
-uvm_reclaim_hook_add(struct uvm_reclaim_hook *hook_entry)
-{
-
-}
-__strong_alias(uvm_reclaim_hook_del,uvm_reclaim_hook_add);
-
/* where's your schmonz now? */
#define PUNLIMIT(a)    \
p->p_rlimit[a].rlim_cur = p->p_rlimit[a].rlim_max = RLIM_INFINITY;
@@ -595,13 +590,6 @@ uvm_estimatepageable(int *active, int *i
       *inactive = 1024;
}

-struct vm_map_kernel *
-vm_map_to_kernel(struct vm_map *map)
-{
-
-       return (struct vm_map_kernel *)map;
-}
-
bool
vm_map_starved_p(struct vm_map *map)
{
@@ -735,46 +723,33 @@ uvm_km_free(struct vm_map *map, vaddr_t

struct vm_map *
uvm_km_suballoc(struct vm_map *map, vaddr_t *minaddr, vaddr_t *maxaddr,
-       vsize_t size, int pageable, bool fixed, struct vm_map_kernel *submap)
+       vsize_t size, int pageable, bool fixed, struct vm_map *submap)
{

       return (struct vm_map *)417416;
}

-vaddr_t
-uvm_km_alloc_poolpage(struct vm_map *map, bool waitok)
-{
-
-       return (vaddr_t)rump_hypermalloc(PAGE_SIZE, PAGE_SIZE,
-           waitok, "kmalloc");
-}
-
-void
-uvm_km_free_poolpage(struct vm_map *map, vaddr_t addr)
-{
-
-       rump_hyperfree((void *)addr, PAGE_SIZE);
-}
-
-vaddr_t
-uvm_km_alloc_poolpage_cache(struct vm_map *map, bool waitok)
-{
-
-       return uvm_km_alloc_poolpage(map, waitok);
-}
-
-void
-uvm_km_free_poolpage_cache(struct vm_map *map, vaddr_t vaddr)
+int
+uvm_km_kmem_alloc(vmem_t *vm, vmem_size_t size, vm_flag_t flags,
+    vmem_addr_t *addr)
{
+       vaddr_t va;
+       va = (vaddr_t)rump_hypermalloc(size, PAGE_SIZE,
+           (flags & VM_SLEEP), "kmalloc");

-       uvm_km_free_poolpage(map, vaddr);
+       if (va) {
+               *addr = va;
+               return 0;
+       } else {
+               return ENOMEM;
+       }
}

void
-uvm_km_va_drain(struct vm_map *map, uvm_flag_t flags)
+uvm_km_kmem_free(vmem_t *vm, vmem_addr_t addr, vmem_size_t size)
{

-       /* we eventually maybe want some model for available memory */
+       rump_hyperfree((void *)addr, size);
}

/*
@@ -1013,7 +988,6 @@ uvm_pageout(void *arg)
       for (;;) {
               if (!NEED_PAGEDAEMON()) {
                       kernel_map->flags &= ~VM_MAP_WANTVA;
-                       kmem_map->flags &= ~VM_MAP_WANTVA;
               }

               if (pdaemon_waiters) {
@@ -1027,7 +1001,6 @@ uvm_pageout(void *arg)

               /* tell the world that we are hungry */
               kernel_map->flags |= VM_MAP_WANTVA;
-               kmem_map->flags |= VM_MAP_WANTVA;
               mutex_exit(&pdaemonmtx);

               /*
@@ -1108,15 +1081,6 @@ uvm_pageout(void *arg)
               }

               /*
-                * Still not there?  sleeves come off right about now.
-                * First: do reclaim on kernel/kmem map.
-                */
-               callback_run_roundrobin(&kernel_map_store.vmk_reclaim_callback,
-                   NULL);
-               callback_run_roundrobin(&kmem_map_store.vmk_reclaim_callback,
-                   NULL);
-
-               /*
                * And then drain the pools.  Wipe them out ... all of them.
                */

Index: sys/sys/extent.h
===================================================================
RCS file: /cvsroot/src/sys/sys/extent.h,v
retrieving revision 1.18
diff -u -p -r1.18 extent.h
--- sys/sys/extent.h    28 Apr 2008 20:24:10 -0000      1.18
+++ sys/sys/extent.h    23 Jan 2012 22:02:18 -0000
@@ -54,7 +54,6 @@ struct extent {
       LIST_HEAD(, extent_region) ex_regions;
       u_long  ex_start;               /* start of extent */
       u_long  ex_end;                 /* end of extent */
-       struct malloc_type *ex_mtype;   /* memory type */
       int     ex_flags;               /* misc. information */
};

@@ -79,7 +78,7 @@ struct extent_fixed {
#define EX_FAST                0x02            /* take first fit in extent_alloc() */
#define EX_CATCH       0x04            /* catch signals while sleeping */
#define EX_NOCOALESCE  0x08            /* create a non-coalescing extent */
-#define EX_MALLOCOK    0x10            /* safe to call malloc() */
+#define EX_MALLOCOK    0x10            /* safe to call kmem_alloc() */
#define EX_WAITSPACE   0x20            /* wait for space to become free */
#define EX_BOUNDZERO   0x40            /* boundary lines start at 0 */

@@ -96,10 +95,8 @@ struct extent_fixed {
       ((ALIGN(sizeof(struct extent_region))) *        \
        (_nregions)))

-struct malloc_type;
-
struct extent *extent_create(const char *, u_long, u_long,
-           struct malloc_type *, void *, size_t, int);
+           void *, size_t, int);
void   extent_destroy(struct extent *);
int    extent_alloc_subregion1(struct extent *, u_long, u_long,
           u_long, u_long, u_long, u_long, int, u_long *);
Index: sys/sys/kmem.h
===================================================================
RCS file: /cvsroot/src/sys/sys/kmem.h,v
retrieving revision 1.6
diff -u -p -r1.6 kmem.h
--- sys/sys/kmem.h      21 Nov 2011 04:36:05 -0000      1.6
+++ sys/sys/kmem.h      23 Jan 2012 22:02:18 -0000
@@ -36,6 +36,7 @@ typedef unsigned int km_flag_t;
void *kmem_alloc(size_t, km_flag_t);
void *kmem_zalloc(size_t, km_flag_t);
void kmem_free(void *, size_t);
+
void kmem_init(void);
size_t kmem_roundup_size(size_t);

Index: sys/sys/pool.h
===================================================================
RCS file: /cvsroot/src/sys/sys/pool.h,v
retrieving revision 1.72
diff -u -p -r1.72 pool.h
--- sys/sys/pool.h      21 Nov 2011 04:36:05 -0000      1.72
+++ sys/sys/pool.h      23 Jan 2012 22:02:18 -0000
@@ -67,11 +67,6 @@ struct pool_allocator {
       uint32_t        pa_refcnt;      /* number of pools using this allocator */
       int             pa_pagemask;
       int             pa_pageshift;
-       struct vm_map *pa_backingmap;
-#if defined(_KERNEL)
-       struct vm_map **pa_backingmapptr;
-       SLIST_ENTRY(pool_allocator) pa_q;
-#endif /* defined(_KERNEL) */
};

LIST_HEAD(pool_pagelist,pool_item_header);
@@ -318,6 +313,7 @@ void                pool_cache_bootstrap(pool_cache_t,
                   int (*)(void *, void *, int), void (*)(void *, void *),
                   void *);
void           pool_cache_destroy(pool_cache_t);
+void           pool_cache_bootstrap_destroy(pool_cache_t);
void           *pool_cache_get_paddr(pool_cache_t, int, paddr_t *);
void           pool_cache_put_paddr(pool_cache_t, void *, paddr_t);
void           pool_cache_destruct_object(pool_cache_t, void *);
Index: sys/sys/sysctl.h
===================================================================
RCS file: /cvsroot/src/sys/sys/sysctl.h,v
retrieving revision 1.198
diff -u -p -r1.198 sysctl.h
--- sys/sys/sysctl.h    19 Nov 2011 22:51:31 -0000      1.198
+++ sys/sys/sysctl.h    23 Jan 2012 22:02:19 -0000
@@ -45,6 +45,7 @@
#include <sys/ucred.h>
#include <sys/ucontext.h>
#include <sys/proc.h>
+#include <sys/mallocvar.h>
#include <uvm/uvm_extern.h>


Index: sys/sys/vmem.h
===================================================================
RCS file: /cvsroot/src/sys/sys/vmem.h,v
retrieving revision 1.16
diff -u -p -r1.16 vmem.h
--- sys/sys/vmem.h      21 Nov 2011 04:36:06 -0000      1.16
+++ sys/sys/vmem.h      23 Jan 2012 22:02:19 -0000
@@ -44,9 +44,24 @@ typedef size_t vmem_size_t;
#define        VMEM_ADDR_MIN   0
#define        VMEM_ADDR_MAX   (~(vmem_addr_t)0)

+typedef int (vmem_import_t)(vmem_t *, vmem_size_t, vm_flag_t, vmem_addr_t *);
+typedef void (vmem_release_t)(vmem_t *, vmem_addr_t, vmem_size_t);
+
+typedef int (vmem_ximport_t)(vmem_t *, vmem_size_t, vmem_size_t *,
+    vm_flag_t, vmem_addr_t *);
+
+extern vmem_t *kmem_arena;
+extern vmem_t *kmem_meta_arena;
+extern vmem_t *kmem_va_arena;
+
+void vmem_bootstrap(void);
+void vmem_init(vmem_t *vm);
+
vmem_t *vmem_create(const char *, vmem_addr_t, vmem_size_t, vmem_size_t,
-    int (*)(void *, vmem_size_t, vmem_size_t *, vm_flag_t, vmem_addr_t *),
-    void (*)(void *, vmem_addr_t, vmem_size_t), void *, vmem_size_t,
+    vmem_import_t *, vmem_release_t *, vmem_t *, vmem_size_t,
+    vm_flag_t, int);
+vmem_t *vmem_xcreate(const char *, vmem_addr_t, vmem_size_t, vmem_size_t,
+    vmem_ximport_t *, vmem_release_t *, vmem_t *, vmem_size_t,
    vm_flag_t, int);
void vmem_destroy(vmem_t *);
int vmem_alloc(vmem_t *, vmem_size_t, vm_flag_t, vmem_addr_t *);
@@ -56,7 +71,7 @@ int vmem_xalloc(vmem_t *, vmem_size_t, v
void vmem_xfree(vmem_t *, vmem_addr_t, vmem_size_t);
int vmem_add(vmem_t *, vmem_addr_t, vmem_size_t, vm_flag_t);
vmem_size_t vmem_roundup_size(vmem_t *, vmem_size_t);
-bool vmem_reap(vmem_t *);
+vmem_size_t vmem_size(vmem_t *, int typemask);
void vmem_rehash_start(void);
void vmem_whatis(uintptr_t, void (*)(const char *, ...) __printflike(1, 2));
void vmem_print(uintptr_t, const char *, void (*)(const char *, ...)
@@ -69,5 +84,13 @@ void vmem_printall(const char *, void (*
#define        VM_NOSLEEP      0x00000002
#define        VM_INSTANTFIT   0x00001000
#define        VM_BESTFIT      0x00002000
+#define        VM_BOOTSTRAP    0x00010000
+#define        VM_POPULATING   0x00040000
+#define        VM_LARGEIMPORT  0x00080000
+#define        VM_XIMPORT      0x00100000
+
+/* vmem_size typemask */
+#define VMEM_ALLOC     0x01
+#define VMEM_FREE      0x02

#endif /* !_SYS_VMEM_H_ */
Index: sys/ufs/ext2fs/ext2fs_inode.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ext2fs/ext2fs_inode.c,v
retrieving revision 1.74
diff -u -p -r1.74 ext2fs_inode.c
--- sys/ufs/ext2fs/ext2fs_inode.c       16 Jun 2011 09:21:03 -0000      1.74
+++ sys/ufs/ext2fs/ext2fs_inode.c       23 Jan 2012 22:02:19 -0000
@@ -70,7 +70,7 @@ __KERNEL_RCSID(0, "$NetBSD: ext2fs_inode
#include <sys/buf.h>
#include <sys/vnode.h>
#include <sys/kernel.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/trace.h>
#include <sys/resourcevar.h>
#include <sys/kauth.h>
@@ -499,7 +499,7 @@ ext2fs_indirtrunc(struct inode *ip, dadd
       bap = (int32_t *)bp->b_data;    /* XXX ondisk32 */
       if (lastbn >= 0) {
               /* XXX ondisk32 */
-               copy = malloc(fs->e2fs_bsize, M_TEMP, M_WAITOK);
+               copy = kmem_alloc(fs->e2fs_bsize, KM_SLEEP);
               memcpy((void *)copy, (void *)bap, (u_int)fs->e2fs_bsize);
               memset((void *)&bap[last + 1], 0,
                       (u_int)(NINDIR(fs) - (last + 1)) * sizeof (uint32_t));
@@ -548,7 +548,7 @@ ext2fs_indirtrunc(struct inode *ip, dadd
       }

       if (copy != NULL) {
-               free(copy, M_TEMP);
+               kmem_free(copy, fs->e2fs_bsize);
       } else {
               brelse(bp, BC_INVAL);
       }
Index: sys/ufs/ext2fs/ext2fs_lookup.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ext2fs/ext2fs_lookup.c,v
retrieving revision 1.66
diff -u -p -r1.66 ext2fs_lookup.c
--- sys/ufs/ext2fs/ext2fs_lookup.c      12 Jul 2011 16:59:48 -0000      1.66
+++ sys/ufs/ext2fs/ext2fs_lookup.c      23 Jan 2012 22:02:20 -0000
@@ -57,6 +57,7 @@ __KERNEL_RCSID(0, "$NetBSD: ext2fs_looku
#include <sys/file.h>
#include <sys/mount.h>
#include <sys/vnode.h>
+#include <sys/kmem.h>
#include <sys/malloc.h>
#include <sys/dirent.h>
#include <sys/kauth.h>
@@ -167,15 +168,14 @@ ext2fs_readdir(void *v)
       aiov.iov_len = e2fs_count;
       auio.uio_resid = e2fs_count;
       UIO_SETUP_SYSSPACE(&auio);
-       dirbuf = malloc(e2fs_count, M_TEMP, M_WAITOK);
-       dstd = malloc(sizeof(struct dirent), M_TEMP, M_WAITOK | M_ZERO);
+       dirbuf = kmem_zalloc(e2fs_count, KM_SLEEP);
+       dstd = kmem_zalloc(sizeof(struct dirent), KM_SLEEP);
       if (ap->a_ncookies) {
               nc = e2fs_count / _DIRENT_MINSIZE((struct dirent *)0);
               ncookies = nc;
               cookies = malloc(sizeof (off_t) * ncookies, M_TEMP, M_WAITOK);
               *ap->a_cookies = cookies;
       }
-       memset(dirbuf, 0, e2fs_count);
       aiov.iov_base = dirbuf;

       error = VOP_READ(ap->a_vp, &auio, 0, ap->a_cred);
@@ -209,8 +209,8 @@ ext2fs_readdir(void *v)
               /* we need to correct uio_offset */
               uio->uio_offset = off;
       }
-       free(dirbuf, M_TEMP);
-       free(dstd, M_TEMP);
+       kmem_free(dirbuf, e2fs_count);
+       kmem_free(dstd, sizeof(*dstd));
       *ap->a_eofflag = ext2fs_size(VTOI(ap->a_vp)) <= uio->uio_offset;
       if (ap->a_ncookies) {
               if (error) {
Index: sys/ufs/ffs/ffs_inode.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ffs/ffs_inode.c,v
retrieving revision 1.108
diff -u -p -r1.108 ffs_inode.c
--- sys/ufs/ffs/ffs_inode.c     23 Nov 2011 19:42:10 -0000      1.108
+++ sys/ufs/ffs/ffs_inode.c     23 Jan 2012 22:02:20 -0000
@@ -75,7 +75,7 @@ __KERNEL_RCSID(0, "$NetBSD: ffs_inode.c,
#include <sys/fstrans.h>
#include <sys/kauth.h>
#include <sys/kernel.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/mount.h>
#include <sys/proc.h>
#include <sys/resourcevar.h>
@@ -621,7 +621,7 @@ ffs_indirtrunc(struct inode *ip, daddr_t
       else
               bap2 = (int64_t *)bp->b_data;
       if (lastbn >= 0) {
-               copy = malloc(fs->fs_bsize, M_TEMP, M_WAITOK);
+               copy = kmem_alloc(fs->fs_bsize, KM_SLEEP);
               memcpy((void *)copy, bp->b_data, (u_int)fs->fs_bsize);
               for (i = last + 1; i < NINDIR(fs); i++)
                       BAP_ASSIGN(ip, i, 0);
@@ -676,7 +676,7 @@ ffs_indirtrunc(struct inode *ip, daddr_t
       }

       if (copy != NULL) {
-               free(copy, M_TEMP);
+               kmem_free(copy, fs->fs_bsize);
       } else {
               brelse(bp, BC_INVAL);
       }
Index: sys/ufs/ffs/ffs_vfsops.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ffs/ffs_vfsops.c,v
retrieving revision 1.272
diff -u -p -r1.272 ffs_vfsops.c
--- sys/ufs/ffs/ffs_vfsops.c    3 Jan 2012 15:44:00 -0000       1.272
+++ sys/ufs/ffs/ffs_vfsops.c    23 Jan 2012 22:02:20 -0000
@@ -85,7 +85,7 @@ __KERNEL_RCSID(0, "$NetBSD: ffs_vfsops.c
#include <sys/disklabel.h>
#include <sys/ioctl.h>
#include <sys/errno.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/pool.h>
#include <sys/lock.h>
#include <sys/sysctl.h>
@@ -648,7 +648,7 @@ ffs_reload(struct mount *mp, kauth_cred_
               brelse(bp, 0);
               return (error);
       }
-       newfs = malloc(fs->fs_sbsize, M_UFSMNT, M_WAITOK);
+       newfs = kmem_alloc(fs->fs_sbsize, KM_SLEEP);
       memcpy(newfs, bp->b_data, fs->fs_sbsize);
#ifdef FFS_EI
       if (ump->um_flags & UFS_NEEDSWAP) {
@@ -662,7 +662,7 @@ ffs_reload(struct mount *mp, kauth_cred_
            newfs->fs_bsize > MAXBSIZE ||
            newfs->fs_bsize < sizeof(struct fs)) {
               brelse(bp, 0);
-               free(newfs, M_UFSMNT);
+               kmem_free(newfs, fs->fs_sbsize);
               return (EIO);           /* XXX needs translation */
       }
       /* Store off old fs_sblockloc for fs_oldfscompat_read. */
@@ -679,7 +679,7 @@ ffs_reload(struct mount *mp, kauth_cred_
       newfs->fs_active = fs->fs_active;
       memcpy(fs, newfs, (u_int)fs->fs_sbsize);
       brelse(bp, 0);
-       free(newfs, M_UFSMNT);
+       kmem_free(newfs, fs->fs_sbsize);

       /* Recheck for apple UFS filesystem */
       ump->um_flags &= ~UFS_ISAPPLEUFS;
@@ -865,6 +865,7 @@ ffs_mountfs(struct vnode *devvp, struct
       int32_t *lp;
       kauth_cred_t cred;
       u_int32_t sbsize = 8192;        /* keep gcc happy*/
+       u_int32_t allocsbsize;
       int32_t fsbsize;

       dev = devvp->v_rdev;
@@ -889,7 +890,7 @@ ffs_mountfs(struct vnode *devvp, struct
       if (error)
               return error;

-       ump = malloc(sizeof *ump, M_UFSMNT, M_WAITOK);
+       ump = kmem_alloc(sizeof(*ump), KM_SLEEP);
       memset(ump, 0, sizeof *ump);
       mutex_init(&ump->um_lock, MUTEX_DEFAULT, IPL_NONE);
       error = ffs_snapshot_init(ump);
@@ -986,7 +987,7 @@ ffs_mountfs(struct vnode *devvp, struct
               break;
       }

-       fs = malloc((u_long)sbsize, M_UFSMNT, M_WAITOK);
+       fs = kmem_alloc((u_long)sbsize, KM_SLEEP);
       memcpy(fs, bp->b_data, sbsize);
       ump->um_fs = fs;

@@ -1023,7 +1024,7 @@ ffs_mountfs(struct vnode *devvp, struct
                       /* Force a re-read of the superblock */
                       brelse(bp, BC_INVAL);
                       bp = NULL;
-                       free(fs, M_UFSMNT);
+                       kmem_free(fs, sbsize);
                       fs = NULL;
                       goto sbagain;
               }
@@ -1150,7 +1151,8 @@ ffs_mountfs(struct vnode *devvp, struct
       if (fs->fs_contigsumsize > 0)
               bsize += fs->fs_ncg * sizeof(int32_t);
       bsize += fs->fs_ncg * sizeof(*fs->fs_contigdirs);
-       space = malloc((u_long)bsize, M_UFSMNT, M_WAITOK);
+       allocsbsize = bsize;
+       space = kmem_alloc((u_long)allocsbsize, KM_SLEEP);
       fs->fs_csp = space;
       for (i = 0; i < blks; i += fs->fs_frag) {
               bsize = fs->fs_bsize;
@@ -1159,7 +1161,7 @@ ffs_mountfs(struct vnode *devvp, struct
               error = bread(devvp, fsbtodb(fs, fs->fs_csaddr + i), bsize,
                             cred, 0, &bp);
               if (error) {
-                       free(fs->fs_csp, M_UFSMNT);
+                       kmem_free(fs->fs_csp, allocsbsize);
                       goto out;
               }
#ifdef FFS_EI
@@ -1243,7 +1245,7 @@ ffs_mountfs(struct vnode *devvp, struct

               error = ffs_wapbl_start(mp);
               if (error) {
-                       free(fs->fs_csp, M_UFSMNT);
+                       kmem_free(fs->fs_csp, allocsbsize);
                       goto out;
               }
       }
@@ -1252,7 +1254,7 @@ ffs_mountfs(struct vnode *devvp, struct
#ifdef QUOTA2
               error = ffs_quota2_mount(mp);
               if (error) {
-                       free(fs->fs_csp, M_UFSMNT);
+                       kmem_free(fs->fs_csp, allocsbsize);
                       goto out;
               }
#else
@@ -1263,7 +1265,7 @@ ffs_mountfs(struct vnode *devvp, struct
                           (mp->mnt_flag & MNT_FORCE) ? "" : ", not mounting");
                       if ((mp->mnt_flag & MNT_FORCE) == 0) {
                               error = EINVAL;
-                               free(fs->fs_csp, M_UFSMNT);
+                               kmem_free(fs->fs_csp, allocsbsize);
                               goto out;
                       }
               }
@@ -1290,15 +1292,15 @@ out:

       fstrans_unmount(mp);
       if (fs)
-               free(fs, M_UFSMNT);
+               kmem_free(fs, fs->fs_sbsize);
       devvp->v_specmountpoint = NULL;
       if (bp)
               brelse(bp, bset);
       if (ump) {
               if (ump->um_oldfscompat)
-                       free(ump->um_oldfscompat, M_UFSMNT);
+                       kmem_free(ump->um_oldfscompat, 512 + 3*sizeof(int32_t));
               mutex_destroy(&ump->um_lock);
-               free(ump, M_UFSMNT);
+               kmem_free(ump, sizeof(*ump));
               mp->mnt_data = NULL;
       }
       return (error);
@@ -1322,8 +1324,8 @@ ffs_oldfscompat_read(struct fs *fs, stru
               return;

       if (!ump->um_oldfscompat)
-               ump->um_oldfscompat = malloc(512 + 3*sizeof(int32_t),
-                   M_UFSMNT, M_WAITOK);
+               ump->um_oldfscompat = kmem_alloc(512 + 3*sizeof(int32_t),
+                   KM_SLEEP);

       memcpy(ump->um_oldfscompat, &fs->fs_old_postbl_start, 512);
       extrasave = ump->um_oldfscompat;
@@ -1429,6 +1431,7 @@ ffs_unmount(struct mount *mp, int mntfla
       struct ufsmount *ump = VFSTOUFS(mp);
       struct fs *fs = ump->um_fs;
       int error, flags;
+       u_int32_t bsize;
#ifdef WAPBL
       extern int doforce;
#endif
@@ -1475,13 +1478,19 @@ ffs_unmount(struct mount *mp, int mntfla
       (void)VOP_CLOSE(ump->um_devvp, fs->fs_ronly ? FREAD : FREAD | FWRITE,
               NOCRED);
       vput(ump->um_devvp);
-       free(fs->fs_csp, M_UFSMNT);
-       free(fs, M_UFSMNT);
+
+       bsize = fs->fs_cssize;
+       if (fs->fs_contigsumsize > 0)
+               bsize += fs->fs_ncg * sizeof(int32_t);
+       bsize += fs->fs_ncg * sizeof(*fs->fs_contigdirs);
+       kmem_free(fs->fs_csp, bsize);
+
+       kmem_free(fs, fs->fs_sbsize);
       if (ump->um_oldfscompat != NULL)
-               free(ump->um_oldfscompat, M_UFSMNT);
+               kmem_free(ump->um_oldfscompat, 512 + 3*sizeof(int32_t));
       mutex_destroy(&ump->um_lock);
       ffs_snapshot_fini(ump);
-       free(ump, M_UFSMNT);
+       kmem_free(ump, sizeof(*ump));
       mp->mnt_data = NULL;
       mp->mnt_flag &= ~MNT_LOCAL;
       fstrans_unmount(mp);
Index: sys/ufs/ufs/ufs_extattr.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ufs/ufs_extattr.c,v
retrieving revision 1.35
diff -u -p -r1.35 ufs_extattr.c
--- sys/ufs/ufs/ufs_extattr.c   7 Jul 2011 14:56:45 -0000       1.35
+++ sys/ufs/ufs/ufs_extattr.c   23 Jan 2012 22:02:21 -0000
@@ -60,7 +60,7 @@ __KERNEL_RCSID(0, "$NetBSD: ufs_extattr.
#include <sys/kauth.h>
#include <sys/kernel.h>
#include <sys/namei.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/fcntl.h>
#include <sys/lwp.h>
#include <sys/vnode.h>
@@ -77,8 +77,6 @@ __KERNEL_RCSID(0, "$NetBSD: ufs_extattr.
#include <ufs/ufs/ufs_bswap.h>
#include <ufs/ufs/ufs_extern.h>

-static MALLOC_JUSTDEFINE(M_UFS_EXTATTR, "ufs_extattr","ufs extended attribute");
-
int ufs_extattr_sync = 1;
int ufs_extattr_autocreate = 1024;

@@ -506,7 +504,7 @@ ufs_extattr_iterate_directory(struct ufs
       if (dvp->v_type != VDIR)
               return (ENOTDIR);

-       dirbuf = malloc(DIRBLKSIZ, M_TEMP, M_WAITOK);
+       dirbuf = kmem_alloc(DIRBLKSIZ, KM_SLEEP);

       auio.uio_iov = &aiov;
       auio.uio_iovcnt = 1;
@@ -578,7 +576,7 @@ ufs_extattr_iterate_directory(struct ufs
                               break;
               }
       }
-       free(dirbuf, M_TEMP);
+       kmem_free(dirbuf, DIRBLKSIZ);

       return (0);
}
@@ -736,8 +734,7 @@ ufs_extattr_enable(struct ufsmount *ump,
       if (backing_vnode->v_type != VREG)
               return (EINVAL);

-       attribute = malloc(sizeof(*attribute), M_UFS_EXTATTR,
-           M_WAITOK | M_ZERO);
+       attribute = kmem_zalloc(sizeof(*attribute), KM_SLEEP);

       if (!(ump->um_extattr.uepm_flags & UFS_EXTATTR_UEPM_STARTED)) {
               error = EOPNOTSUPP;
@@ -818,7 +815,7 @@ ufs_extattr_enable(struct ufsmount *ump,
       VOP_UNLOCK(backing_vnode);

 free_exit:
-       free(attribute, M_UFS_EXTATTR);
+       kmem_free(attribute, sizeof(*attribute));
       return (error);
}

@@ -844,7 +841,7 @@ ufs_extattr_disable(struct ufsmount *ump
       error = vn_close(uele->uele_backing_vnode, FREAD|FWRITE,
           l->l_cred);

-       free(uele, M_UFS_EXTATTR);
+       kmem_free(uele, sizeof(*uele));

       return (error);
}
@@ -1540,12 +1537,10 @@ void
ufs_extattr_init(void)
{

-       malloc_type_attach(M_UFS_EXTATTR);
}

void
ufs_extattr_done(void)
{

-       malloc_type_detach(M_UFS_EXTATTR);
}
Index: sys/ufs/ufs/ufs_vfsops.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ufs/ufs_vfsops.c,v
retrieving revision 1.42
diff -u -p -r1.42 ufs_vfsops.c
--- sys/ufs/ufs/ufs_vfsops.c    24 Mar 2011 17:05:46 -0000      1.42
+++ sys/ufs/ufs/ufs_vfsops.c    23 Jan 2012 22:02:21 -0000
@@ -50,7 +50,7 @@ __KERNEL_RCSID(0, "$NetBSD: ufs_vfsops.c
#include <sys/proc.h>
#include <sys/buf.h>
#include <sys/vnode.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>
#include <sys/kauth.h>

#include <miscfs/specfs/specdev.h>
Index: sys/ufs/ufs/ufs_vnops.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ufs/ufs_vnops.c,v
retrieving revision 1.206
diff -u -p -r1.206 ufs_vnops.c
--- sys/ufs/ufs/ufs_vnops.c     18 Nov 2011 21:18:52 -0000      1.206
+++ sys/ufs/ufs/ufs_vnops.c     23 Jan 2012 22:02:21 -0000
@@ -84,6 +84,7 @@ __KERNEL_RCSID(0, "$NetBSD: ufs_vnops.c,
#include <sys/proc.h>
#include <sys/mount.h>
#include <sys/vnode.h>
+#include <sys/kmem.h>
#include <sys/malloc.h>
#include <sys/dirent.h>
#include <sys/lockf.h>
@@ -2329,7 +2330,7 @@ ufs_readdir(void *v)
       struct uio      auio, *uio;
       struct iovec    aiov;
       int             error;
-       size_t          count, ccount, rcount;
+       size_t          count, ccount, rcount, cdbufsz, ndbufsz;
       off_t           off, *ccp;
       off_t           startoff;
       size_t          skipbytes;
@@ -2357,12 +2358,13 @@ ufs_readdir(void *v)
       auio.uio_resid = rcount;
       UIO_SETUP_SYSSPACE(&auio);
       auio.uio_rw = UIO_READ;
-       cdbuf = malloc(rcount, M_TEMP, M_WAITOK);
+       cdbufsz = rcount;
+       cdbuf = kmem_alloc(cdbufsz, KM_SLEEP);
       aiov.iov_base = cdbuf;
       aiov.iov_len = rcount;
       error = VOP_READ(vp, &auio, 0, ap->a_cred);
       if (error != 0) {
-               free(cdbuf, M_TEMP);
+               kmem_free(cdbuf, cdbufsz);
               return error;
       }

@@ -2371,7 +2373,8 @@ ufs_readdir(void *v)
       cdp = (struct direct *)(void *)cdbuf;
       ecdp = (struct direct *)(void *)&cdbuf[rcount];

-       ndbuf = malloc(count, M_TEMP, M_WAITOK);
+       ndbufsz = count;
+       ndbuf = kmem_alloc(ndbufsz, KM_SLEEP);
       ndp = (struct dirent *)(void *)ndbuf;
       endp = &ndbuf[count];

@@ -2445,8 +2448,8 @@ out:
               }
       }
       uio->uio_offset = off;
-       free(ndbuf, M_TEMP);
-       free(cdbuf, M_TEMP);
+       kmem_free(ndbuf, ndbufsz);
+       kmem_free(cdbuf, cdbufsz);
       *ap->a_eofflag = VTOI(vp)->i_size <= uio->uio_offset;
       return error;
}
Index: sys/ufs/ufs/ufs_wapbl.c
===================================================================
RCS file: /cvsroot/src/sys/ufs/ufs/ufs_wapbl.c,v
retrieving revision 1.22
diff -u -p -r1.22 ufs_wapbl.c
--- sys/ufs/ufs/ufs_wapbl.c     18 Jul 2011 06:46:05 -0000      1.22
+++ sys/ufs/ufs/ufs_wapbl.c     23 Jan 2012 22:02:22 -0000
@@ -79,7 +79,6 @@ __KERNEL_RCSID(0, "$NetBSD: ufs_wapbl.c,
#include <sys/proc.h>
#include <sys/mount.h>
#include <sys/vnode.h>
-#include <sys/malloc.h>
#include <sys/dirent.h>
#include <sys/lockf.h>
#include <sys/kauth.h>
Index: sys/uvm/uvm_amap.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_amap.c,v
retrieving revision 1.104
diff -u -p -r1.104 uvm_amap.c
--- sys/uvm/uvm_amap.c  11 Oct 2011 23:57:50 -0000      1.104
+++ sys/uvm/uvm_amap.c  23 Jan 2012 22:02:22 -0000
@@ -800,11 +800,11 @@ amap_copy(struct vm_map *map, struct vm_
                       UVMHIST_LOG(maphist, "  chunk amap ==> clip 0x%x->0x%x"
                           "to 0x%x->0x%x", entry->start, entry->end, startva,
                           endva);
-                       UVM_MAP_CLIP_START(map, entry, startva, NULL);
+                       UVM_MAP_CLIP_START(map, entry, startva);

                       /* Watch out for endva wrap-around! */
                       if (endva >= startva) {
-                               UVM_MAP_CLIP_END(map, entry, endva, NULL);
+                               UVM_MAP_CLIP_END(map, entry, endva);
                       }
               }

Index: sys/uvm/uvm_device.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_device.c,v
retrieving revision 1.62
diff -u -p -r1.62 uvm_device.c
--- sys/uvm/uvm_device.c        12 Jun 2011 03:36:02 -0000      1.62
+++ sys/uvm/uvm_device.c        23 Jan 2012 22:02:22 -0000
@@ -40,7 +40,7 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_device.c
#include <sys/systm.h>
#include <sys/conf.h>
#include <sys/proc.h>
-#include <sys/malloc.h>
+#include <sys/kmem.h>

#include <uvm/uvm.h>
#include <uvm/uvm_device.h>
@@ -216,7 +216,7 @@ udv_attach(void *arg, vm_prot_t accesspr
               mutex_exit(&udv_lock);

               /* Note: both calls may allocate memory and sleep. */
-               udv = malloc(sizeof(*udv), M_TEMP, M_WAITOK);
+               udv = kmem_alloc(sizeof(*udv), KM_SLEEP);
               uvm_obj_init(&udv->u_obj, &uvm_deviceops, true, 1);

               mutex_enter(&udv_lock);
@@ -239,7 +239,7 @@ udv_attach(void *arg, vm_prot_t accesspr
               if (lcv) {
                       mutex_exit(&udv_lock);
                       uvm_obj_destroy(&udv->u_obj, true);
-                       free(udv, M_TEMP);
+                       kmem_free(udv, sizeof(*udv));
                       continue;
               }

@@ -329,7 +329,7 @@ again:
       mutex_exit(uobj->vmobjlock);

       uvm_obj_destroy(uobj, true);
-       free(udv, M_TEMP);
+       kmem_free(udv, sizeof(*udv));
       UVMHIST_LOG(maphist," <- done, freed uobj=0x%x", uobj,0,0,0);
}

Index: sys/uvm/uvm_extern.h
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_extern.h,v
retrieving revision 1.179
diff -u -p -r1.179 uvm_extern.h
--- sys/uvm/uvm_extern.h        5 Jan 2012 15:19:53 -0000       1.179
+++ sys/uvm/uvm_extern.h        23 Jan 2012 22:02:22 -0000
@@ -138,8 +138,7 @@ typedef voff_t pgoff_t;             /* XXX: number
#define UVM_FLAG_AMAPPAD 0x100000 /* for bss: pad amap to reduce allocations */
#define UVM_FLAG_TRYLOCK 0x200000 /* fail if we can not lock map */
#define UVM_FLAG_NOWAIT  0x400000 /* not allowed to sleep */
-#define UVM_FLAG_QUANTUM 0x800000 /* entry can never be split later */
-#define UVM_FLAG_WAITVA  0x1000000 /* wait for va */
+#define UVM_FLAG_WAITVA  0x800000 /* wait for va */
#define UVM_FLAG_VAONLY  0x2000000 /* unmap: no pages are mapped */
#define UVM_FLAG_COLORMATCH 0x4000000 /* match color given in off */

@@ -471,6 +470,9 @@ extern bool vm_page_zero_enable;
#include <sys/vmmeter.h>
#include <sys/queue.h>
#include <sys/lock.h>
+#ifdef _KERNEL
+#include <sys/vmem.h>
+#endif
#include <uvm/uvm_param.h>
#include <uvm/uvm_prot.h>
#include <uvm/uvm_pmap.h>
@@ -530,23 +532,9 @@ struct uvm_coredump_state {
#define        UVM_COREDUMP_STACK      0x01    /* region is user stack */

/*
- * Structure containig uvm reclaim hooks, uvm_reclaim_list is guarded by
- * uvm_reclaim_lock.
- */
-struct uvm_reclaim_hook {
-       void (*uvm_reclaim_hook)(void);
-       SLIST_ENTRY(uvm_reclaim_hook) uvm_reclaim_next;
-};
-
-void   uvm_reclaim_init(void);
-void   uvm_reclaim_hook_add(struct uvm_reclaim_hook *);
-void   uvm_reclaim_hook_del(struct uvm_reclaim_hook *);
-
-/*
 * the various kernel maps, owned by MD code
 */
extern struct vm_map *kernel_map;
-extern struct vm_map *kmem_map;
extern struct vm_map *phys_map;

/*
@@ -555,9 +543,6 @@ extern struct vm_map *phys_map;

#define vm_resident_count(vm) (pmap_resident_count((vm)->vm_map.pmap))

-#include <sys/mallocvar.h>
-MALLOC_DECLARE(M_VMMAP);
-MALLOC_DECLARE(M_VMPMAP);

/* vm_machdep.c */
int            vmapbuf(struct buf *, vsize_t);
@@ -649,13 +634,13 @@ void                      uvm_km_free(struct vm_map *, vadd

struct vm_map          *uvm_km_suballoc(struct vm_map *, vaddr_t *,
                           vaddr_t *, vsize_t, int, bool,
-                           struct vm_map_kernel *);
-vaddr_t                        uvm_km_alloc_poolpage(struct vm_map *, bool);
-void                   uvm_km_free_poolpage(struct vm_map *, vaddr_t);
-vaddr_t                        uvm_km_alloc_poolpage_cache(struct vm_map *, bool);
-void                   uvm_km_free_poolpage_cache(struct vm_map *, vaddr_t);
-void                   uvm_km_vacache_init(struct vm_map *,
-                           const char *, size_t);
+                           struct vm_map *);
+#ifdef _KERNEL
+int                    uvm_km_kmem_alloc(vmem_t *, vmem_size_t, vm_flag_t,
+                           vmem_addr_t *);
+void                   uvm_km_kmem_free(vmem_t *, vmem_addr_t, vmem_size_t);
+bool                   uvm_km_va_starved_p(void);
+#endif

/* uvm_map.c */
int                    uvm_map(struct vm_map *, vaddr_t *, vsize_t,
@@ -764,9 +749,8 @@ bool                        uvn_clean_p(struct uvm_object *);
bool                   uvn_needs_writefault_p(struct uvm_object *);

/* kern_malloc.c */
-void                   kmeminit_nkmempages(void);
void                   kmeminit(void);
-extern int             nkmempages;
+void                   kmeminit_nkmempages(void);

#endif /* _KERNEL */

Index: sys/uvm/uvm_fault.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_fault.c,v
retrieving revision 1.191
diff -u -p -r1.191 uvm_fault.c
--- sys/uvm/uvm_fault.c 28 Nov 2011 14:06:59 -0000      1.191
+++ sys/uvm/uvm_fault.c 23 Jan 2012 22:02:23 -0000
@@ -583,25 +583,8 @@ uvmfault_promote(struct uvm_faultinfo *u
       if (*spare != NULL) {
               anon = *spare;
               *spare = NULL;
-       } else if (ufi->map != kernel_map) {
-               anon = uvm_analloc();
       } else {
-               UVMHIST_LOG(maphist, "kernel_map, unlock and retry", 0,0,0,0);
-
-               /*
-                * we can't allocate anons with kernel_map locked.
-                */
-
-               uvm_page_unbusy(&uobjpage, 1);
-               uvmfault_unlockall(ufi, amap, uobj);
-
-               *spare = uvm_analloc();
-               if (*spare == NULL) {
-                       goto nomem;
-               }
-               KASSERT((*spare)->an_lock == NULL);
-               error = ERESTART;
-               goto done;
+               anon = uvm_analloc();
       }
       if (anon) {

@@ -636,7 +619,6 @@ uvmfault_promote(struct uvm_faultinfo *u
               /* unlock and fail ... */
               uvm_page_unbusy(&uobjpage, 1);
               uvmfault_unlockall(ufi, amap, uobj);
-nomem:
               if (!uvm_reclaimable()) {
                       UVMHIST_LOG(maphist, "out of VM", 0,0,0,0);
                       uvmexp.fltnoanon++;
Index: sys/uvm/uvm_glue.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_glue.c,v
retrieving revision 1.152
diff -u -p -r1.152 uvm_glue.c
--- sys/uvm/uvm_glue.c  23 Nov 2011 01:07:50 -0000      1.152
+++ sys/uvm/uvm_glue.c  23 Jan 2012 22:02:23 -0000
@@ -240,26 +240,15 @@ static pool_cache_t uvm_uarea_system_cac
static void *
uarea_poolpage_alloc(struct pool *pp, int flags)
{
-#if defined(PMAP_MAP_POOLPAGE)
-       if (USPACE == PAGE_SIZE && USPACE_ALIGN == 0) {
-               struct vm_page *pg;
-               vaddr_t va;
-
-#if defined(PMAP_ALLOC_POOLPAGE)
-               pg = PMAP_ALLOC_POOLPAGE(
-                  ((flags & PR_WAITOK) == 0 ? UVM_KMF_NOWAIT : 0));
-#else
-               pg = uvm_pagealloc(NULL, 0, NULL,
-                  ((flags & PR_WAITOK) == 0 ? UVM_KMF_NOWAIT : 0));
-#endif
-               if (pg == NULL)
-                       return NULL;
-               va = PMAP_MAP_POOLPAGE(VM_PAGE_TO_PHYS(pg));
-               if (va == 0)
-                       uvm_pagefree(pg);
-               return (void *)va;
+       if (USPACE_ALIGN == 0) {
+               int rc;
+               vmem_addr_t va;
+
+               rc = uvm_km_kmem_alloc(kmem_va_arena, USPACE,
+                   ((flags & PR_WAITOK) ? VM_SLEEP: VM_NOSLEEP) |
+                   VM_INSTANTFIT, &va);
+               return (rc != 0) ? NULL : (void *)va;
       }
-#endif
#if defined(__HAVE_CPU_UAREA_ROUTINES)
       void *va = cpu_uarea_alloc(false);
       if (va)
@@ -274,16 +263,10 @@ uarea_poolpage_alloc(struct pool *pp, in
static void
uarea_poolpage_free(struct pool *pp, void *addr)
{
-#if defined(PMAP_MAP_POOLPAGE)
-       if (USPACE == PAGE_SIZE && USPACE_ALIGN == 0) {
-               paddr_t pa;
-
-               pa = PMAP_UNMAP_POOLPAGE((vaddr_t) addr);
-               KASSERT(pa != 0);
-               uvm_pagefree(PHYS_TO_VM_PAGE(pa));
+       if (USPACE_ALIGN == 0) {
+               uvm_km_kmem_free(kmem_va_arena, (vmem_addr_t)addr, USPACE);
               return;
       }
-#endif
#if defined(__HAVE_CPU_UAREA_ROUTINES)
       if (cpu_uarea_free(addr))
               return;
Index: sys/uvm/uvm_init.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_init.c,v
retrieving revision 1.41
diff -u -p -r1.41 uvm_init.c
--- sys/uvm/uvm_init.c  24 Apr 2011 03:56:50 -0000      1.41
+++ sys/uvm/uvm_init.c  23 Jan 2012 22:02:23 -0000
@@ -91,7 +91,6 @@ uvm_init(void)

       memset(&uvm, 0, sizeof(uvm));
       averunnable.fscale = FSCALE;
-       uvm_amap_init();

       /*
        * step 2: init the page sub-system.  this includes allocating the
@@ -104,9 +103,7 @@ uvm_init(void)
       uvm_page_init(&kvm_start, &kvm_end);

       /*
-        * step 3: init the map sub-system.  allocates the static pool of
-        * vm_map_entry structures that are used for "special" kernel maps
-        * (e.g. kernel_map, kmem_map, etc...).
+        * step 3: init the map sub-system.
        */

       uvm_map_init();
@@ -114,9 +111,18 @@ uvm_init(void)
       /*
        * step 4: setup the kernel's virtual memory data structures.  this
        * includes setting up the kernel_map/kernel_object.
+        * Bootstrap all kernel memory allocators.
        */

-       uvm_km_init(kvm_start, kvm_end);
+       uao_init();
+       uvm_km_bootstrap(kvm_start, kvm_end);
+
+       /*
+        * step 5: setup uvm_map pool_caches and init the amap.
+        */
+
+       uvm_map_init_caches();
+       uvm_amap_init();

       /*
        * step 5: init the pmap module.   the pmap module is free to allocate
@@ -125,38 +131,24 @@ uvm_init(void)

       pmap_init();

-       /*
-        * step 6: init the kernel memory allocator.   after this call the
-        * kernel memory allocator (malloc) can be used. this includes
-        * setting up the kmem_map.
+       /* step 6: init the kernel maps virtual address caches.
+        * make kernel memory allocator ready for use.
+         * After this call the pool/kmem memory allocators can be used.
        */

-       kmeminit();
+       uvm_km_init();

#ifdef DEBUG
       debug_init();
#endif

       /*
-        * step 7: init all pagers and the pager_map.
+        * step 6: init all pagers and the pager_map.
        */

       uvm_pager_init();

       /*
-        * Initialize pools.  This must be done before anyone manipulates
-        * any vm_maps because we use a pool for some map entry structures.
-        */
-
-       pool_subsystem_init();
-
-       /*
-        * init slab memory allocator kmem(9).
-        */
-
-       kmem_init();
-
-       /*
        * Initialize the uvm_loan() facility.
        */

Index: sys/uvm/uvm_io.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_io.c,v
retrieving revision 1.26
diff -u -p -r1.26 uvm_io.c
--- sys/uvm/uvm_io.c    23 Apr 2011 18:14:12 -0000      1.26
+++ sys/uvm/uvm_io.c    23 Jan 2012 22:02:23 -0000
@@ -129,7 +129,7 @@ uvm_io(struct vm_map *map, struct uio *u

               vm_map_lock(kernel_map);
               uvm_unmap_remove(kernel_map, kva, kva + chunksz, &dead_entries,
-                   NULL, 0);
+                  0);
               vm_map_unlock(kernel_map);
               if (dead_entries != NULL)
                       uvm_unmap_detach(dead_entries, AMAP_REFALL);
Index: sys/uvm/uvm_km.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_km.c,v
retrieving revision 1.111
diff -u -p -r1.111 uvm_km.c
--- sys/uvm/uvm_km.c    1 Sep 2011 06:40:28 -0000       1.111
+++ sys/uvm/uvm_km.c    23 Jan 2012 22:02:23 -0000
@@ -84,8 +84,6 @@
 * chunks.
 *
 * the vm system has several standard kernel submaps, including:
- *   kmem_map => contains only wired kernel memory for the kernel
- *             malloc.
 *   pager_map => used to map "buf" structures into kernel space
 *   exec_map => used during exec to handle exec args
 *   etc...
@@ -127,10 +125,11 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_km.c,v 1
#include "opt_uvmhist.h"

#include <sys/param.h>
-#include <sys/malloc.h>
#include <sys/systm.h>
#include <sys/proc.h>
#include <sys/pool.h>
+#include <sys/vmem.h>
+#include <sys/kmem.h>

#include <uvm/uvm.h>

@@ -144,126 +143,18 @@ struct vm_map *kernel_map = NULL;
 * local data structues
 */

-static struct vm_map_kernel    kernel_map_store;
-static struct vm_map_entry     kernel_first_mapent_store;
+static struct vm_map           kernel_map_store;
+static struct vm_map_entry     kernel_image_mapent_store;
+static struct vm_map_entry     kernel_kmem_mapent_store;

-#if !defined(PMAP_MAP_POOLPAGE)
+vaddr_t kmembase;
+vsize_t kmemsize;

-/*
- * kva cache
- *
- * XXX maybe it's better to do this at the uvm_map layer.
- */
-
-#define        KM_VACACHE_SIZE (32 * PAGE_SIZE) /* XXX tune */
-
-static void *km_vacache_alloc(struct pool *, int);
-static void km_vacache_free(struct pool *, void *);
-static void km_vacache_init(struct vm_map *, const char *, size_t);
-
-/* XXX */
-#define        KM_VACACHE_POOL_TO_MAP(pp) \
-       ((struct vm_map *)((char *)(pp) - \
-           offsetof(struct vm_map_kernel, vmk_vacache)))
-
-static void *
-km_vacache_alloc(struct pool *pp, int flags)
-{
-       vaddr_t va;
-       size_t size;
-       struct vm_map *map;
-       size = pp->pr_alloc->pa_pagesz;
-
-       map = KM_VACACHE_POOL_TO_MAP(pp);
-
-       va = vm_map_min(map); /* hint */
-       if (uvm_map(map, &va, size, NULL, UVM_UNKNOWN_OFFSET, size,
-           UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, UVM_INH_NONE,
-           UVM_ADV_RANDOM, UVM_FLAG_QUANTUM |
-           ((flags & PR_WAITOK) ? UVM_FLAG_WAITVA :
-           UVM_FLAG_TRYLOCK | UVM_FLAG_NOWAIT))))
-               return NULL;
-
-       return (void *)va;
-}
-
-static void
-km_vacache_free(struct pool *pp, void *v)
-{
-       vaddr_t va = (vaddr_t)v;
-       size_t size = pp->pr_alloc->pa_pagesz;
-       struct vm_map *map;
-
-       map = KM_VACACHE_POOL_TO_MAP(pp);
-       uvm_unmap1(map, va, va + size, UVM_FLAG_QUANTUM|UVM_FLAG_VAONLY);
-}
-
-/*
- * km_vacache_init: initialize kva cache.
- */
-
-static void
-km_vacache_init(struct vm_map *map, const char *name, size_t size)
-{
-       struct vm_map_kernel *vmk;
-       struct pool *pp;
-       struct pool_allocator *pa;
-       int ipl;
-
-       KASSERT(VM_MAP_IS_KERNEL(map));
-       KASSERT(size < (vm_map_max(map) - vm_map_min(map)) / 2); /* sanity */
-
-
-       vmk = vm_map_to_kernel(map);
-       pp = &vmk->vmk_vacache;
-       pa = &vmk->vmk_vacache_allocator;
-       memset(pa, 0, sizeof(*pa));
-       pa->pa_alloc = km_vacache_alloc;
-       pa->pa_free = km_vacache_free;
-       pa->pa_pagesz = (unsigned int)size;
-       pa->pa_backingmap = map;
-       pa->pa_backingmapptr = NULL;
-
-       if ((map->flags & VM_MAP_INTRSAFE) != 0)
-               ipl = IPL_VM;
-       else
-               ipl = IPL_NONE;
-
-       pool_init(pp, PAGE_SIZE, 0, 0, PR_NOTOUCH | PR_RECURSIVE, name, pa,
-           ipl);
-}
-
-void
-uvm_km_vacache_init(struct vm_map *map, const char *name, size_t size)
-{
-
-       map->flags |= VM_MAP_VACACHE;
-       if (size == 0)
-               size = KM_VACACHE_SIZE;
-       km_vacache_init(map, name, size);
-}
-
-#else /* !defined(PMAP_MAP_POOLPAGE) */
-
-void
-uvm_km_vacache_init(struct vm_map *map, const char *name, size_t size)
-{
-
-       /* nothing */
-}
-
-#endif /* !defined(PMAP_MAP_POOLPAGE) */
-
-void
-uvm_km_va_drain(struct vm_map *map, uvm_flag_t flags)
-{
-       struct vm_map_kernel *vmk = vm_map_to_kernel(map);
-
-       callback_run_roundrobin(&vmk->vmk_reclaim_callback, NULL);
-}
+vmem_t *kmem_arena;
+vmem_t *kmem_va_arena;

/*
- * uvm_km_init: init kernel maps and objects to reflect reality (i.e.
+ * uvm_km_bootstrap: init kernel maps and objects to reflect reality (i.e.
 * KVM already allocated for text, data, bss, and static data structures).
 *
 * => KVM is defined by VM_MIN_KERNEL_ADDRESS/VM_MAX_KERNEL_ADDRESS.
@@ -272,53 +163,98 @@ uvm_km_va_drain(struct vm_map *map, uvm_
 */

void
-uvm_km_init(vaddr_t start, vaddr_t end)
+uvm_km_bootstrap(vaddr_t start, vaddr_t end)
{
       vaddr_t base = VM_MIN_KERNEL_ADDRESS;

+       kmemsize = MIN(((((vsize_t)(end - start)) / 3) * 2),
+           ((((vsize_t)uvmexp.npages) * PAGE_SIZE) / 3));
+       kmemsize = round_page(kmemsize);
+
       /*
        * next, init kernel memory objects.
        */

       /* kernel_object: for pageable anonymous kernel memory */
-       uao_init();
       uvm_kernel_object = uao_create(VM_MAX_KERNEL_ADDRESS -
-                                VM_MIN_KERNEL_ADDRESS, UAO_FLAG_KERNOBJ);
+                               VM_MIN_KERNEL_ADDRESS, UAO_FLAG_KERNOBJ);

       /*
        * init the map and reserve any space that might already
        * have been allocated kernel space before installing.
        */

-       uvm_map_setup_kernel(&kernel_map_store, base, end, VM_MAP_PAGEABLE);
-       kernel_map_store.vmk_map.pmap = pmap_kernel();
+       uvm_map_setup(&kernel_map_store, base, end, VM_MAP_PAGEABLE);
+       kernel_map_store.pmap = pmap_kernel();
       if (start != base) {
               int error;
               struct uvm_map_args args;

-               error = uvm_map_prepare(&kernel_map_store.vmk_map,
+               error = uvm_map_prepare(&kernel_map_store,
                   base, start - base,
                   NULL, UVM_UNKNOWN_OFFSET, 0,
                   UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, UVM_INH_NONE,
                               UVM_ADV_RANDOM, UVM_FLAG_FIXED), &args);
               if (!error) {
-                       kernel_first_mapent_store.flags =
-                           UVM_MAP_KERNEL | UVM_MAP_FIRST;
-                       error = uvm_map_enter(&kernel_map_store.vmk_map, &args,
-                           &kernel_first_mapent_store);
+                       kernel_image_mapent_store.flags =
+                           UVM_MAP_KERNEL | UVM_MAP_STATIC | UVM_MAP_NOMERGE;
+                       error = uvm_map_enter(&kernel_map_store, &args,
+                           &kernel_image_mapent_store);
               }

               if (error)
                       panic(
-                           "uvm_km_init: could not reserve space for kernel");
+                           "uvm_km_bootstrap: could not reserve space for kernel");
+
+               kmembase = args.uma_start + args.uma_size;
+               error = uvm_map_prepare(&kernel_map_store,
+                   kmembase, kmemsize,
+                   NULL, UVM_UNKNOWN_OFFSET, 0,
+                   UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, UVM_INH_NONE,
+                               UVM_ADV_RANDOM, UVM_FLAG_FIXED), &args);
+               if (!error) {
+                       kernel_kmem_mapent_store.flags =
+                           UVM_MAP_KERNEL | UVM_MAP_STATIC | UVM_MAP_NOMERGE;
+                       error = uvm_map_enter(&kernel_map_store, &args,
+                           &kernel_kmem_mapent_store);
+               }
+
+               if (error)
+                       panic(
+                           "uvm_km_bootstrap: could not reserve kernel kmem");
       }

       /*
        * install!
        */

-       kernel_map = &kernel_map_store.vmk_map;
-       uvm_km_vacache_init(kernel_map, "kvakernel", 0);
+       kernel_map = &kernel_map_store;
+
+       pool_subsystem_init();
+       vmem_bootstrap();
+
+       kmem_arena = vmem_create("kmem", kmembase, kmemsize, PAGE_SIZE,
+           NULL, NULL, NULL,
+           0, VM_NOSLEEP | VM_BOOTSTRAP, IPL_VM);
+
+       vmem_init(kmem_arena);
+
+       kmem_va_arena = vmem_create("kva", 0, 0, PAGE_SIZE,
+           vmem_alloc, vmem_free, kmem_arena,
+           16 * PAGE_SIZE, VM_NOSLEEP | VM_BOOTSTRAP, IPL_VM);
+}
+
+/*
+ * uvm_km_init: init the kernel maps virtual memory caches
+ * and start the pool/kmem allocator.
+ */
+void
+uvm_km_init(void)
+{
+
+       kmem_init();
+
+       kmeminit(); // killme
}

/*
@@ -327,6 +263,7 @@ uvm_km_init(vaddr_t start, vaddr_t end)
 * allows the locking of VAs in kernel_map to be broken up into regions.
 *
 * => if `fixed' is true, *vmin specifies where the region described
+ *   pager_map => used to map "buf" structures into kernel space
 *      by the submap must start
 * => if submap is non NULL we use that as the submap, otherwise we
 *     alloc a new map
@@ -335,14 +272,13 @@ uvm_km_init(vaddr_t start, vaddr_t end)
struct vm_map *
uvm_km_suballoc(struct vm_map *map, vaddr_t *vmin /* IN/OUT */,
    vaddr_t *vmax /* OUT */, vsize_t size, int flags, bool fixed,
-    struct vm_map_kernel *submap)
+    struct vm_map *submap)
{
       int mapflags = UVM_FLAG_NOMERGE | (fixed ? UVM_FLAG_FIXED : 0);

       KASSERT(vm_map_pmap(map) == pmap_kernel());

       size = round_page(size);        /* round up to pagesize */
-       size += uvm_mapent_overhead(size, flags);

       /*
        * first allocate a blank spot in the parent map
@@ -366,21 +302,21 @@ uvm_km_suballoc(struct vm_map *map, vadd

       pmap_reference(vm_map_pmap(map));
       if (submap == NULL) {
-               submap = malloc(sizeof(*submap), M_VMMAP, M_WAITOK);
+               submap = kmem_alloc(sizeof(*submap), KM_SLEEP);
               if (submap == NULL)
                       panic("uvm_km_suballoc: unable to create submap");
       }
-       uvm_map_setup_kernel(submap, *vmin, *vmax, flags);
-       submap->vmk_map.pmap = vm_map_pmap(map);
+       uvm_map_setup(submap, *vmin, *vmax, flags);
+       submap->pmap = vm_map_pmap(map);

       /*
        * now let uvm_map_submap plug in it...
        */

-       if (uvm_map_submap(map, *vmin, *vmax, &submap->vmk_map) != 0)
+       if (uvm_map_submap(map, *vmin, *vmax, submap) != 0)
               panic("uvm_km_suballoc: submap allocation failed");

-       return(&submap->vmk_map);
+       return(submap);
}

/*
@@ -554,8 +490,7 @@ uvm_km_alloc(struct vm_map *map, vsize_t
           align, UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL, UVM_INH_NONE,
           UVM_ADV_RANDOM,
           (flags & (UVM_KMF_TRYLOCK | UVM_KMF_NOWAIT | UVM_KMF_WAITVA
-            | UVM_KMF_COLORMATCH))
-           | UVM_FLAG_QUANTUM)) != 0)) {
+            | UVM_KMF_COLORMATCH)))) != 0)) {
               UVMHIST_LOG(maphist, "<- done (no VM)",0,0,0,0);
               return(0);
       }
@@ -634,7 +569,7 @@ uvm_km_alloc(struct vm_map *map, vsize_t
               loopsize -= PAGE_SIZE;
       }

-               pmap_update(pmap_kernel());
+       pmap_update(pmap_kernel());

       UVMHIST_LOG(maphist,"<- done (kva=0x%x)", kva,0,0,0);
       return(kva);
@@ -672,7 +607,7 @@ uvm_km_free(struct vm_map *map, vaddr_t
        * KVA becomes globally available.
        */

-       uvm_unmap1(map, addr, addr + size, UVM_FLAG_QUANTUM|UVM_FLAG_VAONLY);
+       uvm_unmap1(map, addr, addr + size, UVM_FLAG_VAONLY);
}

/* Sanity; must specify both or none. */
@@ -681,127 +616,114 @@ uvm_km_free(struct vm_map *map, vaddr_t
#error Must specify MAP and UNMAP together.
#endif

-/*
- * uvm_km_alloc_poolpage: allocate a page for the pool allocator
- *
- * => if the pmap specifies an alternate mapping method, we use it.
- */
-
-/* ARGSUSED */
-vaddr_t
-uvm_km_alloc_poolpage_cache(struct vm_map *map, bool waitok)
+int
+uvm_km_kmem_alloc(vmem_t *vm, vmem_size_t size, vm_flag_t flags,
+    vmem_addr_t *addr)
{
-#if defined(PMAP_MAP_POOLPAGE)
-       return uvm_km_alloc_poolpage(map, waitok);
-#else
       struct vm_page *pg;
-       struct pool *pp = &vm_map_to_kernel(map)->vmk_vacache;
-       vaddr_t va;
+       vmem_addr_t va;
+       int rc;
+       vaddr_t loopva;
+       vsize_t loopsize;

-       if ((map->flags & VM_MAP_VACACHE) == 0)
-               return uvm_km_alloc_poolpage(map, waitok);
+       size = round_page(size);

-       va = (vaddr_t)pool_get(pp, waitok ? PR_WAITOK : PR_NOWAIT);
-       if (va == 0)
-               return 0;
-       KASSERT(!pmap_extract(pmap_kernel(), va, NULL));
+#if defined(PMAP_MAP_POOLPAGE)
+       if (size == PAGE_SIZE) {
again:
-       pg = uvm_pagealloc(NULL, 0, NULL, waitok ? 0 : UVM_PGA_USERESERVE);
-       if (__predict_false(pg == NULL)) {
-               if (waitok) {
-                       uvm_wait("plpg");
-                       goto again;
-               } else {
-                       pool_put(pp, (void *)va);
-                       return 0;
+#ifdef PMAP_ALLOC_POOLPAGE
+               pg = PMAP_ALLOC_POOLPAGE((flags & VM_SLEEP) ?
+                  0 : UVM_PGA_USERESERVE);
+#else
+               pg = uvm_pagealloc(NULL, 0, NULL,
+                  (flags & VM_SLEEP) ? 0 : UVM_PGA_USERESERVE);
+#endif /* PMAP_ALLOC_POOLPAGE */
+               if (__predict_false(pg == NULL)) {
+                       if (flags & VM_SLEEP) {
+                               uvm_wait("plpg");
+                               goto again;
+                       }
+               }
+               va = PMAP_MAP_POOLPAGE(VM_PAGE_TO_PHYS(pg));
+               if (__predict_false(va == 0)) {
+                       uvm_pagefree(pg);
+                       return ENOMEM;
               }
+               *addr = va;
+               return 0;
       }
-       pg->flags &= ~PG_BUSY;  /* new page */
-       UVM_PAGE_OWN(pg, NULL);
-       pmap_kenter_pa(va, VM_PAGE_TO_PHYS(pg),
-           VM_PROT_READ|VM_PROT_WRITE, PMAP_KMPAGE);
-       pmap_update(pmap_kernel());
-
-       return va;
#endif /* PMAP_MAP_POOLPAGE */
-}

-vaddr_t
-uvm_km_alloc_poolpage(struct vm_map *map, bool waitok)
-{
-#if defined(PMAP_MAP_POOLPAGE)
-       struct vm_page *pg;
-       vaddr_t va;
+       rc = vmem_alloc(vm, size, flags, &va);
+       if (rc != 0)
+               return rc;

+       loopva = va;
+       loopsize = size;

- again:
-#ifdef PMAP_ALLOC_POOLPAGE
-       pg = PMAP_ALLOC_POOLPAGE(waitok ? 0 : UVM_PGA_USERESERVE);
-#else
-       pg = uvm_pagealloc(NULL, 0, NULL, waitok ? 0 : UVM_PGA_USERESERVE);
-#endif
-       if (__predict_false(pg == NULL)) {
-               if (waitok) {
-                       uvm_wait("plpg");
-                       goto again;
-               } else
-                       return (0);
+       while (loopsize) {
+               KASSERT(!pmap_extract(pmap_kernel(), loopva, NULL));
+
+               pg = uvm_pagealloc(NULL, 0, NULL,
+                   (flags & VM_SLEEP) ? 0 : UVM_PGA_USERESERVE);
+               if (__predict_false(pg == NULL)) {
+                       if (flags & VM_SLEEP) {
+                               uvm_wait("plpg");
+                               continue;
+                       } else {
+                               uvm_km_pgremove_intrsafe(kernel_map, va,
+                                   va + size);
+                               pmap_kremove(va, size);
+                               vmem_free(kmem_va_arena, va, size);
+                               return ENOMEM;
+                       }
+               }
+
+               pg->flags &= ~PG_BUSY;  /* new page */
+               UVM_PAGE_OWN(pg, NULL);
+               pmap_kenter_pa(loopva, VM_PAGE_TO_PHYS(pg),
+                   VM_PROT_READ|VM_PROT_WRITE, PMAP_KMPAGE);
+
+               loopva += PAGE_SIZE;
+               loopsize -= PAGE_SIZE;
       }
-       va = PMAP_MAP_POOLPAGE(VM_PAGE_TO_PHYS(pg));
-       if (__predict_false(va == 0))
-               uvm_pagefree(pg);
-       return (va);
-#else
-       vaddr_t va;
+       pmap_update(pmap_kernel());

-       va = uvm_km_alloc(map, PAGE_SIZE, 0,
-           (waitok ? 0 : UVM_KMF_NOWAIT | UVM_KMF_TRYLOCK) | UVM_KMF_WIRED);
-       return (va);
-#endif /* PMAP_MAP_POOLPAGE */
-}
+       *addr = va;

-/*
- * uvm_km_free_poolpage: free a previously allocated pool page
- *
- * => if the pmap specifies an alternate unmapping method, we use it.
- */
+       return 0;
+}

-/* ARGSUSED */
void
-uvm_km_free_poolpage_cache(struct vm_map *map, vaddr_t addr)
+uvm_km_kmem_free(vmem_t *vm, vmem_addr_t addr, size_t size)
{
+
+       size = round_page(size);
#if defined(PMAP_UNMAP_POOLPAGE)
-       uvm_km_free_poolpage(map, addr);
-#else
-       struct pool *pp;
+       if (size == PAGE_SIZE) {
+               paddr_t pa;

-       if ((map->flags & VM_MAP_VACACHE) == 0) {
-               uvm_km_free_poolpage(map, addr);
+               pa = PMAP_UNMAP_POOLPAGE(addr);
+               uvm_pagefree(PHYS_TO_VM_PAGE(pa));
               return;
       }
-
-       KASSERT(pmap_extract(pmap_kernel(), addr, NULL));
-       uvm_km_pgremove_intrsafe(map, addr, addr + PAGE_SIZE);
-       pmap_kremove(addr, PAGE_SIZE);
-#if defined(DEBUG)
+#endif /* PMAP_UNMAP_POOLPAGE */
+       uvm_km_pgremove_intrsafe(kernel_map, addr, addr + size);
+       pmap_kremove(addr, size);
       pmap_update(pmap_kernel());
-#endif
-       KASSERT(!pmap_extract(pmap_kernel(), addr, NULL));
-       pp = &vm_map_to_kernel(map)->vmk_vacache;
-       pool_put(pp, (void *)addr);
-#endif
+
+       vmem_free(vm, addr, size);
}

-/* ARGSUSED */
-void
-uvm_km_free_poolpage(struct vm_map *map, vaddr_t addr)
+bool
+uvm_km_va_starved_p(void)
{
-#if defined(PMAP_UNMAP_POOLPAGE)
-       paddr_t pa;
+       vmem_size_t total;
+       vmem_size_t free;

-       pa = PMAP_UNMAP_POOLPAGE(addr);
-       uvm_pagefree(PHYS_TO_VM_PAGE(pa));
-#else
-       uvm_km_free(map, addr, PAGE_SIZE, UVM_KMF_WIRED);
-#endif /* PMAP_UNMAP_POOLPAGE */
+       total = vmem_size(kmem_arena, VMEM_ALLOC|VMEM_FREE);
+       free = vmem_size(kmem_arena, VMEM_FREE);
+
+       return (free < (total / 10));
}
+
Index: sys/uvm/uvm_km.h
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_km.h,v
retrieving revision 1.19
diff -u -p -r1.19 uvm_km.h
--- sys/uvm/uvm_km.h    2 Feb 2011 15:13:34 -0000       1.19
+++ sys/uvm/uvm_km.h    23 Jan 2012 22:02:23 -0000
@@ -40,7 +40,8 @@
 * prototypes
 */

-void uvm_km_init(vaddr_t, vaddr_t);
+void uvm_km_bootstrap(vaddr_t, vaddr_t);
+void uvm_km_init(void);
void uvm_km_pgremove(vaddr_t, vaddr_t);
void uvm_km_pgremove_intrsafe(struct vm_map *, vaddr_t, vaddr_t);
#if defined(DEBUG)
@@ -48,7 +49,6 @@ void uvm_km_check_empty(struct vm_map *,
#else
#define        uvm_km_check_empty(a, b, c)     /* nothing */
#endif /* defined(DEBUG) */
-void uvm_km_va_drain(struct vm_map *, uvm_flag_t);

#endif /* _KERNEL */

Index: sys/uvm/uvm_kmguard.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_kmguard.c,v
retrieving revision 1.5
diff -u -p -r1.5 uvm_kmguard.c
--- sys/uvm/uvm_kmguard.c       23 Apr 2011 18:14:12 -0000      1.5
+++ sys/uvm/uvm_kmguard.c       23 Jan 2012 22:02:23 -0000
@@ -121,8 +121,8 @@ uvm_kmguard_alloc(struct uvm_kmguard *kg
       va = vm_map_min(kg->kg_map);
       if (__predict_false(uvm_map(kg->kg_map, &va, PAGE_SIZE*2, NULL,
           UVM_UNKNOWN_OFFSET, PAGE_SIZE, UVM_MAPFLAG(UVM_PROT_ALL,
-           UVM_PROT_ALL, UVM_INH_NONE, UVM_ADV_RANDOM, flag
-           | UVM_FLAG_QUANTUM)) != 0)) {
+           UVM_PROT_ALL, UVM_INH_NONE, UVM_ADV_RANDOM, flag))
+           != 0)) {
               return NULL;
       }

Index: sys/uvm/uvm_map.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_map.c,v
retrieving revision 1.310
diff -u -p -r1.310 uvm_map.c
--- sys/uvm/uvm_map.c   5 Jan 2012 15:19:53 -0000       1.310
+++ sys/uvm/uvm_map.c   23 Jan 2012 22:02:25 -0000
@@ -77,7 +77,6 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_map.c,v
#include <sys/systm.h>
#include <sys/mman.h>
#include <sys/proc.h>
-#include <sys/malloc.h>
#include <sys/pool.h>
#include <sys/kernel.h>
#include <sys/mount.h>
@@ -135,11 +134,6 @@ UVMMAP_EVCNT_DEFINE(mlk_tree)
UVMMAP_EVCNT_DEFINE(mlk_treeloop)
UVMMAP_EVCNT_DEFINE(mlk_listloop)

-UVMMAP_EVCNT_DEFINE(uke_alloc)
-UVMMAP_EVCNT_DEFINE(uke_free)
-UVMMAP_EVCNT_DEFINE(ukh_alloc)
-UVMMAP_EVCNT_DEFINE(ukh_free)
-
const char vmmapbsy[] = "vmmapbsy";

/*
@@ -154,9 +148,6 @@ static struct pool_cache uvm_vmspace_cac

static struct pool_cache uvm_map_entry_cache;

-MALLOC_DEFINE(M_VMMAP, "VM map", "VM map structures");
-MALLOC_DEFINE(M_VMPMAP, "VM pmap", "VM pmap");
-
#ifdef PMAP_GROWKERNEL
/*
 * This global represents the end of the kernel virtual address
@@ -184,24 +175,14 @@ static int user_va0_disable = __USER_VA0
 */

/*
- * VM_MAP_USE_KMAPENT: determine if uvm_kmapent_alloc/free is used
- * for the vm_map.
- */
-extern struct vm_map *pager_map; /* XXX */
-#define        VM_MAP_USE_KMAPENT_FLAGS(flags) \
-       (((flags) & VM_MAP_INTRSAFE) != 0)
-#define        VM_MAP_USE_KMAPENT(map) \
-       (VM_MAP_USE_KMAPENT_FLAGS((map)->flags) || (map) == kernel_map)
-
-/*
 * UVM_ET_ISCOMPATIBLE: check some requirements for map entry merging
 */
+extern struct vm_map *pager_map;

#define        UVM_ET_ISCOMPATIBLE(ent, type, uobj, meflags, \
    prot, maxprot, inh, adv, wire) \
       ((ent)->etype == (type) && \
-       (((ent)->flags ^ (meflags)) & (UVM_MAP_NOMERGE | UVM_MAP_QUANTUM)) \
-       == 0 && \
+       (((ent)->flags ^ (meflags)) & (UVM_MAP_NOMERGE)) == 0 && \
       (ent)->object.uvm_obj == (uobj) && \
       (ent)->protection == (prot) && \
       (ent)->max_protection == (maxprot) && \
@@ -285,10 +266,6 @@ clear_hints(struct vm_map *map, struct v

static struct vm_map_entry *
               uvm_mapent_alloc(struct vm_map *, int);
-static struct vm_map_entry *
-               uvm_mapent_alloc_split(struct vm_map *,
-                   const struct vm_map_entry *, int,
-                   struct uvm_mapent_reservation *);
static void    uvm_mapent_copy(struct vm_map_entry *, struct vm_map_entry *);
static void    uvm_mapent_free(struct vm_map_entry *);
#if defined(DEBUG)
@@ -298,10 +275,6 @@ static void        _uvm_mapent_check(const stru
#else /* defined(DEBUG) */
#define        uvm_mapent_check(e)     /* nothing */
#endif /* defined(DEBUG) */
-static struct vm_map_entry *
-               uvm_kmapent_alloc(struct vm_map *, int);
-static void    uvm_kmapent_free(struct vm_map_entry *);
-static vsize_t uvm_kmapent_overhead(vsize_t);

static void    uvm_map_entry_unwire(struct vm_map *, struct vm_map_entry *);
static void    uvm_map_reference_amap(struct vm_map_entry *, int);
@@ -631,10 +604,6 @@ _uvm_tree_sanity(struct vm_map *map)
}
#endif /* defined(DEBUG) || defined(DDB) */

-#ifdef DIAGNOSTIC
-static struct vm_map *uvm_kmapent_map(struct vm_map_entry *);
-#endif
-
/*
 * vm_map_lock: acquire an exclusive (write) lock on a map.
 *
@@ -805,14 +774,11 @@ uvm_mapent_alloc(struct vm_map *map, int
       int pflags = (flags & UVM_FLAG_NOWAIT) ? PR_NOWAIT : PR_WAITOK;
       UVMHIST_FUNC("uvm_mapent_alloc"); UVMHIST_CALLED(maphist);

-       if (VM_MAP_USE_KMAPENT(map)) {
-               me = uvm_kmapent_alloc(map, flags);
-       } else {
-               me = pool_cache_get(&uvm_map_entry_cache, pflags);
-               if (__predict_false(me == NULL))
-                       return NULL;
-               me->flags = 0;
-       }
+       me = pool_cache_get(&uvm_map_entry_cache, pflags);
+       if (__predict_false(me == NULL))
+               return NULL;
+       me->flags = 0;
+

       UVMHIST_LOG(maphist, "<- new entry=0x%x [kentry=%d]", me,
           ((map->flags & VM_MAP_INTRSAFE) != 0 || map == kernel_map), 0, 0);
@@ -820,37 +786,6 @@ uvm_mapent_alloc(struct vm_map *map, int
}

/*
- * uvm_mapent_alloc_split: allocate a map entry for clipping.
- *
- * => map must be locked by caller if UVM_MAP_QUANTUM is set.
- */
-
-static struct vm_map_entry *
-uvm_mapent_alloc_split(struct vm_map *map,
-    const struct vm_map_entry *old_entry, int flags,
-    struct uvm_mapent_reservation *umr)
-{
-       struct vm_map_entry *me;
-
-       KASSERT(!VM_MAP_USE_KMAPENT(map) ||
-           (old_entry->flags & UVM_MAP_QUANTUM) || !UMR_EMPTY(umr));
-
-       if (old_entry->flags & UVM_MAP_QUANTUM) {
-               struct vm_map_kernel *vmk = vm_map_to_kernel(map);
-
-               KASSERT(vm_map_locked_p(map));
-               me = vmk->vmk_merged_entries;
-               KASSERT(me);
-               vmk->vmk_merged_entries = me->next;
-               KASSERT(me->flags & UVM_MAP_QUANTUM);
-       } else {
-               me = uvm_mapent_alloc(map, flags);
-       }
-
-       return me;
-}
-
-/*
 * uvm_mapent_free: free map entry
 */

@@ -861,44 +796,7 @@ uvm_mapent_free(struct vm_map_entry *me)

       UVMHIST_LOG(maphist,"<- freeing map entry=0x%x [flags=%d]",
               me, me->flags, 0, 0);
-       if (me->flags & UVM_MAP_KERNEL) {
-               uvm_kmapent_free(me);
-       } else {
-               pool_cache_put(&uvm_map_entry_cache, me);
-       }
-}
-
-/*
- * uvm_mapent_free_merged: free merged map entry
- *
- * => keep the entry if needed.
- * => caller shouldn't hold map locked if VM_MAP_USE_KMAPENT(map) is true.
- * => map should be locked if UVM_MAP_QUANTUM is set.
- */
-
-static void
-uvm_mapent_free_merged(struct vm_map *map, struct vm_map_entry *me)
-{
-
-       KASSERT(!(me->flags & UVM_MAP_KERNEL) || uvm_kmapent_map(me) == map);
-
-       if (me->flags & UVM_MAP_QUANTUM) {
-               /*
-                * keep this entry for later splitting.
-                */
-               struct vm_map_kernel *vmk;
-
-               KASSERT(vm_map_locked_p(map));
-               KASSERT(VM_MAP_IS_KERNEL(map));
-               KASSERT(!VM_MAP_USE_KMAPENT(map) ||
-                   (me->flags & UVM_MAP_KERNEL));
-
-               vmk = vm_map_to_kernel(map);
-               me->next = vmk->vmk_merged_entries;
-               vmk->vmk_merged_entries = me;
-       } else {
-               uvm_mapent_free(me);
-       }
+       pool_cache_put(&uvm_map_entry_cache, me);
}

/*
@@ -913,23 +811,6 @@ uvm_mapent_copy(struct vm_map_entry *src
           ((char *)src));
}

-/*
- * uvm_mapent_overhead: calculate maximum kva overhead necessary for
- * map entries.
- *
- * => size and flags are the same as uvm_km_suballoc's ones.
- */
-
-vsize_t
-uvm_mapent_overhead(vsize_t size, int flags)
-{
-
-       if (VM_MAP_USE_KMAPENT_FLAGS(flags)) {
-               return uvm_kmapent_overhead(size);
-       }
-       return 0;
-}
-
#if defined(DEBUG)
static void
_uvm_mapent_check(const struct vm_map_entry *entry, const char *file, int line)
@@ -1031,7 +912,14 @@ uvm_map_init(void)
        */

       mutex_init(&uvm_kentry_lock, MUTEX_DRIVER, IPL_VM);
+}

+/*
+ * uvm_map_init_caches: init mapping system caches.
+ */
+void
+uvm_map_init_caches(void)
+{
       /*
        * initialize caches.
        */
@@ -1089,7 +977,7 @@ uvm_mapent_splitadj(struct vm_map_entry

void
uvm_map_clip_start(struct vm_map *map, struct vm_map_entry *entry,
-    vaddr_t start, struct uvm_mapent_reservation *umr)
+    vaddr_t start)
{
       struct vm_map_entry *new_entry;

@@ -1103,7 +991,7 @@ uvm_map_clip_start(struct vm_map *map, s
        * entry BEFORE this one, so that this entry has the specified
        * starting address.
        */
-       new_entry = uvm_mapent_alloc_split(map, entry, 0, umr);
+       new_entry = uvm_mapent_alloc(map, 0);
       uvm_mapent_copy(entry, new_entry); /* entry -> new_entry */
       uvm_mapent_splitadj(new_entry, entry, start);
       uvm_map_entry_link(map, entry->prev, new_entry);
@@ -1121,8 +1009,7 @@ uvm_map_clip_start(struct vm_map *map, s
 */

void
-uvm_map_clip_end(struct vm_map *map, struct vm_map_entry *entry, vaddr_t end,
-    struct uvm_mapent_reservation *umr)
+uvm_map_clip_end(struct vm_map *map, struct vm_map_entry *entry, vaddr_t end)
{
       struct vm_map_entry *new_entry;

@@ -1133,7 +1020,7 @@ uvm_map_clip_end(struct vm_map *map, str
        *      Create a new entry and insert it
        *      AFTER the specified entry
        */
-       new_entry = uvm_mapent_alloc_split(map, entry, 0, umr);
+       new_entry = uvm_mapent_alloc(map, 0);
       uvm_mapent_copy(entry, new_entry); /* entry -> new_entry */
       uvm_mapent_splitadj(entry, new_entry, end);
       uvm_map_entry_link(map, entry, new_entry);
@@ -1141,17 +1028,6 @@ uvm_map_clip_end(struct vm_map *map, str
       uvm_map_check(map, "clip_end leave");
}

-static void
-vm_map_drain(struct vm_map *map, uvm_flag_t flags)
-{
-
-       if (!VM_MAP_IS_KERNEL(map)) {
-               return;
-       }
-
-       uvm_km_va_drain(map, flags);
-}
-
/*
 *   M A P   -   m a i n   e n t r y   p o i n t
 */
@@ -1188,7 +1064,6 @@ uvm_map(struct vm_map *map, vaddr_t *sta
       struct vm_map_entry *new_entry;
       int error;

-       KASSERT((flags & UVM_FLAG_QUANTUM) == 0 || VM_MAP_IS_KERNEL(map));
       KASSERT((size & PAGE_MASK) == 0);

#ifndef __USER_VA0_IS_SAFE
@@ -1200,20 +1075,13 @@ uvm_map(struct vm_map *map, vaddr_t *sta
       /*
        * for pager_map, allocate the new entry first to avoid sleeping
        * for memory while we have the map locked.
-        *
-        * Also, because we allocate entries for in-kernel maps
-        * a bit differently (cf. uvm_kmapent_alloc/free), we need to
-        * allocate them before locking the map.
        */

       new_entry = NULL;
-       if (VM_MAP_USE_KMAPENT(map) || (flags & UVM_FLAG_QUANTUM) ||
-           map == pager_map) {
+       if (map == pager_map) {
               new_entry = uvm_mapent_alloc(map, (flags & UVM_FLAG_NOWAIT));
               if (__predict_false(new_entry == NULL))
                       return ENOMEM;
-               if (flags & UVM_FLAG_QUANTUM)
-                       new_entry->flags |= UVM_MAP_QUANTUM;
       }
       if (map == pager_map)
               flags |= UVM_FLAG_NOMERGE;
@@ -1314,8 +1182,6 @@ retry:
                * recheck the condition.
                */

-               vm_map_drain(map, flags);
-
               mutex_enter(&map->misc_lock);
               while ((map->flags & VM_MAP_WANTVA) != 0 &&
                  map->timestamp == timestamp) {
@@ -1400,8 +1266,7 @@ uvm_map_enter(struct vm_map *map, const
       const int amapwaitflag = (flags & UVM_FLAG_NOWAIT) ?
           AMAP_EXTEND_NOWAIT : 0;
       const int advice = UVM_ADVICE(flags);
-       const int meflagval = (flags & UVM_FLAG_QUANTUM) ?
-           UVM_MAP_QUANTUM : 0;
+       const int meflagval = 0;

       vaddr_t start = args->uma_start;
       vsize_t size = args->uma_size;
@@ -1423,11 +1288,6 @@ uvm_map_enter(struct vm_map *map, const
       KASSERT(map->hint == prev_entry); /* bimerge case assumes this */
       KASSERT(vm_map_locked_p(map));

-       if (flags & UVM_FLAG_QUANTUM) {
-               KASSERT(new_entry);
-               KASSERT(new_entry->flags & UVM_MAP_QUANTUM);
-       }
-
       if (uobj)
               newetype = UVM_ET_OBJ;
       else
@@ -1714,27 +1574,17 @@ nomerge:

       error = 0;
done:
-       if ((flags & UVM_FLAG_QUANTUM) == 0) {
-               /*
-                * vmk_merged_entries is locked by the map's lock.
-                */
-               vm_map_unlock(map);
-       }
-       if (new_entry && error == 0) {
-               KDASSERT(merged);
-               uvm_mapent_free_merged(map, new_entry);
-               new_entry = NULL;
+       vm_map_unlock(map);
+
+       if (new_entry) {
+               uvm_mapent_free(new_entry);
       }
+
       if (dead) {
               KDASSERT(merged);
-               uvm_mapent_free_merged(map, dead);
-       }
-       if ((flags & UVM_FLAG_QUANTUM) != 0) {
-               vm_map_unlock(map);
-       }
-       if (new_entry != NULL) {
-               uvm_mapent_free(new_entry);
+               uvm_mapent_free(dead);
       }
+
       return error;
}

@@ -2307,8 +2157,7 @@ nextgap:

void
uvm_unmap_remove(struct vm_map *map, vaddr_t start, vaddr_t end,
-    struct vm_map_entry **entry_list /* OUT */,
-    struct uvm_mapent_reservation *umr, int flags)
+    struct vm_map_entry **entry_list /* OUT */, int flags)
{
       struct vm_map_entry *entry, *first_entry, *next;
       vaddr_t len;
@@ -2327,7 +2176,7 @@ uvm_unmap_remove(struct vm_map *map, vad
       if (uvm_map_lookup_entry(map, start, &first_entry) == true) {
               /* clip and go... */
               entry = first_entry;
-               UVM_MAP_CLIP_START(map, entry, start, umr);
+               UVM_MAP_CLIP_START(map, entry, start);
               /* critical!  prevents stale hint */
               SAVE_HINT(map, entry, entry->prev);
       } else {
@@ -2367,9 +2216,9 @@ uvm_unmap_remove(struct vm_map *map, vad
        */

       while ((entry != &map->header) && (entry->start < end)) {
-               KASSERT((entry->flags & UVM_MAP_FIRST) == 0);
+               KASSERT((entry->flags & UVM_MAP_STATIC) == 0);

-               UVM_MAP_CLIP_END(map, entry, end, umr);
+               UVM_MAP_CLIP_END(map, entry, end);
               next = entry->next;
               len = entry->end - entry->start;

@@ -2606,8 +2455,8 @@ uvm_map_replace(struct vm_map *map, vadd
        * check to make sure we have a proper blank entry
        */

-       if (end < oldent->end && !VM_MAP_USE_KMAPENT(map)) {
-               UVM_MAP_CLIP_END(map, oldent, end, NULL);
+       if (end < oldent->end) {
+               UVM_MAP_CLIP_END(map, oldent, end);
       }
       if (oldent->start != start || oldent->end != end ||
           oldent->object.uvm_obj != NULL || oldent->aref.ar_amap != NULL) {
@@ -2799,7 +2648,7 @@ uvm_map_extract(struct vm_map *srcmap, v
                        * fudge is zero)
                        */

-                       UVM_MAP_CLIP_START(srcmap, entry, start, NULL);
+                       UVM_MAP_CLIP_START(srcmap, entry, start);
                       SAVE_HINT(srcmap, srcmap->hint, entry->prev);
                       fudge = 0;
               }
@@ -2828,7 +2677,7 @@ uvm_map_extract(struct vm_map *srcmap, v

               /* if we are not doing a quick reference, clip it */
               if ((flags & UVM_EXTRACT_QREF) == 0)
-                       UVM_MAP_CLIP_END(srcmap, entry, end, NULL);
+                       UVM_MAP_CLIP_END(srcmap, entry, end);

               /* clear needs_copy (allow chunking) */
               if (UVM_ET_ISNEEDSCOPY(entry)) {
@@ -3077,17 +2926,14 @@ uvm_map_submap(struct vm_map *map, vaddr
    struct vm_map *submap)
{
       struct vm_map_entry *entry;
-       struct uvm_mapent_reservation umr;
       int error;

-       uvm_mapent_reserve(map, &umr, 2, 0);
-
       vm_map_lock(map);
       VM_MAP_RANGE_CHECK(map, start, end);

       if (uvm_map_lookup_entry(map, start, &entry)) {
-               UVM_MAP_CLIP_START(map, entry, start, &umr);
-               UVM_MAP_CLIP_END(map, entry, end, &umr);        /* to be safe */
+               UVM_MAP_CLIP_START(map, entry, start);
+               UVM_MAP_CLIP_END(map, entry, end);      /* to be safe */
       } else {
               entry = NULL;
       }
@@ -3106,30 +2952,10 @@ uvm_map_submap(struct vm_map *map, vaddr
       }
       vm_map_unlock(map);

-       uvm_mapent_unreserve(map, &umr);
-
       return error;
}

/*
- * uvm_map_setup_kernel: init in-kernel map
- *
- * => map must not be in service yet.
- */
-
-void
-uvm_map_setup_kernel(struct vm_map_kernel *map,
-    vaddr_t vmin, vaddr_t vmax, int flags)
-{
-
-       uvm_map_setup(&map->vmk_map, vmin, vmax, flags);
-       callback_head_init(&map->vmk_reclaim_callback, IPL_VM);
-       LIST_INIT(&map->vmk_kentry_free);
-       map->vmk_merged_entries = NULL;
-}
-
-
-/*
 * uvm_map_protect: change map protection
 *
 * => set_max means set max_protection.
@@ -3152,7 +2978,7 @@ uvm_map_protect(struct vm_map *map, vadd
       vm_map_lock(map);
       VM_MAP_RANGE_CHECK(map, start, end);
       if (uvm_map_lookup_entry(map, start, &entry)) {
-               UVM_MAP_CLIP_START(map, entry, start, NULL);
+               UVM_MAP_CLIP_START(map, entry, start);
       } else {
               entry = entry->next;
       }
@@ -3197,7 +3023,7 @@ uvm_map_protect(struct vm_map *map, vadd
       while ((current != &map->header) && (current->start < end)) {
               vm_prot_t old_prot;

-               UVM_MAP_CLIP_END(map, current, end, NULL);
+               UVM_MAP_CLIP_END(map, current, end);
               old_prot = current->protection;
               if (set_max)
                       current->protection =
@@ -3308,12 +3134,12 @@ uvm_map_inherit(struct vm_map *map, vadd
       VM_MAP_RANGE_CHECK(map, start, end);
       if (uvm_map_lookup_entry(map, start, &temp_entry)) {
               entry = temp_entry;
-               UVM_MAP_CLIP_START(map, entry, start, NULL);
+               UVM_MAP_CLIP_START(map, entry, start);
       }  else {
               entry = temp_entry->next;
       }
       while ((entry != &map->header) && (entry->start < end)) {
-               UVM_MAP_CLIP_END(map, entry, end, NULL);
+               UVM_MAP_CLIP_END(map, entry, end);
               entry->inheritance = new_inheritance;
               entry = entry->next;
       }
@@ -3340,7 +3166,7 @@ uvm_map_advice(struct vm_map *map, vaddr
       VM_MAP_RANGE_CHECK(map, start, end);
       if (uvm_map_lookup_entry(map, start, &temp_entry)) {
               entry = temp_entry;
-               UVM_MAP_CLIP_START(map, entry, start, NULL);
+               UVM_MAP_CLIP_START(map, entry, start);
       } else {
               entry = temp_entry->next;
       }
@@ -3350,7 +3176,7 @@ uvm_map_advice(struct vm_map *map, vaddr
        */

       while ((entry != &map->header) && (entry->start < end)) {
-               UVM_MAP_CLIP_END(map, entry, end, NULL);
+               UVM_MAP_CLIP_END(map, entry, end);

               switch (new_advice) {
               case MADV_NORMAL:
@@ -3479,7 +3305,7 @@ uvm_map_pageable(struct vm_map *map, vad
        */

       if (new_pageable) {             /* unwire */
-               UVM_MAP_CLIP_START(map, entry, start, NULL);
+               UVM_MAP_CLIP_START(map, entry, start);

               /*
                * unwiring.  first ensure that the range to be unwired is
@@ -3507,7 +3333,7 @@ uvm_map_pageable(struct vm_map *map, vad

               entry = start_entry;
               while ((entry != &map->header) && (entry->start < end)) {
-                       UVM_MAP_CLIP_END(map, entry, end, NULL);
+                       UVM_MAP_CLIP_END(map, entry, end);
                       if (VM_MAPENT_ISWIRED(entry))
                               uvm_map_entry_unwire(map, entry);
                       entry = entry->next;
@@ -3559,8 +3385,8 @@ uvm_map_pageable(struct vm_map *map, vad
                               }
                       }
               }
-               UVM_MAP_CLIP_START(map, entry, start, NULL);
-               UVM_MAP_CLIP_END(map, entry, end, NULL);
+               UVM_MAP_CLIP_START(map, entry, start);
+               UVM_MAP_CLIP_END(map, entry, end);
               entry->wired_count++;

               /*
@@ -4354,7 +4180,7 @@ uvmspace_free(struct vmspace *vm)
#endif
       if (map->nentries) {
               uvm_unmap_remove(map, vm_map_min(map), vm_map_max(map),
-                   &dead_entries, NULL, 0);
+                   &dead_entries, 0);
               if (dead_entries != NULL)
                       uvm_unmap_detach(dead_entries, 0);
       }
@@ -4608,354 +4434,6 @@ uvmspace_fork(struct vmspace *vm1)


/*
- * in-kernel map entry allocation.
- */
-
-struct uvm_kmapent_hdr {
-       LIST_ENTRY(uvm_kmapent_hdr) ukh_listq;
-       int ukh_nused;
-       struct vm_map_entry *ukh_freelist;
-       struct vm_map *ukh_map;
-       struct vm_map_entry ukh_entries[0];
-};
-
-#define        UVM_KMAPENT_CHUNK                               \
-       ((PAGE_SIZE - sizeof(struct uvm_kmapent_hdr))   \
-       / sizeof(struct vm_map_entry))
-
-#define        UVM_KHDR_FIND(entry)    \
-       ((struct uvm_kmapent_hdr *)(((vaddr_t)entry) & ~PAGE_MASK))
-
-
-#ifdef DIAGNOSTIC
-static struct vm_map *
-uvm_kmapent_map(struct vm_map_entry *entry)
-{
-       const struct uvm_kmapent_hdr *ukh;
-
-       ukh = UVM_KHDR_FIND(entry);
-       return ukh->ukh_map;
-}
-#endif
-
-static inline struct vm_map_entry *
-uvm_kmapent_get(struct uvm_kmapent_hdr *ukh)
-{
-       struct vm_map_entry *entry;
-
-       KASSERT(ukh->ukh_nused <= UVM_KMAPENT_CHUNK);
-       KASSERT(ukh->ukh_nused >= 0);
-
-       entry = ukh->ukh_freelist;
-       if (entry) {
-               KASSERT((entry->flags & (UVM_MAP_KERNEL | UVM_MAP_KMAPENT))
-                   == UVM_MAP_KERNEL);
-               ukh->ukh_freelist = entry->next;
-               ukh->ukh_nused++;
-               KASSERT(ukh->ukh_nused <= UVM_KMAPENT_CHUNK);
-       } else {
-               KASSERT(ukh->ukh_nused == UVM_KMAPENT_CHUNK);
-       }
-
-       return entry;
-}
-
-static inline void
-uvm_kmapent_put(struct uvm_kmapent_hdr *ukh, struct vm_map_entry *entry)
-{
-
-       KASSERT((entry->flags & (UVM_MAP_KERNEL | UVM_MAP_KMAPENT))
-           == UVM_MAP_KERNEL);
-       KASSERT(ukh->ukh_nused <= UVM_KMAPENT_CHUNK);
-       KASSERT(ukh->ukh_nused > 0);
-       KASSERT(ukh->ukh_freelist != NULL ||
-           ukh->ukh_nused == UVM_KMAPENT_CHUNK);
-       KASSERT(ukh->ukh_freelist == NULL ||
-           ukh->ukh_nused < UVM_KMAPENT_CHUNK);
-
-       ukh->ukh_nused--;
-       entry->next = ukh->ukh_freelist;
-       ukh->ukh_freelist = entry;
-}
-
-/*
- * uvm_kmapent_alloc: allocate a map entry for in-kernel map
- */
-
-static struct vm_map_entry *
-uvm_kmapent_alloc(struct vm_map *map, int flags)
-{
-       struct vm_page *pg;
-       struct uvm_kmapent_hdr *ukh;
-       struct vm_map_entry *entry;
-#ifndef PMAP_MAP_POOLPAGE
-       struct uvm_map_args args;
-       uvm_flag_t mapflags = UVM_MAPFLAG(UVM_PROT_ALL, UVM_PROT_ALL,
-           UVM_INH_NONE, UVM_ADV_RANDOM, flags | UVM_FLAG_NOMERGE);
-       int error;
-#endif
-       vaddr_t va;
-       int i;
-
-       KDASSERT(UVM_KMAPENT_CHUNK > 2);
-       KDASSERT(kernel_map != NULL);
-       KASSERT(vm_map_pmap(map) == pmap_kernel());
-
-       UVMMAP_EVCNT_INCR(uke_alloc);
-       entry = NULL;
-again:
-       /*
-        * try to grab an entry from freelist.
-        */
-       mutex_spin_enter(&uvm_kentry_lock);
-       ukh = LIST_FIRST(&vm_map_to_kernel(map)->vmk_kentry_free);
-       if (ukh) {
-               entry = uvm_kmapent_get(ukh);
-               if (ukh->ukh_nused == UVM_KMAPENT_CHUNK)
-                       LIST_REMOVE(ukh, ukh_listq);
-       }
-       mutex_spin_exit(&uvm_kentry_lock);
-
-       if (entry)
-               return entry;
-
-       /*
-        * there's no free entry for this vm_map.
-        * now we need to allocate some vm_map_entry.
-        * for simplicity, always allocate one page chunk of them at once.
-        */
-
-#ifdef PMAP_ALLOC_POOLPAGE
-       pg = PMAP_ALLOC_POOLPAGE(
-           (flags & UVM_KMF_NOWAIT) != 0 ? UVM_PGA_USERESERVE : 0);
-#else
-       pg = uvm_pagealloc(NULL, 0, NULL,
-           (flags & UVM_KMF_NOWAIT) != 0 ? UVM_PGA_USERESERVE : 0);
-#endif
-       if (__predict_false(pg == NULL)) {
-               if (flags & UVM_FLAG_NOWAIT)
-                       return NULL;
-               uvm_wait("kme_alloc");
-               goto again;
-       }
-
-#ifdef PMAP_MAP_POOLPAGE
-       va = PMAP_MAP_POOLPAGE(VM_PAGE_TO_PHYS(pg));
-       KASSERT(va != 0);
-#else
-       error = uvm_map_prepare(map, 0, PAGE_SIZE, NULL, UVM_UNKNOWN_OFFSET,
-           VM_PGCOLOR_BUCKET(pg), mapflags | UVM_FLAG_COLORMATCH, &args);
-       if (error) {
-               uvm_pagefree(pg);
-               return NULL;
-       }
-
-       va = args.uma_start;
-
-       pmap_kenter_pa(va, VM_PAGE_TO_PHYS(pg),
-           VM_PROT_READ|VM_PROT_WRITE, PMAP_KMPAGE);
-       pmap_update(vm_map_pmap(map));
-
-#endif
-       ukh = (void *)va;
-
-       /*
-        * use the last entry for ukh itsself.
-        */
-
-       i = UVM_KMAPENT_CHUNK - 1;
-#ifndef PMAP_MAP_POOLPAGE
-       entry = &ukh->ukh_entries[i--];
-       entry->flags = UVM_MAP_KERNEL | UVM_MAP_KMAPENT;
-       error = uvm_map_enter(map, &args, entry);
-       KASSERT(error == 0);
-#endif
-
-       ukh->ukh_nused = UVM_KMAPENT_CHUNK;
-       ukh->ukh_map = map;
-       ukh->ukh_freelist = NULL;
-       for (; i >= 1; i--) {
-               struct vm_map_entry *xentry = &ukh->ukh_entries[i];
-
-               xentry->flags = UVM_MAP_KERNEL;
-               uvm_kmapent_put(ukh, xentry);
-       }
-#ifdef PMAP_MAP_POOLPAGE
-       KASSERT(ukh->ukh_nused == 1);
-#else
-       KASSERT(ukh->ukh_nused == 2);
-#endif
-
-       mutex_spin_enter(&uvm_kentry_lock);
-       LIST_INSERT_HEAD(&vm_map_to_kernel(map)->vmk_kentry_free,
-           ukh, ukh_listq);
-       mutex_spin_exit(&uvm_kentry_lock);
-
-       /*
-        * return first entry.
-        */
-
-       entry = &ukh->ukh_entries[0];
-       entry->flags = UVM_MAP_KERNEL;
-       UVMMAP_EVCNT_INCR(ukh_alloc);
-
-       return entry;
-}
-
-/*
- * uvm_mapent_free: free map entry for in-kernel map
- */
-
-static void
-uvm_kmapent_free(struct vm_map_entry *entry)
-{
-       struct uvm_kmapent_hdr *ukh;
-       struct vm_page *pg;
-       struct vm_map *map;
-#ifndef PMAP_UNMAP_POOLPAGE
-       struct pmap *pmap;
-       struct vm_map_entry *deadentry;
-#endif
-       vaddr_t va;
-       paddr_t pa;
-
-       UVMMAP_EVCNT_INCR(uke_free);
-       ukh = UVM_KHDR_FIND(entry);
-       map = ukh->ukh_map;
-
-       mutex_spin_enter(&uvm_kentry_lock);
-       uvm_kmapent_put(ukh, entry);
-#ifdef PMAP_UNMAP_POOLPAGE
-       if (ukh->ukh_nused > 0) {
-#else
-       if (ukh->ukh_nused > 1) {
-#endif
-               if (ukh->ukh_nused == UVM_KMAPENT_CHUNK - 1)
-                       LIST_INSERT_HEAD(
-                           &vm_map_to_kernel(map)->vmk_kentry_free,
-                           ukh, ukh_listq);
-               mutex_spin_exit(&uvm_kentry_lock);
-               return;
-       }
-
-       /*
-        * now we can free this ukh.
-        *
-        * however, keep an empty ukh to avoid ping-pong.
-        */
-
-       if (LIST_FIRST(&vm_map_to_kernel(map)->vmk_kentry_free) == ukh &&
-           LIST_NEXT(ukh, ukh_listq) == NULL) {
-               mutex_spin_exit(&uvm_kentry_lock);
-               return;
-       }
-       LIST_REMOVE(ukh, ukh_listq);
-       mutex_spin_exit(&uvm_kentry_lock);
-
-       va = (vaddr_t)ukh;
-
-#ifdef PMAP_UNMAP_POOLPAGE
-       KASSERT(ukh->ukh_nused == 0);
-       pa = PMAP_UNMAP_POOLPAGE(va);
-       KASSERT(pa != 0);
-#else
-       KASSERT(ukh->ukh_nused == 1);
-
-       /*
-        * remove map entry for ukh itsself.
-        */
-
-       KASSERT((va & PAGE_MASK) == 0);
-       vm_map_lock(map);
-       uvm_unmap_remove(map, va, va + PAGE_SIZE, &deadentry, NULL, 0);
-       KASSERT(deadentry->flags & UVM_MAP_KERNEL);
-       KASSERT(deadentry->flags & UVM_MAP_KMAPENT);
-       KASSERT(deadentry->next == NULL);
-       KASSERT(deadentry == &ukh->ukh_entries[UVM_KMAPENT_CHUNK - 1]);
-
-       /*
-        * unmap the page from pmap and free it.
-        */
-
-       pmap = vm_map_pmap(map);
-       KASSERT(pmap == pmap_kernel());
-       if (!pmap_extract(pmap, va, &pa))
-               panic("%s: no mapping", __func__);
-       pmap_kremove(va, PAGE_SIZE);
-       pmap_update(vm_map_pmap(map));
-       vm_map_unlock(map);
-#endif /* !PMAP_UNMAP_POOLPAGE */
-       pg = PHYS_TO_VM_PAGE(pa);
-       uvm_pagefree(pg);
-       UVMMAP_EVCNT_INCR(ukh_free);
-}
-
-static vsize_t
-uvm_kmapent_overhead(vsize_t size)
-{
-
-       /*
-        * - the max number of unmerged entries is howmany(size, PAGE_SIZE)
-        *   as the min allocation unit is PAGE_SIZE.
-        * - UVM_KMAPENT_CHUNK "kmapent"s are allocated from a page.
-        *   one of them are used to map the page itself.
-        */
-
-       return howmany(howmany(size, PAGE_SIZE), (UVM_KMAPENT_CHUNK - 1)) *
-           PAGE_SIZE;
-}
-
-/*
- * map entry reservation
- */
-
-/*
- * uvm_mapent_reserve: reserve map entries for clipping before locking map.
- *
- * => needed when unmapping entries allocated without UVM_FLAG_QUANTUM.
- * => caller shouldn't hold map locked.
- */
-int
-uvm_mapent_reserve(struct vm_map *map, struct uvm_mapent_reservation *umr,
-    int nentries, int flags)
-{
-
-       umr->umr_nentries = 0;
-
-       if ((flags & UVM_FLAG_QUANTUM) != 0)
-               return 0;
-
-       if (!VM_MAP_USE_KMAPENT(map))
-               return 0;
-
-       while (nentries--) {
-               struct vm_map_entry *ent;
-               ent = uvm_kmapent_alloc(map, flags);
-               if (!ent) {
-                       uvm_mapent_unreserve(map, umr);
-                       return ENOMEM;
-               }
-               UMR_PUTENTRY(umr, ent);
-       }
-
-       return 0;
-}
-
-/*
- * uvm_mapent_unreserve:
- *
- * => caller shouldn't hold map locked.
- * => never fail or sleep.
- */
-void
-uvm_mapent_unreserve(struct vm_map *map, struct uvm_mapent_reservation *umr)
-{
-
-       while (!UMR_EMPTY(umr))
-               uvm_kmapent_free(UMR_GETENTRY(umr));
-}
-
-/*
 * uvm_mapent_trymerge: try to merge an entry with its neighbors.
 *
 * => called with map locked.
@@ -4973,10 +4451,6 @@ uvm_mapent_trymerge(struct vm_map *map,
       bool copying;
       int newetype;

-       KASSERT(vm_map_locked_p(map));
-       if (VM_MAP_USE_KMAPENT(map)) {
-               return 0;
-       }
       if (entry->aref.ar_amap != NULL) {
               return 0;
       }
@@ -5023,7 +4497,7 @@ uvm_mapent_trymerge(struct vm_map *map,
                               entry->etype &= ~UVM_ET_NEEDSCOPY;
                       }
                       uvm_map_check(map, "trymerge forwardmerge");
-                       uvm_mapent_free_merged(map, next);
+                       uvm_mapent_free(next);
                       merged++;
               }
       }
@@ -5064,7 +4538,7 @@ uvm_mapent_trymerge(struct vm_map *map,
                               entry->etype &= ~UVM_ET_NEEDSCOPY;
                       }
                       uvm_map_check(map, "trymerge backmerge");
-                       uvm_mapent_free_merged(map, prev);
+                       uvm_mapent_free(prev);
                       merged++;
               }
       }
@@ -5073,21 +4547,6 @@ uvm_mapent_trymerge(struct vm_map *map,
}

/*
- * uvm_map_create: create map
- */
-
-struct vm_map *
-uvm_map_create(pmap_t pmap, vaddr_t vmin, vaddr_t vmax, int flags)
-{
-       struct vm_map *result;
-
-       result = malloc(sizeof(struct vm_map), M_VMMAP, M_WAITOK);
-       uvm_map_setup(result, vmin, vmax, flags);
-       result->pmap = pmap;
-       return(result);
-}
-
-/*
 * uvm_map_setup: init map
 *
 * => map must not be in service yet.
@@ -5140,7 +4599,6 @@ void
uvm_unmap1(struct vm_map *map, vaddr_t start, vaddr_t end, int flags)
{
       struct vm_map_entry *dead_entries;
-       struct uvm_mapent_reservation umr;
       UVMHIST_FUNC("uvm_unmap"); UVMHIST_CALLED(maphist);

       UVMHIST_LOG(maphist, "  (map=0x%x, start=0x%x, end=0x%x)",
@@ -5152,11 +4610,9 @@ uvm_unmap1(struct vm_map *map, vaddr_t s
        * work now done by helper functions.   wipe the pmap's and then
        * detach from the dead entries...
        */
-       uvm_mapent_reserve(map, &umr, 2, flags);
       vm_map_lock(map);
-       uvm_unmap_remove(map, start, end, &dead_entries, &umr, flags);
+       uvm_unmap_remove(map, start, end, &dead_entries, flags);
       vm_map_unlock(map);
-       uvm_mapent_unreserve(map, &umr);

       if (dead_entries != NULL)
               uvm_unmap_detach(dead_entries, 0);
@@ -5179,15 +4635,6 @@ uvm_map_reference(struct vm_map *map)
       mutex_exit(&map->misc_lock);
}

-struct vm_map_kernel *
-vm_map_to_kernel(struct vm_map *map)
-{
-
-       KASSERT(VM_MAP_IS_KERNEL(map));
-
-       return (struct vm_map_kernel *)map;
-}
-
bool
vm_map_starved_p(struct vm_map *map)
{
Index: sys/uvm/uvm_map.h
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_map.h,v
retrieving revision 1.69
diff -u -p -r1.69 uvm_map.h
--- sys/uvm/uvm_map.h   21 Jan 2012 16:51:38 -0000      1.69
+++ sys/uvm/uvm_map.h   23 Jan 2012 22:02:25 -0000
@@ -81,9 +81,9 @@
 * => map must be locked by caller
 */

-#define UVM_MAP_CLIP_START(MAP,ENTRY,VA,UMR) { \
+#define UVM_MAP_CLIP_START(MAP,ENTRY,VA) { \
       if ((VA) > (ENTRY)->start && (VA) < (ENTRY)->end) { \
-               uvm_map_clip_start(MAP,ENTRY,VA,UMR); \
+               uvm_map_clip_start(MAP,ENTRY,VA); \
       } \
}

@@ -94,11 +94,11 @@
 * => map must be locked by caller
 */

-#define UVM_MAP_CLIP_END(MAP,ENTRY,VA,UMR) { \
+#define UVM_MAP_CLIP_END(MAP,ENTRY,VA) { \
       if ((VA) > (ENTRY)->start && (VA) < (ENTRY)->end) { \
-               uvm_map_clip_end(MAP,ENTRY,VA,UMR); \
+               uvm_map_clip_end(MAP,ENTRY,VA); \
       } \
-}
+}

/*
 * extract flags
@@ -151,10 +151,8 @@ struct vm_map_entry {

#define        UVM_MAP_KERNEL          0x01            /* kernel map entry */
#define        UVM_MAP_KMAPENT         0x02            /* contains map entries */
-#define        UVM_MAP_FIRST           0x04            /* the first special entry */
-#define        UVM_MAP_QUANTUM         0x08            /* allocated with
-                                                * UVM_FLAG_QUANTUM */
-#define        UVM_MAP_NOMERGE         0x10            /* this entry is not mergable */
+#define        UVM_MAP_STATIC          0x04            /* special static entries */
+#define        UVM_MAP_NOMERGE         0x08            /* this entry is not mergable */

};

@@ -232,19 +230,6 @@ struct vm_map {

#include <sys/callback.h>

-struct vm_map_kernel {
-       struct vm_map vmk_map;
-       LIST_HEAD(, uvm_kmapent_hdr) vmk_kentry_free;
-                       /* Freelist of map entry */
-       struct vm_map_entry     *vmk_merged_entries;
-                       /* Merged entries, kept for later splitting */
-
-       struct callback_head vmk_reclaim_callback;
-#if !defined(PMAP_MAP_POOLPAGE)
-       struct pool vmk_vacache; /* kva cache */
-       struct pool_allocator vmk_vacache_allocator; /* ... and its allocator */
-#endif
-};
#endif /* defined(_KERNEL) */

#define        VM_MAP_IS_KERNEL(map)   (vm_map_pmap(map) == pmap_kernel())
@@ -255,19 +240,9 @@ struct vm_map_kernel {
#define        VM_MAP_WIREFUTURE       0x04            /* rw: wire future mappings */
#define        VM_MAP_DYING            0x20            /* rw: map is being destroyed */
#define        VM_MAP_TOPDOWN          0x40            /* ro: arrange map top-down */
-#define        VM_MAP_VACACHE          0x80            /* ro: use kva cache */
#define        VM_MAP_WANTVA           0x100           /* rw: want va */

#ifdef _KERNEL
-struct uvm_mapent_reservation {
-       struct vm_map_entry *umr_entries[2];
-       int umr_nentries;
-};
-#define        UMR_EMPTY(umr)          ((umr) == NULL || (umr)->umr_nentries == 0)
-#define        UMR_GETENTRY(umr)       ((umr)->umr_entries[--(umr)->umr_nentries])
-#define        UMR_PUTENTRY(umr, ent)  \
-       (umr)->umr_entries[(umr)->umr_nentries++] = (ent)
-
struct uvm_map_args {
       struct vm_map_entry *uma_prev;

@@ -302,10 +277,9 @@ void               uvm_map_deallocate(struct vm_map *
int            uvm_map_willneed(struct vm_map *, vaddr_t, vaddr_t);
int            uvm_map_clean(struct vm_map *, vaddr_t, vaddr_t, int);
void           uvm_map_clip_start(struct vm_map *, struct vm_map_entry *,
-                   vaddr_t, struct uvm_mapent_reservation *);
+                   vaddr_t);
void           uvm_map_clip_end(struct vm_map *, struct vm_map_entry *,
-                   vaddr_t, struct uvm_mapent_reservation *);
-struct vm_map  *uvm_map_create(pmap_t, vaddr_t, vaddr_t, int);
+                   vaddr_t);
int            uvm_map_extract(struct vm_map *, vaddr_t, vsize_t,
                   struct vm_map *, vaddr_t *, int);
struct vm_map_entry *
@@ -315,24 +289,20 @@ int               uvm_map_inherit(struct vm_map *, va
                   vm_inherit_t);
int            uvm_map_advice(struct vm_map *, vaddr_t, vaddr_t, int);
void           uvm_map_init(void);
+void           uvm_map_init_caches(void);
bool           uvm_map_lookup_entry(struct vm_map *, vaddr_t,
                   struct vm_map_entry **);
void           uvm_map_reference(struct vm_map *);
int            uvm_map_reserve(struct vm_map *, vsize_t, vaddr_t, vsize_t,
                   vaddr_t *, uvm_flag_t);
void           uvm_map_setup(struct vm_map *, vaddr_t, vaddr_t, int);
-void           uvm_map_setup_kernel(struct vm_map_kernel *,
-                   vaddr_t, vaddr_t, int);
-struct vm_map_kernel *
-               vm_map_to_kernel(struct vm_map *);
int            uvm_map_submap(struct vm_map *, vaddr_t, vaddr_t,
                   struct vm_map *);
void           uvm_unmap1(struct vm_map *, vaddr_t, vaddr_t, int);
#define        uvm_unmap(map, s, e)    uvm_unmap1((map), (s), (e), 0)
void           uvm_unmap_detach(struct vm_map_entry *,int);
void           uvm_unmap_remove(struct vm_map *, vaddr_t, vaddr_t,
-                   struct vm_map_entry **, struct uvm_mapent_reservation *,
-                   int);
+                   struct vm_map_entry **, int);

int            uvm_map_prepare(struct vm_map *, vaddr_t, vsize_t,
                   struct uvm_object *, voff_t, vsize_t, uvm_flag_t,
@@ -340,13 +310,6 @@ int                uvm_map_prepare(struct vm_map *, va
int            uvm_map_enter(struct vm_map *, const struct uvm_map_args *,
                   struct vm_map_entry *);

-int            uvm_mapent_reserve(struct vm_map *,
-                   struct uvm_mapent_reservation *, int, int);
-void           uvm_mapent_unreserve(struct vm_map *,
-                   struct uvm_mapent_reservation *);
-
-vsize_t                uvm_mapent_overhead(vsize_t, int);
-
int            uvm_mapent_trymerge(struct vm_map *,
                   struct vm_map_entry *, int);
#define        UVM_MERGE_COPYING       1
Index: sys/uvm/uvm_meter.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_meter.c,v
retrieving revision 1.58
diff -u -p -r1.58 uvm_meter.c
--- sys/uvm/uvm_meter.c 30 Dec 2011 19:01:07 -0000      1.58
+++ sys/uvm/uvm_meter.c 23 Jan 2012 22:02:25 -0000
@@ -249,12 +249,6 @@ SYSCTL_SETUP(sysctl_vm_setup, "sysctl vm
                      CTL_VM, VM_UVMEXP, CTL_EOL);
       sysctl_createv(clog, 0, NULL, NULL,
                      CTLFLAG_PERMANENT,
-                      CTLTYPE_INT, "nkmempages",
-                      SYSCTL_DESCR("Default number of pages in kmem_map"),
-                      NULL, 0, &nkmempages, 0,
-                      CTL_VM, VM_NKMEMPAGES, CTL_EOL);
-       sysctl_createv(clog, 0, NULL, NULL,
-                      CTLFLAG_PERMANENT,
                      CTLTYPE_STRUCT, "uvmexp2",
                      SYSCTL_DESCR("Detailed system-wide virtual memory "
                                   "statistics (MI)"),
Index: sys/uvm/uvm_mmap.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_mmap.c,v
retrieving revision 1.143
diff -u -p -r1.143 uvm_mmap.c
--- sys/uvm/uvm_mmap.c  5 Jan 2012 15:19:53 -0000       1.143
+++ sys/uvm/uvm_mmap.c  23 Jan 2012 22:02:26 -0000
@@ -701,7 +701,7 @@ sys_munmap(struct lwp *l, const struct s
               return (EINVAL);
       }
#endif
-       uvm_unmap_remove(map, addr, addr + size, &dead_entries, NULL, 0);
+       uvm_unmap_remove(map, addr, addr + size, &dead_entries, 0);
       vm_map_unlock(map);
       if (dead_entries != NULL)
               uvm_unmap_detach(dead_entries, 0);
Index: sys/uvm/uvm_page.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_page.c,v
retrieving revision 1.178
diff -u -p -r1.178 uvm_page.c
--- sys/uvm/uvm_page.c  6 Oct 2011 12:26:03 -0000       1.178
+++ sys/uvm/uvm_page.c  23 Jan 2012 22:02:26 -0000
@@ -74,7 +74,6 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_page.c,v

#include <sys/param.h>
#include <sys/systm.h>
-#include <sys/malloc.h>
#include <sys/sched.h>
#include <sys/kernel.h>
#include <sys/vnode.h>
@@ -136,9 +135,7 @@ static vaddr_t      virtual_space_end;
 * uvm_pageboot_alloc().
 */

-static bool have_recolored_pages /* = false */;
-
-MALLOC_DEFINE(M_VMPAGE, "VM page", "VM page");
+static size_t recolored_pages_memsize /* = 0 */;

#ifdef DEBUG
vaddr_t uvm_zerocheckkva;
@@ -353,7 +350,6 @@ uvm_page_init(vaddr_t *kvm_startp, vaddr

       uvm.cpus[0] = &boot_cpu;
       curcpu()->ci_data.cpu_uvm = &boot_cpu;
-       uvm_reclaim_init();
       uvmpdpol_init();
       mutex_init(&uvm_pageqlock, MUTEX_DRIVER, IPL_NONE);
       mutex_init(&uvm_fpageqlock, MUTEX_DRIVER, IPL_VM);
@@ -766,7 +762,7 @@ uvm_page_physload(paddr_t start, paddr_t

       /*
        * check to see if this is a "preload" (i.e. uvm_page_init hasn't been
-        * called yet, so malloc is not available).
+        * called yet, so kmem is not available).
        */

       for (lcv = 0 ; lcv < vm_nphysmem ; lcv++) {
@@ -776,7 +772,7 @@ uvm_page_physload(paddr_t start, paddr_t
       preload = (lcv == vm_nphysmem);

       /*
-        * if VM is already running, attempt to malloc() vm_page structures
+        * if VM is already running, attempt to kmem_alloc vm_page structures
        */

       if (!preload) {
@@ -984,6 +980,7 @@ uvm_page_recolor(int newncolors)
       struct pgfreelist gpgfl, pgfl;
       struct vm_page *pg;
       vsize_t bucketcount;
+       size_t bucketmemsize, oldbucketmemsize;
       int lcv, color, i, ocolors;
       struct uvm_cpu *ucpu;

@@ -998,8 +995,8 @@ uvm_page_recolor(int newncolors)
       }

       bucketcount = newncolors * VM_NFREELIST;
-       bucketarray = malloc(bucketcount * sizeof(struct pgflbucket) * 2,
-           M_VMPAGE, M_NOWAIT);
+       bucketmemsize = bucketcount * sizeof(struct pgflbucket) * 2;
+       bucketarray = kmem_alloc(bucketmemsize, KM_SLEEP);
       cpuarray = bucketarray + bucketcount;
       if (bucketarray == NULL) {
               printf("WARNING: unable to allocate %ld page color buckets\n",
@@ -1012,7 +1009,7 @@ uvm_page_recolor(int newncolors)
       /* Make sure we should still do this. */
       if (newncolors <= uvmexp.ncolors) {
               mutex_spin_exit(&uvm_fpageqlock);
-               free(bucketarray, M_VMPAGE);
+               kmem_free(bucketarray, bucketmemsize);
               return;
       }

@@ -1048,14 +1045,14 @@ uvm_page_recolor(int newncolors)
               ucpu->page_free[lcv].pgfl_buckets = pgfl.pgfl_buckets;
       }

-       if (!have_recolored_pages)
-               oldbucketarray = NULL;
+       oldbucketmemsize = recolored_pages_memsize;

-       have_recolored_pages = true;
+       recolored_pages_memsize = bucketmemsize;
       mutex_spin_exit(&uvm_fpageqlock);

-       if (oldbucketarray)
-               free(oldbucketarray, M_VMPAGE);
+       if (oldbucketmemsize) {
+               kmem_free(oldbucketarray, recolored_pages_memsize);
+       }

       /*
        * this calls uvm_km_alloc() which may want to hold
@@ -1087,8 +1084,8 @@ uvm_cpu_attach(struct cpu_info *ci)

       /* Configure this CPU's free lists. */
       bucketcount = uvmexp.ncolors * VM_NFREELIST;
-       bucketarray = malloc(bucketcount * sizeof(struct pgflbucket),
-           M_VMPAGE, M_WAITOK);
+       bucketarray = kmem_alloc(bucketcount * sizeof(struct pgflbucket),
+           KM_SLEEP);
       ucpu = kmem_zalloc(sizeof(*ucpu), KM_SLEEP);
       uvm.cpus[cpu_index(ci)] = ucpu;
       ci->ci_data.cpu_uvm = ucpu;
Index: sys/uvm/uvm_pager.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_pager.c,v
retrieving revision 1.107
diff -u -p -r1.107 uvm_pager.c
--- sys/uvm/uvm_pager.c 11 Oct 2011 23:57:07 -0000      1.107
+++ sys/uvm/uvm_pager.c 23 Jan 2012 22:02:26 -0000
@@ -272,7 +272,7 @@ uvm_pagermapout(vaddr_t kva, int npages)
       }

       vm_map_lock(pager_map);
-       uvm_unmap_remove(pager_map, kva, kva + size, &entries, NULL, 0);
+       uvm_unmap_remove(pager_map, kva, kva + size, &entries, 0);
       mutex_enter(&pager_map_wanted_lock);
       if (pager_map_wanted) {
               pager_map_wanted = false;
Index: sys/uvm/uvm_pdaemon.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_pdaemon.c,v
retrieving revision 1.103
diff -u -p -r1.103 uvm_pdaemon.c
--- sys/uvm/uvm_pdaemon.c       12 Jun 2011 03:36:03 -0000      1.103
+++ sys/uvm/uvm_pdaemon.c       23 Jan 2012 22:02:26 -0000
@@ -109,10 +109,6 @@ static unsigned int uvm_pagedaemon_waite
 */
u_int uvm_extrapages;

-static kmutex_t uvm_reclaim_lock;
-
-SLIST_HEAD(uvm_reclaim_hooks, uvm_reclaim_hook) uvm_reclaim_list;
-
/*
 * uvm_wait: wait (sleep) for the page daemon to free some pages
 *
@@ -232,7 +228,6 @@ uvm_pageout(void *arg)
       int extrapages = 0;
       struct pool *pp;
       uint64_t where;
-       struct uvm_reclaim_hook *hook;

       UVMHIST_FUNC("uvm_pageout"); UVMHIST_CALLED(pdhist);

@@ -325,7 +320,7 @@ uvm_pageout(void *arg)
                * if we don't need free memory, we're done.
                */

-               if (!needsfree)
+               if (!needsfree && !uvm_km_va_starved_p())
                       continue;

               /*
@@ -341,12 +336,6 @@ uvm_pageout(void *arg)
               buf_drain(bufcnt << PAGE_SHIFT);
               mutex_exit(&bufcache_lock);

-               mutex_enter(&uvm_reclaim_lock);
-               SLIST_FOREACH(hook, &uvm_reclaim_list, uvm_reclaim_next) {
-                       (*hook->uvm_reclaim_hook)();
-               }
-               mutex_exit(&uvm_reclaim_lock);
-
               /*
                * complete draining the pools.
                */
@@ -1032,43 +1021,3 @@ uvm_estimatepageable(int *active, int *i
       uvmpdpol_estimatepageable(active, inactive);
}

-void
-uvm_reclaim_init(void)
-{
-
-       /* Initialize UVM reclaim hooks. */
-       mutex_init(&uvm_reclaim_lock, MUTEX_DEFAULT, IPL_NONE);
-       SLIST_INIT(&uvm_reclaim_list);
-}
-
-void
-uvm_reclaim_hook_add(struct uvm_reclaim_hook *hook)
-{
-
-       KASSERT(hook != NULL);
-
-       mutex_enter(&uvm_reclaim_lock);
-       SLIST_INSERT_HEAD(&uvm_reclaim_list, hook, uvm_reclaim_next);
-       mutex_exit(&uvm_reclaim_lock);
-}
-
-void
-uvm_reclaim_hook_del(struct uvm_reclaim_hook *hook_entry)
-{
-       struct uvm_reclaim_hook *hook;
-
-       KASSERT(hook_entry != NULL);
-
-       mutex_enter(&uvm_reclaim_lock);
-       SLIST_FOREACH(hook, &uvm_reclaim_list, uvm_reclaim_next) {
-               if (hook != hook_entry) {
-                       continue;
-               }
-
-               SLIST_REMOVE(&uvm_reclaim_list, hook, uvm_reclaim_hook,
-                   uvm_reclaim_next);
-               break;
-       }
-
-       mutex_exit(&uvm_reclaim_lock);
-}
Index: sys/uvm/uvm_pdpolicy_clock.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_pdpolicy_clock.c,v
retrieving revision 1.14
diff -u -p -r1.14 uvm_pdpolicy_clock.c
--- sys/uvm/uvm_pdpolicy_clock.c        12 Jun 2011 03:36:04 -0000      1.14
+++ sys/uvm/uvm_pdpolicy_clock.c        23 Jan 2012 22:02:27 -0000
@@ -419,8 +419,23 @@ uvmpdpol_reinit(void)
bool
uvmpdpol_needsscan_p(void)
{
+       vmem_size_t kva_size;
+       vmem_size_t kva_free;

-       return pdpol_state.s_inactive < pdpol_state.s_inactarg;
+       kva_size = vmem_size(kmem_arena, VMEM_FREE|VMEM_ALLOC);
+       kva_free = vmem_size(kmem_arena, VMEM_FREE);
+
+       if (kva_free < (kva_size / 10)) {
+               return true;
+       }
+
+       if (pdpol_state.s_inactive < pdpol_state.s_inactarg) {
+               return true;
+       }
+               if (pdpol_state.s_inactive < pdpol_state.s_inactarg) {
+               return true;
+       }
+       return false;
}

void
Index: sys/uvm/uvm_swap.c
===================================================================
RCS file: /cvsroot/src/sys/uvm/uvm_swap.c,v
retrieving revision 1.158
diff -u -p -r1.158 uvm_swap.c
--- sys/uvm/uvm_swap.c  12 Dec 2011 19:03:13 -0000      1.158
+++ sys/uvm/uvm_swap.c  23 Jan 2012 22:02:27 -0000
@@ -46,13 +46,13 @@ __KERNEL_RCSID(0, "$NetBSD: uvm_swap.c,v
#include <sys/disklabel.h>
#include <sys/errno.h>
#include <sys/kernel.h>
-#include <sys/malloc.h>
#include <sys/vnode.h>
#include <sys/file.h>
#include <sys/vmem.h>
#include <sys/blist.h>
#include <sys/mount.h>
#include <sys/pool.h>
+#include <sys/kmem.h>
#include <sys/syscallargs.h>
#include <sys/swap.h>
#include <sys/kauth.h>
@@ -208,7 +208,6 @@ static struct pool vndxfer_pool, vndbuf_
/*
 * local variables
 */
-MALLOC_DEFINE(M_VMSWAP, "VM swap", "VM swap structures");
static vmem_t *swapmap;        /* controls the mapping of /dev/drum */

/* list of all active swap devices [by priority] */
@@ -344,7 +343,7 @@ swaplist_insert(struct swapdev *sdp, str
                       LIST_INSERT_HEAD(&swap_priority, spp, spi_swappri);
       } else {
               /* we don't need a new priority structure, free it */
-               free(newspp, M_VMSWAP);
+               kmem_free(newspp, sizeof(*newspp));
       }

       /*
@@ -405,7 +404,7 @@ swaplist_trim(void)
                   (void *)&spp->spi_swapdev)
                       continue;
               LIST_REMOVE(spp, spi_swappri);
-               free(spp, M_VMSWAP);
+               kmem_free(spp, sizeof(*spp));
       }
}

@@ -462,12 +461,13 @@ sys_swapctl(struct lwp *l, const struct

       misc = SCARG(uap, misc);

+       userpath = kmem_alloc(SWAP_PATH_MAX, KM_SLEEP);
+
       /*
        * ensure serialized syscall access by grabbing the swap_syscall_lock
        */
       rw_enter(&swap_syscall_lock, RW_WRITER);

-       userpath = malloc(SWAP_PATH_MAX, M_TEMP, M_WAITOK);
       /*
        * we handle the non-priv NSWAP and STATS request first.
        *
@@ -511,12 +511,12 @@ sys_swapctl(struct lwp *l, const struct
               else
#endif
                       len = sizeof(struct swapent) * misc;
-               sep = (struct swapent *)malloc(len, M_TEMP, M_WAITOK);
+               sep = (struct swapent *)kmem_alloc(len, KM_SLEEP);

               uvm_swap_stats(SCARG(uap, cmd), sep, misc, retval);
               error = copyout(sep, SCARG(uap, arg), len);

-               free(sep, M_TEMP);
+               kmem_free(sep, len);
               UVMHIST_LOG(pdhist, "<- done SWAP_STATS", 0, 0, 0, 0);
               goto out;
       }
@@ -615,7 +615,7 @@ sys_swapctl(struct lwp *l, const struct
                * any empty priority structures.
                */
               priority = SCARG(uap, misc);
-               spp = malloc(sizeof *spp, M_VMSWAP, M_WAITOK);
+               spp = kmem_alloc(sizeof(*spp), KM_SLEEP);
               mutex_enter(&uvm_swap_data_lock);
               if ((sdp = swaplist_find(vp, true)) == NULL) {
                       error = ENOENT;
@@ -625,7 +625,7 @@ sys_swapctl(struct lwp *l, const struct
               }
               mutex_exit(&uvm_swap_data_lock);
               if (error)
-                       free(spp, M_VMSWAP);
+                       kmem_free(spp, sizeof(*spp));
               break;

       case SWAP_ON:
@@ -638,8 +638,8 @@ sys_swapctl(struct lwp *l, const struct
                */

               priority = SCARG(uap, misc);
-               sdp = malloc(sizeof *sdp, M_VMSWAP, M_WAITOK);
-               spp = malloc(sizeof *spp, M_VMSWAP, M_WAITOK);
+               sdp = kmem_alloc(sizeof(*sdp), KM_SLEEP);
+               spp = kmem_alloc(sizeof(*spp), KM_SLEEP);
               memset(sdp, 0, sizeof(*sdp));
               sdp->swd_flags = SWF_FAKE;
               sdp->swd_vp = vp;
@@ -650,15 +650,15 @@ sys_swapctl(struct lwp *l, const struct
                       error = EBUSY;
                       mutex_exit(&uvm_swap_data_lock);
                       bufq_free(sdp->swd_tab);
-                       free(sdp, M_VMSWAP);
-                       free(spp, M_VMSWAP);
+                       kmem_free(sdp, sizeof(*sdp));
+                       kmem_free(spp, sizeof(*spp));
                       break;
               }
               swaplist_insert(sdp, spp, priority);
               mutex_exit(&uvm_swap_data_lock);

               sdp->swd_pathlen = len;
-               sdp->swd_path = malloc(sdp->swd_pathlen, M_VMSWAP, M_WAITOK);
+               sdp->swd_path = kmem_alloc(sdp->swd_pathlen, KM_SLEEP);
               if (copystr(userpath, sdp->swd_path, sdp->swd_pathlen, 0) != 0)
                       panic("swapctl: copystr");

@@ -675,8 +675,8 @@ sys_swapctl(struct lwp *l, const struct
                       swaplist_trim();
                       mutex_exit(&uvm_swap_data_lock);
                       bufq_free(sdp->swd_tab);
-                       free(sdp->swd_path, M_VMSWAP);
-                       free(sdp, M_VMSWAP);
+                       kmem_free(sdp->swd_path, sdp->swd_pathlen);
+                       kmem_free(sdp, sizeof(*sdp));
                       break;
               }
               break;
@@ -715,7 +715,7 @@ sys_swapctl(struct lwp *l, const struct
       vput(vp);

out:
-       free(userpath, M_TEMP);
+       kmem_free(userpath, SWAP_PATH_MAX);
       rw_exit(&swap_syscall_lock);

       UVMHIST_LOG(pdhist, "<- done!  error=%d", error, 0, 0, 0);
@@ -1100,7 +1100,7 @@ swap_off(struct lwp *l, struct swapdev *
       vmem_free(swapmap, sdp->swd_drumoffset, sdp->swd_drumsize);
       blist_destroy(sdp->swd_blist);
       bufq_free(sdp->swd_tab);
-       free(sdp, M_VMSWAP);
+       kmem_free(sdp, sizeof(*sdp));
       return (0);
}

Index: tests/kernel/t_extent.c
===================================================================
RCS file: /cvsroot/src/tests/kernel/t_extent.c,v
retrieving revision 1.3
diff -u -p -r1.3 t_extent.c
--- tests/kernel/t_extent.c     11 Jun 2011 18:03:17 -0000      1.3
+++ tests/kernel/t_extent.c     23 Jan 2012 22:02:27 -0000
@@ -48,7 +48,7 @@ static struct extent *ex;

#define h_create(name, start, end, flags) \
       ATF_REQUIRE((ex = extent_create(name, \
-           start, end, 0, 0, 0, flags)) != NULL);
+           start, end, 0, 0, flags)) != NULL);

#define h_alloc_region(start, size) \
       ATF_REQUIRE_EQ_MSG(ret = extent_alloc_region(ex, \
Index: usr.bin/pmap/pmap.c
===================================================================
RCS file: /cvsroot/src/usr.bin/pmap/pmap.c,v
retrieving revision 1.47
diff -u -p -r1.47 pmap.c
--- usr.bin/pmap/pmap.c 11 Oct 2011 12:25:56 -0000      1.47
+++ usr.bin/pmap/pmap.c 23 Jan 2012 22:02:29 -0000
@@ -302,12 +302,11 @@ dump_vm_map_entry(kvm_t *kd, struct kinf
               printf("%*s    aref = { ar_pageoff = %x, ar_amap = %p },",
                      indent(2), "", vme->aref.ar_pageoff, vme->aref.ar_amap);
               printf(" advice = %d,\n", vme->advice);
-               printf("%*s    flags = %x <%s%s%s%s%s > }\n", indent(2), "",
+               printf("%*s    flags = %x <%s%s%s%s > }\n", indent(2), "",
                      vme->flags,
                      vme->flags & UVM_MAP_KERNEL ? " KERNEL" : "",
                      vme->flags & UVM_MAP_KMAPENT ? " KMAPENT" : "",
-                      vme->flags & UVM_MAP_FIRST ? " FIRST" : "",
-                      vme->flags & UVM_MAP_QUANTUM ? " QUANTUM" : "",
+                      vme->flags & UVM_MAP_STATIC ? " STATIC" : "",
                      vme->flags & UVM_MAP_NOMERGE ? " NOMERGE" : "");
       }