aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto
diff options
context:
space:
mode:
authorAkinobu Mita <akinobu.mita@gmail.com>2013-07-08 19:01:55 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2013-07-09 13:33:30 -0400
commitd05257238f9bbe96477162448c2dda08309af208 (patch)
treef5c6ed6be169c9ce66c49179fb94135dfd66a7f3 /drivers/crypto
parentdf642cea25c90dc7d5dcd9d3b480b6b59de7d787 (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>
Diffstat (limited to 'drivers/crypto')
-rw-r--r--drivers/crypto/talitos.c60
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 **/
1127static 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);