ieee1394: speed up of dma_region_sync_for_cpu

when attempting to find the 'last' part of the dma region continue the
search from where we left off, instead of starting the search over.

Signed-off-by: Jim Westfall <jwestfall@surrealistic.net>
Signed-off-by: Ben Collins <bcollins@ubuntu.com>
This commit is contained in:
Ben Collins 2006-06-12 17:52:59 -04:00
parent f54b1bdff1
commit 9bb2bcdb4b

View file

@ -145,12 +145,12 @@ void dma_region_free(struct dma_region *dma)
/* find the scatterlist index and remaining offset corresponding to a /* find the scatterlist index and remaining offset corresponding to a
given offset from the beginning of the buffer */ given offset from the beginning of the buffer */
static inline int dma_region_find(struct dma_region *dma, unsigned long offset, static inline int dma_region_find(struct dma_region *dma, unsigned long offset,
unsigned long *rem) unsigned int start, unsigned long *rem)
{ {
int i; int i;
unsigned long off = offset; unsigned long off = offset;
for (i = 0; i < dma->n_dma_pages; i++) { for (i = start; i < dma->n_dma_pages; i++) {
if (off < sg_dma_len(&dma->sglist[i])) { if (off < sg_dma_len(&dma->sglist[i])) {
*rem = off; *rem = off;
break; break;
@ -170,7 +170,7 @@ dma_addr_t dma_region_offset_to_bus(struct dma_region * dma,
unsigned long rem = 0; unsigned long rem = 0;
struct scatterlist *sg = struct scatterlist *sg =
&dma->sglist[dma_region_find(dma, offset, &rem)]; &dma->sglist[dma_region_find(dma, offset, 0, &rem)];
return sg_dma_address(sg) + rem; return sg_dma_address(sg) + rem;
} }
@ -178,13 +178,13 @@ void dma_region_sync_for_cpu(struct dma_region *dma, unsigned long offset,
unsigned long len) unsigned long len)
{ {
int first, last; int first, last;
unsigned long rem; unsigned long rem = 0;
if (!len) if (!len)
len = 1; len = 1;
first = dma_region_find(dma, offset, &rem); first = dma_region_find(dma, offset, 0, &rem);
last = dma_region_find(dma, offset + len - 1, &rem); last = dma_region_find(dma, rem + len - 1, first, &rem);
pci_dma_sync_sg_for_cpu(dma->dev, &dma->sglist[first], last - first + 1, pci_dma_sync_sg_for_cpu(dma->dev, &dma->sglist[first], last - first + 1,
dma->direction); dma->direction);
@ -194,13 +194,13 @@ void dma_region_sync_for_device(struct dma_region *dma, unsigned long offset,
unsigned long len) unsigned long len)
{ {
int first, last; int first, last;
unsigned long rem; unsigned long rem = 0;
if (!len) if (!len)
len = 1; len = 1;
first = dma_region_find(dma, offset, &rem); first = dma_region_find(dma, offset, 0, &rem);
last = dma_region_find(dma, offset + len - 1, &rem); last = dma_region_find(dma, rem + len - 1, first, &rem);
pci_dma_sync_sg_for_device(dma->dev, &dma->sglist[first], pci_dma_sync_sg_for_device(dma->dev, &dma->sglist[first],
last - first + 1, dma->direction); last - first + 1, dma->direction);