forked from Minki/linux
crypto: caam - Use local sg pointers to walk the scatterlist
Avoid moving the head of the scatterlist entry by using temporary pointers to walk the scatterlist. Signed-off-by: Victoria Milhoan <vicki.milhoan@freescale.com> Tested-by: Horia Geantă <horia.geanta@freescale.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
7d5196aba3
commit
ec0273039b
@ -105,9 +105,15 @@ static inline void dma_unmap_sg_chained(
|
||||
{
|
||||
if (unlikely(chained)) {
|
||||
int i;
|
||||
struct scatterlist *tsg = sg;
|
||||
|
||||
/*
|
||||
* Use a local copy of the sg pointer to avoid moving the
|
||||
* head of the list pointed to by sg as we walk the list.
|
||||
*/
|
||||
for (i = 0; i < nents; i++) {
|
||||
dma_unmap_sg(dev, sg, 1, dir);
|
||||
sg = sg_next(sg);
|
||||
dma_unmap_sg(dev, tsg, 1, dir);
|
||||
tsg = sg_next(tsg);
|
||||
}
|
||||
} else if (nents) {
|
||||
dma_unmap_sg(dev, sg, nents, dir);
|
||||
@ -118,19 +124,23 @@ static inline int dma_map_sg_chained(
|
||||
struct device *dev, struct scatterlist *sg, unsigned int nents,
|
||||
enum dma_data_direction dir, bool chained)
|
||||
{
|
||||
struct scatterlist *first = sg;
|
||||
|
||||
if (unlikely(chained)) {
|
||||
int i;
|
||||
struct scatterlist *tsg = sg;
|
||||
|
||||
/*
|
||||
* Use a local copy of the sg pointer to avoid moving the
|
||||
* head of the list pointed to by sg as we walk the list.
|
||||
*/
|
||||
for (i = 0; i < nents; i++) {
|
||||
if (!dma_map_sg(dev, sg, 1, dir)) {
|
||||
dma_unmap_sg_chained(dev, first, i, dir,
|
||||
if (!dma_map_sg(dev, tsg, 1, dir)) {
|
||||
dma_unmap_sg_chained(dev, sg, i, dir,
|
||||
chained);
|
||||
nents = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
sg = sg_next(sg);
|
||||
tsg = sg_next(tsg);
|
||||
}
|
||||
} else
|
||||
nents = dma_map_sg(dev, sg, nents, dir);
|
||||
|
Loading…
Reference in New Issue
Block a user