diff options
author | Victoria Milhoan <vicki.milhoan@freescale.com> | 2015-08-05 14:28:41 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2015-08-10 11:19:00 -0400 |
commit | ec0273039b6606ae08132f41854381e0d7371ded (patch) | |
tree | 428c427800e3e2f1b412f06cf8b3c84837811cf5 /drivers/crypto | |
parent | 7d5196aba3c81999d56b26daa5ea7590513cdc1f (diff) |
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>
Diffstat (limited to 'drivers/crypto')
-rw-r--r-- | drivers/crypto/caam/sg_sw_sec4.h | 24 |
1 files changed, 17 insertions, 7 deletions
diff --git a/drivers/crypto/caam/sg_sw_sec4.h b/drivers/crypto/caam/sg_sw_sec4.h index 711bb3949779..18cd6d1f5870 100644 --- a/drivers/crypto/caam/sg_sw_sec4.h +++ b/drivers/crypto/caam/sg_sw_sec4.h | |||
@@ -105,9 +105,15 @@ static inline void dma_unmap_sg_chained( | |||
105 | { | 105 | { |
106 | if (unlikely(chained)) { | 106 | if (unlikely(chained)) { |
107 | int i; | 107 | int i; |
108 | struct scatterlist *tsg = sg; | ||
109 | |||
110 | /* | ||
111 | * Use a local copy of the sg pointer to avoid moving the | ||
112 | * head of the list pointed to by sg as we walk the list. | ||
113 | */ | ||
108 | for (i = 0; i < nents; i++) { | 114 | for (i = 0; i < nents; i++) { |
109 | dma_unmap_sg(dev, sg, 1, dir); | 115 | dma_unmap_sg(dev, tsg, 1, dir); |
110 | sg = sg_next(sg); | 116 | tsg = sg_next(tsg); |
111 | } | 117 | } |
112 | } else if (nents) { | 118 | } else if (nents) { |
113 | dma_unmap_sg(dev, sg, nents, dir); | 119 | dma_unmap_sg(dev, sg, nents, dir); |
@@ -118,19 +124,23 @@ static inline int dma_map_sg_chained( | |||
118 | struct device *dev, struct scatterlist *sg, unsigned int nents, | 124 | struct device *dev, struct scatterlist *sg, unsigned int nents, |
119 | enum dma_data_direction dir, bool chained) | 125 | enum dma_data_direction dir, bool chained) |
120 | { | 126 | { |
121 | struct scatterlist *first = sg; | ||
122 | |||
123 | if (unlikely(chained)) { | 127 | if (unlikely(chained)) { |
124 | int i; | 128 | int i; |
129 | struct scatterlist *tsg = sg; | ||
130 | |||
131 | /* | ||
132 | * Use a local copy of the sg pointer to avoid moving the | ||
133 | * head of the list pointed to by sg as we walk the list. | ||
134 | */ | ||
125 | for (i = 0; i < nents; i++) { | 135 | for (i = 0; i < nents; i++) { |
126 | if (!dma_map_sg(dev, sg, 1, dir)) { | 136 | if (!dma_map_sg(dev, tsg, 1, dir)) { |
127 | dma_unmap_sg_chained(dev, first, i, dir, | 137 | dma_unmap_sg_chained(dev, sg, i, dir, |
128 | chained); | 138 | chained); |
129 | nents = 0; | 139 | nents = 0; |
130 | break; | 140 | break; |
131 | } | 141 | } |
132 | 142 | ||
133 | sg = sg_next(sg); | 143 | tsg = sg_next(tsg); |
134 | } | 144 | } |
135 | } else | 145 | } else |
136 | nents = dma_map_sg(dev, sg, nents, dir); | 146 | nents = dma_map_sg(dev, sg, nents, dir); |