aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarsh Jain <harsh@chelsio.com>2016-11-29 08:30:38 -0500
committerHerbert Xu <herbert@gondor.apana.org.au>2016-11-30 07:01:47 -0500
commit44fce12a3464c35b5c6a36b6db379745ff502b82 (patch)
tree1ab37b1b09380f77fc0e02224bb42398e74a520a
parent18f0aa06a3c90b249e8b3a423e67dbfb0c784688 (diff)
crypto: chcr - Remove dynamic allocation
Remove malloc/free in hash operation and allocate memory in chcr_ahash_req_ctx structure. Signed-off-by: Jitendra Lulla <JLULLA@chelsio.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/chelsio/chcr_algo.c69
-rw-r--r--drivers/crypto/chelsio/chcr_crypto.h8
2 files changed, 45 insertions, 32 deletions
diff --git a/drivers/crypto/chelsio/chcr_algo.c b/drivers/crypto/chelsio/chcr_algo.c
index 0ae1b09c58ef..13aaca2b6e95 100644
--- a/drivers/crypto/chelsio/chcr_algo.c
+++ b/drivers/crypto/chelsio/chcr_algo.c
@@ -150,8 +150,6 @@ int chcr_handle_resp(struct crypto_async_request *req, unsigned char *input,
150 sizeof(struct cpl_fw6_pld), 150 sizeof(struct cpl_fw6_pld),
151 updated_digestsize); 151 updated_digestsize);
152 } 152 }
153 kfree(ctx_req.ctx.ahash_ctx->dummy_payload_ptr);
154 ctx_req.ctx.ahash_ctx->dummy_payload_ptr = NULL;
155 break; 153 break;
156 } 154 }
157 return 0; 155 return 0;
@@ -860,8 +858,8 @@ static struct sk_buff *create_hash_wr(struct ahash_request *req,
860 858
861 skb_set_transport_header(skb, transhdr_len); 859 skb_set_transport_header(skb, transhdr_len);
862 if (param->bfr_len != 0) 860 if (param->bfr_len != 0)
863 write_buffer_to_skb(skb, &frags, req_ctx->bfr, 861 write_buffer_to_skb(skb, &frags, req_ctx->reqbfr,
864 param->bfr_len); 862 param->bfr_len);
865 if (param->sg_len != 0) 863 if (param->sg_len != 0)
866 write_sg_to_skb(skb, &frags, req->src, param->sg_len); 864 write_sg_to_skb(skb, &frags, req->src, param->sg_len);
867 865
@@ -892,30 +890,41 @@ static int chcr_ahash_update(struct ahash_request *req)
892 return -EBUSY; 890 return -EBUSY;
893 } 891 }
894 892
895 if (nbytes + req_ctx->bfr_len >= bs) { 893 if (nbytes + req_ctx->reqlen >= bs) {
896 remainder = (nbytes + req_ctx->bfr_len) % bs; 894 remainder = (nbytes + req_ctx->reqlen) % bs;
897 nbytes = nbytes + req_ctx->bfr_len - remainder; 895 nbytes = nbytes + req_ctx->reqlen - remainder;
898 } else { 896 } else {
899 sg_pcopy_to_buffer(req->src, sg_nents(req->src), req_ctx->bfr + 897 sg_pcopy_to_buffer(req->src, sg_nents(req->src), req_ctx->reqbfr
900 req_ctx->bfr_len, nbytes, 0); 898 + req_ctx->reqlen, nbytes, 0);
901 req_ctx->bfr_len += nbytes; 899 req_ctx->reqlen += nbytes;
902 return 0; 900 return 0;
903 } 901 }
904 902
905 params.opad_needed = 0; 903 params.opad_needed = 0;
906 params.more = 1; 904 params.more = 1;
907 params.last = 0; 905 params.last = 0;
906 params.sg_len = nbytes - req_ctx->reqlen;
907 params.bfr_len = req_ctx->reqlen;
908 params.scmd1 = 0; 908 params.scmd1 = 0;
909 get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm)); 909 get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm));
910 req_ctx->result = 0; 910 req_ctx->result = 0;
911 req_ctx->data_len += params.sg_len + params.bfr_len; 911 req_ctx->data_len += params.sg_len + params.bfr_len;
912 skb = create_hash_wr(req, &params); 912 skb = create_hash_wr(req, &params);
913 913
914 req_ctx->bfr_len = remainder; 914 if (IS_ERR(skb))
915 if (remainder) 915 return PTR_ERR(skb);
916
917 if (remainder) {
918 u8 *temp;
919 /* Swap buffers */
920 temp = req_ctx->reqbfr;
921 req_ctx->reqbfr = req_ctx->skbfr;
922 req_ctx->skbfr = temp;
916 sg_pcopy_to_buffer(req->src, sg_nents(req->src), 923 sg_pcopy_to_buffer(req->src, sg_nents(req->src),
917 req_ctx->bfr, remainder, req->nbytes - 924 req_ctx->reqbfr, remainder, req->nbytes -
918 remainder); 925 remainder);
926 }
927 req_ctx->reqlen = remainder;
919 skb->dev = u_ctx->lldi.ports[0]; 928 skb->dev = u_ctx->lldi.ports[0];
920 set_wr_txq(skb, CPL_PRIORITY_DATA, ctx->tx_channel_id); 929 set_wr_txq(skb, CPL_PRIORITY_DATA, ctx->tx_channel_id);
921 chcr_send_wr(skb); 930 chcr_send_wr(skb);
@@ -951,10 +960,10 @@ static int chcr_ahash_final(struct ahash_request *req)
951 params.sg_len = 0; 960 params.sg_len = 0;
952 get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm)); 961 get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm));
953 req_ctx->result = 1; 962 req_ctx->result = 1;
954 params.bfr_len = req_ctx->bfr_len; 963 params.bfr_len = req_ctx->reqlen;
955 req_ctx->data_len += params.bfr_len + params.sg_len; 964 req_ctx->data_len += params.bfr_len + params.sg_len;
956 if (req_ctx->bfr && (req_ctx->bfr_len == 0)) { 965 if (req_ctx->reqlen == 0) {
957 create_last_hash_block(req_ctx->bfr, bs, req_ctx->data_len); 966 create_last_hash_block(req_ctx->reqbfr, bs, req_ctx->data_len);
958 params.last = 0; 967 params.last = 0;
959 params.more = 1; 968 params.more = 1;
960 params.scmd1 = 0; 969 params.scmd1 = 0;
@@ -1000,12 +1009,12 @@ static int chcr_ahash_finup(struct ahash_request *req)
1000 params.opad_needed = 0; 1009 params.opad_needed = 0;
1001 1010
1002 params.sg_len = req->nbytes; 1011 params.sg_len = req->nbytes;
1003 params.bfr_len = req_ctx->bfr_len; 1012 params.bfr_len = req_ctx->reqlen;
1004 get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm)); 1013 get_alg_config(&params.alg_prm, crypto_ahash_digestsize(rtfm));
1005 req_ctx->data_len += params.bfr_len + params.sg_len; 1014 req_ctx->data_len += params.bfr_len + params.sg_len;
1006 req_ctx->result = 1; 1015 req_ctx->result = 1;
1007 if (req_ctx->bfr && (req_ctx->bfr_len + req->nbytes) == 0) { 1016 if ((req_ctx->reqlen + req->nbytes) == 0) {
1008 create_last_hash_block(req_ctx->bfr, bs, req_ctx->data_len); 1017 create_last_hash_block(req_ctx->reqbfr, bs, req_ctx->data_len);
1009 params.last = 0; 1018 params.last = 0;
1010 params.more = 1; 1019 params.more = 1;
1011 params.scmd1 = 0; 1020 params.scmd1 = 0;
@@ -1061,8 +1070,8 @@ static int chcr_ahash_digest(struct ahash_request *req)
1061 req_ctx->result = 1; 1070 req_ctx->result = 1;
1062 req_ctx->data_len += params.bfr_len + params.sg_len; 1071 req_ctx->data_len += params.bfr_len + params.sg_len;
1063 1072
1064 if (req_ctx->bfr && req->nbytes == 0) { 1073 if (req->nbytes == 0) {
1065 create_last_hash_block(req_ctx->bfr, bs, 0); 1074 create_last_hash_block(req_ctx->reqbfr, bs, 0);
1066 params.more = 1; 1075 params.more = 1;
1067 params.bfr_len = bs; 1076 params.bfr_len = bs;
1068 } 1077 }
@@ -1082,12 +1091,12 @@ static int chcr_ahash_export(struct ahash_request *areq, void *out)
1082 struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(areq); 1091 struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1083 struct chcr_ahash_req_ctx *state = out; 1092 struct chcr_ahash_req_ctx *state = out;
1084 1093
1085 state->bfr_len = req_ctx->bfr_len; 1094 state->reqlen = req_ctx->reqlen;
1086 state->data_len = req_ctx->data_len; 1095 state->data_len = req_ctx->data_len;
1087 memcpy(state->bfr, req_ctx->bfr, CHCR_HASH_MAX_BLOCK_SIZE_128); 1096 memcpy(state->bfr1, req_ctx->reqbfr, req_ctx->reqlen);
1088 memcpy(state->partial_hash, req_ctx->partial_hash, 1097 memcpy(state->partial_hash, req_ctx->partial_hash,
1089 CHCR_HASH_MAX_DIGEST_SIZE); 1098 CHCR_HASH_MAX_DIGEST_SIZE);
1090 return 0; 1099 return 0;
1091} 1100}
1092 1101
1093static int chcr_ahash_import(struct ahash_request *areq, const void *in) 1102static int chcr_ahash_import(struct ahash_request *areq, const void *in)
@@ -1095,10 +1104,11 @@ static int chcr_ahash_import(struct ahash_request *areq, const void *in)
1095 struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(areq); 1104 struct chcr_ahash_req_ctx *req_ctx = ahash_request_ctx(areq);
1096 struct chcr_ahash_req_ctx *state = (struct chcr_ahash_req_ctx *)in; 1105 struct chcr_ahash_req_ctx *state = (struct chcr_ahash_req_ctx *)in;
1097 1106
1098 req_ctx->bfr_len = state->bfr_len; 1107 req_ctx->reqlen = state->reqlen;
1099 req_ctx->data_len = state->data_len; 1108 req_ctx->data_len = state->data_len;
1100 req_ctx->dummy_payload_ptr = NULL; 1109 req_ctx->reqbfr = req_ctx->bfr1;
1101 memcpy(req_ctx->bfr, state->bfr, CHCR_HASH_MAX_BLOCK_SIZE_128); 1110 req_ctx->skbfr = req_ctx->bfr2;
1111 memcpy(req_ctx->bfr1, state->bfr1, CHCR_HASH_MAX_BLOCK_SIZE_128);
1102 memcpy(req_ctx->partial_hash, state->partial_hash, 1112 memcpy(req_ctx->partial_hash, state->partial_hash,
1103 CHCR_HASH_MAX_DIGEST_SIZE); 1113 CHCR_HASH_MAX_DIGEST_SIZE);
1104 return 0; 1114 return 0;
@@ -1193,8 +1203,9 @@ static int chcr_sha_init(struct ahash_request *areq)
1193 int digestsize = crypto_ahash_digestsize(tfm); 1203 int digestsize = crypto_ahash_digestsize(tfm);
1194 1204
1195 req_ctx->data_len = 0; 1205 req_ctx->data_len = 0;
1196 req_ctx->dummy_payload_ptr = NULL; 1206 req_ctx->reqlen = 0;
1197 req_ctx->bfr_len = 0; 1207 req_ctx->reqbfr = req_ctx->bfr1;
1208 req_ctx->skbfr = req_ctx->bfr2;
1198 req_ctx->skb = NULL; 1209 req_ctx->skb = NULL;
1199 req_ctx->result = 0; 1210 req_ctx->result = 0;
1200 copy_hash_init_values(req_ctx->partial_hash, digestsize); 1211 copy_hash_init_values(req_ctx->partial_hash, digestsize);
diff --git a/drivers/crypto/chelsio/chcr_crypto.h b/drivers/crypto/chelsio/chcr_crypto.h
index acce36702e1f..8934ea2fe56b 100644
--- a/drivers/crypto/chelsio/chcr_crypto.h
+++ b/drivers/crypto/chelsio/chcr_crypto.h
@@ -150,12 +150,14 @@ struct chcr_context {
150 150
151struct chcr_ahash_req_ctx { 151struct chcr_ahash_req_ctx {
152 u32 result; 152 u32 result;
153 char bfr[CHCR_HASH_MAX_BLOCK_SIZE_128]; 153 u8 bfr1[CHCR_HASH_MAX_BLOCK_SIZE_128];
154 u8 bfr_len; 154 u8 bfr2[CHCR_HASH_MAX_BLOCK_SIZE_128];
155 u8 *reqbfr;
156 u8 *skbfr;
157 u8 reqlen;
155 /* DMA the partial hash in it */ 158 /* DMA the partial hash in it */
156 u8 partial_hash[CHCR_HASH_MAX_DIGEST_SIZE]; 159 u8 partial_hash[CHCR_HASH_MAX_DIGEST_SIZE];
157 u64 data_len; /* Data len till time */ 160 u64 data_len; /* Data len till time */
158 void *dummy_payload_ptr;
159 /* SKB which is being sent to the hardware for processing */ 161 /* SKB which is being sent to the hardware for processing */
160 struct sk_buff *skb; 162 struct sk_buff *skb;
161}; 163};