diff options
| author | Akinobu Mita <akinobu.mita@gmail.com> | 2013-07-08 19:01:55 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2013-07-09 13:33:30 -0400 |
| commit | d05257238f9bbe96477162448c2dda08309af208 (patch) | |
| tree | f5c6ed6be169c9ce66c49179fb94135dfd66a7f3 | |
| parent | df642cea25c90dc7d5dcd9d3b480b6b59de7d787 (diff) | |
crypto: talitos: use sg_pcopy_to_buffer()
Use sg_pcopy_to_buffer() which is better than the function previously used.
Because it doesn't do kmap/kunmap for skipped pages.
Signed-off-by: Akinobu Mita <akinobu.mita@gmail.com>
Cc: "David S. Miller" <davem@davemloft.net>
Cc: "James E.J. Bottomley" <JBottomley@parallels.com>
Cc: Douglas Gilbert <dgilbert@interlog.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Horia Geanta <horia.geanta@freescale.com>
Cc: Imre Deak <imre.deak@intel.com>
Cc: Tejun Heo <tj@kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
| -rw-r--r-- | drivers/crypto/talitos.c | 60 |
1 files changed, 1 insertions, 59 deletions
diff --git a/drivers/crypto/talitos.c b/drivers/crypto/talitos.c index 5b2b5e61e4f9..661dc3eb1d66 100644 --- a/drivers/crypto/talitos.c +++ b/drivers/crypto/talitos.c | |||
| @@ -1112,64 +1112,6 @@ static int sg_count(struct scatterlist *sg_list, int nbytes, bool *chained) | |||
| 1112 | return sg_nents; | 1112 | return sg_nents; |
| 1113 | } | 1113 | } |
| 1114 | 1114 | ||
| 1115 | /** | ||
| 1116 | * sg_copy_end_to_buffer - Copy end data from SG list to a linear buffer | ||
| 1117 | * @sgl: The SG list | ||
| 1118 | * @nents: Number of SG entries | ||
| 1119 | * @buf: Where to copy to | ||
| 1120 | * @buflen: The number of bytes to copy | ||
| 1121 | * @skip: The number of bytes to skip before copying. | ||
| 1122 | * Note: skip + buflen should equal SG total size. | ||
| 1123 | * | ||
| 1124 | * Returns the number of copied bytes. | ||
| 1125 | * | ||
| 1126 | **/ | ||
| 1127 | static size_t sg_copy_end_to_buffer(struct scatterlist *sgl, unsigned int nents, | ||
| 1128 | void *buf, size_t buflen, unsigned int skip) | ||
| 1129 | { | ||
| 1130 | unsigned int offset = 0; | ||
| 1131 | unsigned int boffset = 0; | ||
| 1132 | struct sg_mapping_iter miter; | ||
| 1133 | unsigned long flags; | ||
| 1134 | unsigned int sg_flags = SG_MITER_ATOMIC; | ||
| 1135 | size_t total_buffer = buflen + skip; | ||
| 1136 | |||
| 1137 | sg_flags |= SG_MITER_FROM_SG; | ||
| 1138 | |||
| 1139 | sg_miter_start(&miter, sgl, nents, sg_flags); | ||
| 1140 | |||
| 1141 | local_irq_save(flags); | ||
| 1142 | |||
| 1143 | while (sg_miter_next(&miter) && offset < total_buffer) { | ||
| 1144 | unsigned int len; | ||
| 1145 | unsigned int ignore; | ||
| 1146 | |||
| 1147 | if ((offset + miter.length) > skip) { | ||
| 1148 | if (offset < skip) { | ||
| 1149 | /* Copy part of this segment */ | ||
| 1150 | ignore = skip - offset; | ||
| 1151 | len = miter.length - ignore; | ||
| 1152 | if (boffset + len > buflen) | ||
| 1153 | len = buflen - boffset; | ||
| 1154 | memcpy(buf + boffset, miter.addr + ignore, len); | ||
| 1155 | } else { | ||
| 1156 | /* Copy all of this segment (up to buflen) */ | ||
| 1157 | len = miter.length; | ||
| 1158 | if (boffset + len > buflen) | ||
| 1159 | len = buflen - boffset; | ||
| 1160 | memcpy(buf + boffset, miter.addr, len); | ||
| 1161 | } | ||
| 1162 | boffset += len; | ||
| 1163 | } | ||
| 1164 | offset += miter.length; | ||
| 1165 | } | ||
| 1166 | |||
| 1167 | sg_miter_stop(&miter); | ||
| 1168 | |||
| 1169 | local_irq_restore(flags); | ||
| 1170 | return boffset; | ||
| 1171 | } | ||
| 1172 | |||
| 1173 | /* | 1115 | /* |
| 1174 | * allocate and map the extended descriptor | 1116 | * allocate and map the extended descriptor |
| 1175 | */ | 1117 | */ |
| @@ -1800,7 +1742,7 @@ static int ahash_process_req(struct ahash_request *areq, unsigned int nbytes) | |||
| 1800 | 1742 | ||
| 1801 | if (to_hash_later) { | 1743 | if (to_hash_later) { |
| 1802 | int nents = sg_count(areq->src, nbytes, &chained); | 1744 | int nents = sg_count(areq->src, nbytes, &chained); |
| 1803 | sg_copy_end_to_buffer(areq->src, nents, | 1745 | sg_pcopy_to_buffer(areq->src, nents, |
| 1804 | req_ctx->bufnext, | 1746 | req_ctx->bufnext, |
| 1805 | to_hash_later, | 1747 | to_hash_later, |
| 1806 | nbytes - to_hash_later); | 1748 | nbytes - to_hash_later); |
