aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto
diff options
context:
space:
mode:
authorVictoria Milhoan <vicki.milhoan@freescale.com>2015-08-05 14:28:41 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2015-08-10 11:19:00 -0400
commitec0273039b6606ae08132f41854381e0d7371ded (patch)
tree428c427800e3e2f1b412f06cf8b3c84837811cf5 /drivers/crypto
parent7d5196aba3c81999d56b26daa5ea7590513cdc1f (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.h24
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);