Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 27 Dec 2012 01:43:35 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r244724 - in projects/physbio/sys: arm/arm mips/mips
Message-ID:  <201212270143.qBR1hZVZ082059@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Thu Dec 27 01:43:35 2012
New Revision: 244724
URL: http://svnweb.freebsd.org/changeset/base/244724

Log:
   - Coalesce virtual addresses in the sync list so we are less likely to
     overrun our segment limit.
   - Unload tags on failure to load.  This releases reserved bounce pages.
  
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  projects/physbio/sys/arm/arm/busdma_machdep-v6.c
  projects/physbio/sys/arm/arm/busdma_machdep.c
  projects/physbio/sys/mips/mips/busdma_machdep.c

Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c
==============================================================================
--- projects/physbio/sys/arm/arm/busdma_machdep-v6.c	Thu Dec 27 00:17:54 2012	(r244723)
+++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c	Thu Dec 27 01:43:35 2012	(r244724)
@@ -773,12 +773,17 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		    map->pagesneeded != 0 && run_filter(dmat, curaddr)) {
 			curaddr = add_bounce_page(dmat, map, vaddr, sgsize);
 		} else {
-			sl = &map->slist[map->sync_count];
-			if (++map->sync_count > dmat->nsegments)
-				goto cleanup;
-			sl->vaddr = vaddr;
-			sl->datacount = sgsize;
-			sl->busaddr = curaddr;
+			sl = &map->slist[map->sync_count - 1];
+			if (map->sync_count == 0 ||
+			    vaddr != sl->vaddr + sl->datacount) {
+				if (++map->sync_count > dmat->nsegments)
+					goto cleanup;
+				sl++;
+				sl->vaddr = vaddr;
+				sl->datacount = sgsize;
+				sl->busaddr = curaddr;
+			} else
+				sl->datacount += sgsize;
 		}
 
 		if (dmat->ranges) {

Modified: projects/physbio/sys/arm/arm/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/arm/arm/busdma_machdep.c	Thu Dec 27 00:17:54 2012	(r244723)
+++ projects/physbio/sys/arm/arm/busdma_machdep.c	Thu Dec 27 01:43:35 2012	(r244724)
@@ -857,12 +857,17 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		    map->pagesneeded != 0 && run_filter(dmat, curaddr)) {
 			curaddr = add_bounce_page(dmat, map, vaddr, sgsize);
 		} else {
-			sl = &map->slist[map->sync_count];
-			if (++map->sync_count > dmat->nsegments)
-				goto cleanup;
-			sl->vaddr = vaddr;
-			sl->datacount = sgsize;
-			sl->busaddr = curaddr;
+			sl = &map->slist[map->sync_count - 1];
+			if (map->sync_count == 0 ||
+			    vaddr != sl->vaddr + sl->datacount) {
+				if (++map->sync_count > dmat->nsegments)
+					goto cleanup;
+				sl++;
+				sl->vaddr = vaddr;
+				sl->datacount = sgsize;
+				sl->busaddr = curaddr;
+			} else
+				sl->datacount += sgsize;
 		}
 
 		if (dmat->ranges) {
@@ -910,8 +915,10 @@ cleanup:
 	/*
 	 * Did we fit?
 	 */
-	if (buflen != 0)
+	if (buflen != 0) {
+		_bus_dmamap_unload(dmat, map);
 		error = EFBIG; /* XXX better return value here? */
+	}
 	return (error);
 }
 

Modified: projects/physbio/sys/mips/mips/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/mips/mips/busdma_machdep.c	Thu Dec 27 00:17:54 2012	(r244723)
+++ projects/physbio/sys/mips/mips/busdma_machdep.c	Thu Dec 27 01:43:35 2012	(r244724)
@@ -814,12 +814,17 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
 		    map->pagesneeded != 0 && run_filter(dmat, curaddr)) {
 			curaddr = add_bounce_page(dmat, map, vaddr, sgsize);
 		} else {
-			sl = &map->slist[map->sync_count];
-			if (++map->sync_count > dmat->nsegments)
-				goto cleanup;
-			sl->vaddr = vaddr;
-			sl->datacount = sgsize;
-			sl->busaddr = curaddr;
+			sl = &map->slist[map->sync_count - 1];
+			if (map->sync_count == 0 ||
+			    vaddr != sl->vaddr + sl->datacount) {
+				if (++map->sync_count > dmat->nsegments)
+					goto cleanup;
+				sl++;
+				sl->vaddr = vaddr;
+				sl->datacount = sgsize;
+				sl->busaddr = curaddr;
+			} else
+				sl->datacount += sgsize;
 		}
 
 		/*
@@ -852,8 +857,10 @@ cleanup:
 	/*
 	 * Did we fit?
 	 */
-	if (buflen != 0)
+	if (buflen != 0) {
+		_bus_dmamap_unload(dmat, map);
 		error = EFBIG; /* XXX better return value here? */
+	}
 	return (error);
 }
 
@@ -869,7 +876,7 @@ __bus_dmamap_mayblock(bus_dma_tag_t dmat
 }
 
 bus_dma_segment_t *
-_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map,
+_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
     bus_dma_segment_t *segs, int nsegs, int error)
 {
 



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