svn commit: r244724 - in projects/physbio/sys: arm/arm mips/mips
Jeff Roberson
jeff at FreeBSD.org
Thu Dec 27 01:43:36 UTC 2012
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)
{
More information about the svn-src-projects
mailing list