svn commit: r241326 - stable/9/sys/x86/x86
John Baldwin
jhb at FreeBSD.org
Sun Oct 7 18:47:54 UTC 2012
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);
More information about the svn-src-stable-9
mailing list