Convert bus_dmamem_map(9) to km_alloc(9) in order to make it fail and
authormpi <mpi@openbsd.org>
Fri, 11 Jul 2014 09:36:25 +0000 (09:36 +0000)
committermpi <mpi@openbsd.org>
Fri, 11 Jul 2014 09:36:25 +0000 (09:36 +0000)
not sleep if the allocator cannot obtain a lock when BUS_DMA_NOWAIT is
specified.

idea and inputs from kettenis@, ok miod@

15 files changed:
sys/arch/alpha/dev/bus_dma.c
sys/arch/amd64/amd64/bus_dma.c
sys/arch/arm/arm/bus_dma.c
sys/arch/aviion/aviion/bus_dma.c
sys/arch/i386/i386/bus_dma.c
sys/arch/landisk/landisk/bus_dma.c
sys/arch/loongson/loongson/bus_dma.c
sys/arch/macppc/macppc/dma.c
sys/arch/octeon/octeon/bus_dma.c
sys/arch/sgi/sgi/bus_dma.c
sys/arch/socppc/socppc/dma.c
sys/arch/sparc/sparc/iommu.c
sys/arch/sparc/sparc/machdep.c
sys/arch/sparc64/sparc64/machdep.c
sys/arch/vax/vax/bus_dma.c

index 1b30fb7..3d4f2ad 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: bus_dma.c,v 1.31 2011/06/23 20:44:38 ariane Exp $ */
+/* $OpenBSD: bus_dma.c,v 1.32 2014/07/11 09:36:25 mpi Exp $ */
 /* $NetBSD: bus_dma.c,v 1.40 2000/07/17 04:47:56 thorpej Exp $ */
 
 /*-
@@ -583,6 +583,7 @@ _bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
        size_t ssize;
        bus_addr_t addr;
        int curseg, error;
+       const struct kmem_dyn_mode *kd;
 
        /*
         * If we're only mapping 1 segment, use K0SEG, to avoid
@@ -594,9 +595,8 @@ _bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
        }
 
        size = round_page(size);
-
-       va = uvm_km_valloc(kernel_map, size);
-
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -615,7 +615,7 @@ _bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
                            VM_PROT_WRITE | PMAP_WIRED | PMAP_CANFAIL);
                        if (error) {
                                pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
                                return (error);
                        }
                }
@@ -648,8 +648,7 @@ _bus_dmamem_unmap(t, kva, size)
            kva <= (caddr_t)ALPHA_K0SEG_END)
                return;
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index d625768..61a1c7c 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bus_dma.c,v 1.43 2014/05/04 20:09:15 sf Exp $ */
+/*     $OpenBSD: bus_dma.c,v 1.44 2014/07/11 09:36:25 mpi Exp $        */
 /*     $NetBSD: bus_dma.c,v 1.3 2003/05/07 21:33:58 fvdl Exp $ */
 
 /*-
@@ -467,6 +467,7 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
        size_t ssize;
        bus_addr_t addr;
        int curseg, pmapflags = 0, error;
+       const struct kmem_dyn_mode *kd;
 
        if (nsegs == 1 && (flags & BUS_DMA_NOCACHE) == 0) {
                *kvap = (caddr_t)PMAP_DIRECT_MAP(segs[0].ds_addr);
@@ -477,7 +478,8 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
                pmapflags |= PMAP_NOCACHE;
 
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -496,7 +498,7 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
                            VM_PROT_WRITE | PMAP_WIRED | PMAP_CANFAIL);
                        if (error) {
                                pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
                                return (error);
                        }
                }
@@ -521,8 +523,7 @@ _bus_dmamem_unmap(bus_dma_tag_t t, caddr_t kva, size_t size)
        if (kva >= (caddr_t)PMAP_DIRECT_BASE && kva <= (caddr_t)PMAP_DIRECT_END)
                return;
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index 051f790..1ef6d85 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bus_dma.c,v 1.24 2013/05/10 20:25:28 patrick Exp $    */
+/*     $OpenBSD: bus_dma.c,v 1.25 2014/07/11 09:36:25 mpi Exp $        */
 /*     $NetBSD: bus_dma.c,v 1.38 2003/10/30 08:44:13 scw Exp $ */
 
 /*-
@@ -735,6 +735,7 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
        size_t ssize;
        bus_addr_t addr;
        int curseg;
+       const struct kmem_dyn_mode *kd;
 #ifdef DEBUG_DMA
        pt_entry_t *ptep;
 #endif
@@ -745,8 +746,8 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
 #endif /* DEBUG_DMA */
 
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
-
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -797,8 +798,7 @@ _bus_dmamem_unmap(bus_dma_tag_t t, caddr_t kva, size_t size)
                panic("_bus_dmamem_unmap");
 #endif /* DIAGNOSTIC */
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index 9da9a61..0c34ad2 100644 (file)
@@ -1,4 +1,4 @@
-/*      $OpenBSD: bus_dma.c,v 1.5 2011/10/09 17:08:21 miod Exp $       */
+/*      $OpenBSD: bus_dma.c,v 1.6 2014/07/11 09:36:26 mpi Exp $        */
 /*      $NetBSD: bus_dma.c,v 1.2 2001/06/10 02:31:25 briggs Exp $        */
 
 /*-
@@ -522,11 +522,11 @@ bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
         size_t ssize;
         bus_addr_t addr;
         int curseg, error;
+       const struct kmem_dyn_mode *kd;
 
         size = round_page(size);
-
-        va = uvm_km_valloc(kernel_map, size);
-
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
         if (va == 0)
                 return (ENOMEM);
 
@@ -543,10 +543,10 @@ bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
                         error = pmap_enter(pmap_kernel(), va, addr,
                             VM_PROT_READ | VM_PROT_WRITE, VM_PROT_READ |
                             VM_PROT_WRITE | PMAP_WIRED | PMAP_CANFAIL);
-                        if (error) {
-                               pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
-                               return (error);
+                       if (error) {
+                               pmap_update(pmap_kernel());
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
+                               return (error);
                         }
                        if (flags & BUS_DMA_COHERENT)
                                pmap_page_uncache(addr);
@@ -573,8 +573,7 @@ bus_dmamem_unmap(t, kva, size)
                 panic("bus_dmamem_unmap");
 #endif
 
-        size = round_page(size);
-        uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index f822ed4..d9c01ed 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bus_dma.c,v 1.29 2014/03/29 18:09:29 guenther Exp $   */
+/*     $OpenBSD: bus_dma.c,v 1.30 2014/07/11 09:36:26 mpi Exp $        */
 /*-
  * Copyright (c) 1996, 1997 The NetBSD Foundation, Inc.
  * All rights reserved.
@@ -430,12 +430,14 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
        size_t ssize;
        bus_addr_t addr;
        int curseg, pmapflags = 0, ret;
+       struct kmem_pa_mode *kd;
 
        if (flags & BUS_DMA_NOCACHE)
                pmapflags |= PMAP_NOCACHE;
 
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -458,7 +460,7 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
                            VM_PROT_WRITE | PMAP_WIRED | PMAP_CANFAIL);
                        if (ret) {
                                pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
                                return (ret);
                        }
 
@@ -482,8 +484,7 @@ _bus_dmamem_unmap(bus_dma_tag_t t, caddr_t kva, size_t size)
                panic("_bus_dmamem_unmap");
 #endif
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index 39ef56c..fe4c516 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bus_dma.c,v 1.9 2010/04/21 03:03:26 deraadt Exp $     */
+/*     $OpenBSD: bus_dma.c,v 1.10 2014/07/11 09:36:26 mpi Exp $        */
 /*     $NetBSD: bus_dma.c,v 1.1 2006/09/01 21:26:18 uwe Exp $  */
 
 /*
@@ -628,6 +628,7 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
        vaddr_t va;
        bus_addr_t addr;
        int curseg;
+       const struct kmem_dyn_mode *kd;
 
        DPRINTF(("bus_dmamem_map: t = %p, segs = %p, nsegs = %d, size = %d, kvap = %p, flags = %x\n", t, segs, nsegs, size, kvap, flags));
 
@@ -647,8 +648,8 @@ _bus_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
 
        /* Always round the size. */
        size = round_page(size);
-
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -691,7 +692,7 @@ _bus_dmamem_unmap(bus_dma_tag_t t, caddr_t kva, size_t size)
        size = round_page(size);
        pmap_kremove((vaddr_t)kva, size);
        pmap_update(pmap_kernel());
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, size, &kv_any, &kp_none);
 }
 
 paddr_t
index d4531a1..f547bec 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bus_dma.c,v 1.13 2014/03/21 21:49:45 miod Exp $ */
+/*     $OpenBSD: bus_dma.c,v 1.14 2014/07/11 09:36:26 mpi Exp $ */
 
 /*
  * Copyright (c) 2003-2004 Opsycon AB  (www.opsycon.se / www.opsycon.com)
@@ -432,6 +432,7 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
        paddr_t pa;
        bus_addr_t addr;
        int curseg, error, pmap_flags;
+       const struct kmem_dyn_mode *kd;
 
        if (nsegs == 1) {
                pa = (*t->_device_to_pa)(segs[0].ds_addr);
@@ -443,7 +444,8 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
        }
 
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -466,7 +468,7 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
                            VM_PROT_WRITE | pmap_flags);
                        if (error) {
                                pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
                                return (error);
                        }
 
@@ -498,8 +500,7 @@ _dmamem_unmap(bus_dma_tag_t t, caddr_t kva, size_t size)
        if (IS_XKPHYS((vaddr_t)kva))
                return;
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index fd0e241..0786029 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: dma.c,v 1.38 2014/03/31 18:58:41 mpi Exp $    */
+/*     $OpenBSD: dma.c,v 1.39 2014/07/11 09:36:26 mpi Exp $    */
 /*     $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $    */
 
 /*-
@@ -463,12 +463,14 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
        size_t ssize;
        bus_addr_t addr;
        int curseg, pmapflags = 0, error;
+       const struct kmem_dyn_mode *kd;
 
        if (flags & BUS_DMA_NOCACHE)
                pmapflags |= PMAP_NOCACHE;
 
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -487,7 +489,7 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
                            VM_PROT_WRITE | PMAP_WIRED | PMAP_CANFAIL);
                        if (error) {
                                pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
                                return (error);
                        }
                }
@@ -510,8 +512,7 @@ _dmamem_unmap(bus_dma_tag_t t, caddr_t kva, size_t size)
                panic("_bus_dmamem_unmap");
 #endif
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index e239633..d8fdd75 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bus_dma.c,v 1.10 2014/05/10 22:25:16 jasper Exp $ */
+/*     $OpenBSD: bus_dma.c,v 1.11 2014/07/11 09:36:26 mpi Exp $ */
 
 /*
  * Copyright (c) 2003-2004 Opsycon AB  (www.opsycon.se / www.opsycon.com)
@@ -425,6 +425,7 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
        paddr_t pa;
        bus_addr_t addr;
        int curseg, error, pmap_flags;
+       const struct kmem_dyn_mode *kd;
 
        if (nsegs == 1) {
                pa = (*t->_device_to_pa)(segs[0].ds_addr);
@@ -436,7 +437,8 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
        }
 
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -459,7 +461,7 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
                            VM_PROT_WRITE | pmap_flags);
                        if (error) {
                                pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
                                return (error);
                        }
 
@@ -491,8 +493,7 @@ _dmamem_unmap(bus_dma_tag_t t, caddr_t kva, size_t size)
        if (IS_XKPHYS((vaddr_t)kva))
                return;
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index f932d5d..915d529 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bus_dma.c,v 1.34 2014/05/19 21:18:42 miod Exp $ */
+/*     $OpenBSD: bus_dma.c,v 1.35 2014/07/11 09:36:26 mpi Exp $ */
 
 /*
  * Copyright (c) 2003-2004 Opsycon AB  (www.opsycon.se / www.opsycon.com)
@@ -443,6 +443,7 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
        paddr_t pa;
        bus_addr_t addr;
        int curseg, error, pmap_flags;
+       const struct kmem_dyn_mode *kd;
 
 #if defined(TGT_INDIGO2)
        /*
@@ -471,7 +472,8 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
        }
 
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -496,7 +498,7 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
                            VM_PROT_WRITE | pmap_flags);
                        if (error) {
                                pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
                                return (error);
                        }
 
@@ -528,8 +530,7 @@ _dmamem_unmap(bus_dma_tag_t t, caddr_t kva, size_t size)
        if (IS_XKPHYS((vaddr_t)kva))
                return;
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index dd7f0ac..5bb208f 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: dma.c,v 1.10 2014/03/31 18:58:41 mpi Exp $    */
+/*     $OpenBSD: dma.c,v 1.11 2014/07/11 09:36:26 mpi Exp $    */
 /*     $NetBSD: machdep.c,v 1.214 1996/11/10 03:16:17 thorpej Exp $    */
 
 /*-
@@ -463,9 +463,11 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
        size_t ssize;
        bus_addr_t addr;
        int curseg, error;
+       const struct kmem_dyn_mode *kd;
 
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -484,7 +486,7 @@ _dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs, size_t size,
                            VM_PROT_WRITE | PMAP_WIRED | PMAP_CANFAIL);
                        if (error) {
                                pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
                                return (error);
                        }
                }
@@ -507,8 +509,7 @@ _dmamem_unmap(bus_dma_tag_t t, caddr_t kva, size_t size)
                panic("_bus_dmamem_unmap");
 #endif
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index 80bec48..90de900 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: iommu.c,v 1.26 2014/04/08 13:23:51 mpi Exp $  */
+/*     $OpenBSD: iommu.c,v 1.27 2014/07/11 09:36:26 mpi Exp $  */
 /*     $NetBSD: iommu.c,v 1.13 1997/07/29 09:42:04 fair Exp $ */
 
 /*
@@ -691,6 +691,7 @@ iommu_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
        int cbit;
        u_long align;
        int pagesz = PAGE_SIZE;
+       const struct kmem_dyn_mode *kd;
 
        if (nsegs != 1)
                panic("iommu_dmamem_map: nsegs = %d", nsegs);
@@ -709,7 +710,8 @@ iommu_dmamem_map(bus_dma_tag_t t, bus_dma_segment_t *segs, int nsegs,
        va = _bus_dma_valloc_skewed(size, 0, align,
                                    segs[0].ds_addr & (align - 1));
 #else
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
 #endif
        if (va == 0)
                return (ENOMEM);
@@ -750,10 +752,7 @@ iommu_dmamem_unmap(bus_dma_tag_t t, void *kva, size_t size)
                panic("iommu_dmamem_unmap");
 #endif
 
-       size = round_page(size);
-       pmap_kremove((vaddr_t)kva, size);
-       pmap_update(pmap_kernel());
-       uvm_unmap(kernel_map, (vaddr_t)kva, (vaddr_t)kva + size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 
index 8f74a95..53fd055 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: machdep.c,v 1.158 2014/07/10 21:46:03 mpi Exp $       */
+/*     $OpenBSD: machdep.c,v 1.159 2014/07/11 09:36:26 mpi Exp $       */
 /*     $NetBSD: machdep.c,v 1.85 1997/09/12 08:55:02 pk Exp $ */
 
 /*
@@ -1104,8 +1104,7 @@ _bus_dmamem_unmap(bus_dma_tag_t t, void *kva, size_t size)
                panic("_bus_dmamem_unmap");
 #endif
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, (vaddr_t)size + size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index 98f2c85..c78acf2 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: machdep.c,v 1.161 2014/07/10 21:46:03 mpi Exp $       */
+/*     $OpenBSD: machdep.c,v 1.162 2014/07/11 09:36:26 mpi Exp $       */
 /*     $NetBSD: machdep.c,v 1.108 2001/07/24 19:30:14 eeh Exp $ */
 
 /*-
@@ -1440,6 +1440,7 @@ _bus_dmamem_map(t, t0, segs, nsegs, size, kvap, flags)
        caddr_t *kvap;
        int flags;
 {
+       const struct kmem_dyn_mode *kd;
        struct vm_page *m;
        vaddr_t va, sva;
        size_t ssize;
@@ -1453,7 +1454,8 @@ _bus_dmamem_map(t, t0, segs, nsegs, size, kvap, flags)
 #endif
 
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -1477,7 +1479,7 @@ _bus_dmamem_map(t, t0, segs, nsegs, size, kvap, flags)
                    VM_PROT_WRITE | PMAP_WIRED | PMAP_CANFAIL);
                if (error) {
                        pmap_update(pmap_kernel());
-                       uvm_km_free(kernel_map, sva, ssize);
+                       km_free((void *)sva, ssize, &kv_any, &kp_none);
                        return (error);
                }
                va += PAGE_SIZE;
@@ -1504,8 +1506,7 @@ _bus_dmamem_unmap(t, t0, kva, size)
                panic("_bus_dmamem_unmap");
 #endif
 
-       size = round_page(size);
-       uvm_km_free(kernel_map, (vaddr_t)kva, size);
+       km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*
index 86c0488..f59b5c4 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: bus_dma.c,v 1.27 2011/06/23 20:44:39 ariane Exp $     */
+/*     $OpenBSD: bus_dma.c,v 1.28 2014/07/11 09:36:26 mpi Exp $        */
 /*     $NetBSD: bus_dma.c,v 1.5 1999/11/13 00:32:20 thorpej Exp $      */
 
 /*-
@@ -427,6 +427,7 @@ _bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
        size_t ssize;
        bus_addr_t addr;
        int curseg, error;
+       const struct kmem_dyn_mode *kd;
 
        /*
         * Special case (but common):
@@ -448,8 +449,8 @@ _bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
                return 0;
        }
        size = round_page(size);
-       va = uvm_km_valloc(kernel_map, size);
-
+       kd = flags & BUS_DMA_NOWAIT ? &kd_trylock : &kd_waitok;
+       va = (vaddr_t)km_alloc(size, &kv_any, &kp_none, kd);
        if (va == 0)
                return (ENOMEM);
 
@@ -470,7 +471,7 @@ _bus_dmamem_map(t, segs, nsegs, size, kvap, flags)
                            VM_PROT_WRITE | PMAP_WIRED | PMAP_CANFAIL);
                        if (error) {
                                pmap_update(pmap_kernel());
-                               uvm_km_free(kernel_map, sva, ssize);
+                               km_free((void *)sva, ssize, &kv_any, &kp_none);
                                return (error);
                        }
                }
@@ -500,7 +501,7 @@ _bus_dmamem_unmap(t, kva, size)
 
        /* Avoid free'ing if not mapped */
        if (kva >= (caddr_t)virtual_avail)
-               uvm_km_free(kernel_map, (vaddr_t)kva, round_page(size));
+               km_free(kva, round_page(size), &kv_any, &kp_none);
 }
 
 /*