Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 7 Oct 2012 18:47:53 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-9@freebsd.org
Subject:   svn commit: r241326 - stable/9/sys/x86/x86
Message-ID:  <201210071847.q97Ilrp5051076@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
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);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201210071847.q97Ilrp5051076>