diff options
author | Harsh Jain <harsh@chelsio.com> | 2016-11-29 08:30:38 -0500 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2016-11-30 07:01:47 -0500 |
commit | 44fce12a3464c35b5c6a36b6db379745ff502b82 (patch) | |
tree | 1ab37b1b09380f77fc0e02224bb42398e74a520a | |
parent | 18f0aa06a3c90b249e8b3a423e67dbfb0c784688 (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.c | 69 | ||||
-rw-r--r-- | drivers/crypto/chelsio/chcr_crypto.h | 8 |
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(¶ms.alg_prm, crypto_ahash_digestsize(rtfm)); | 909 | get_alg_config(¶ms.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, ¶ms); | 912 | skb = create_hash_wr(req, ¶ms); |
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(¶ms.alg_prm, crypto_ahash_digestsize(rtfm)); | 961 | get_alg_config(¶ms.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(¶ms.alg_prm, crypto_ahash_digestsize(rtfm)); | 1013 | get_alg_config(¶ms.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 | ||
1093 | static int chcr_ahash_import(struct ahash_request *areq, const void *in) | 1102 | static 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 | ||
151 | struct chcr_ahash_req_ctx { | 151 | struct 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 | }; |