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:
Родитель
f54b1bdff1
Коммит
9bb2bcdb4b
|
@ -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);
|
||||||
|
|
Загрузка…
Ссылка в новой задаче