Author: jhb
Date: Sun Oct  7 18:47:53 2012
New Revision: 241326
URL: http://svn.freebsd.org/changeset/base/241326

Log:
  MFC 239354:
  Allow static DMA allocations that allow for enough segments to do page-sized
  segments for the entire allocation to use kmem_alloc_attr() to allocate
  KVM rather than using kmem_alloc_contig().  This avoids requiring
  a single physically contiguous chunk in this case.

Modified:
  stable/9/sys/x86/x86/busdma_machdep.c
Directory Properties:
  stable/9/sys/   (props changed)

Modified: stable/9/sys/x86/x86/busdma_machdep.c
==============================================================================
--- stable/9/sys/x86/x86/busdma_machdep.c       Sun Oct  7 18:42:02 2012        
(r241325)
+++ stable/9/sys/x86/x86/busdma_machdep.c       Sun Oct  7 18:47:53 2012        
(r241326)
@@ -541,13 +541,14 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, voi
            dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem) &&
            attr == VM_MEMATTR_DEFAULT) {
                *vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags);
+       } else if (dmat->nsegments >= btoc(dmat->maxsize) &&
+           dmat->alignment <= PAGE_SIZE &&
+           (dmat->boundary == 0 || dmat->boundary >= dmat->lowaddr)) {
+               /* Page-based multi-segment allocations allowed */
+               *vaddr = (void *)kmem_alloc_attr(kernel_map, dmat->maxsize,
+                   mflags, 0ul, dmat->lowaddr, attr);
+               *mapp = &contig_dmamap;
        } else {
-               /*
-                * XXX Use Contigmalloc until it is merged into this facility
-                *     and handles multi-seg allocations.  Nobody is doing
-                *     multi-seg allocations yet though.
-                * XXX Certain AGP hardware does.
-                */
                *vaddr = (void *)kmem_alloc_contig(kernel_map, dmat->maxsize,
                    mflags, 0ul, dmat->lowaddr, dmat->alignment ?
                    dmat->alignment : 1ul, dmat->boundary, attr);
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to