Message ID | 20220126210441.3661782-2-clabbe@baylibre.com (mailing list archive) |
---|---|
State | Changes Requested |
Delegated to: | Herbert Xu |
Headers | show |
Series | crypto: allwinner: various improvments | expand |
Hi Corentin,
I love your patch! Perhaps something to improve:
[auto build test WARNING on sunxi/sunxi/for-next]
[also build test WARNING on herbert-cryptodev-2.6/master herbert-crypto-2.6/master v5.17-rc1 next-20220125]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Corentin-Labbe/crypto-allwinner-various-improvments/20220127-050556
base: https://git.kernel.org/pub/scm/linux/kernel/git/sunxi/linux.git sunxi/for-next
config: arm64-allmodconfig (https://download.01.org/0day-ci/archive/20220127/202201271243.hLjdr8IB-lkp@intel.com/config)
compiler: clang version 14.0.0 (https://github.com/llvm/llvm-project 2a1b7aa016c0f4b5598806205bdfbab1ea2d92c4)
reproduce (this is a W=1 build):
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# install arm64 cross compiling tool for clang build
# apt-get install binutils-aarch64-linux-gnu
# https://github.com/0day-ci/linux/commit/d0b880af8c99abcd0f36463b82c92d71024408de
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Corentin-Labbe/crypto-allwinner-various-improvments/20220127-050556
git checkout d0b880af8c99abcd0f36463b82c92d71024408de
# save the config file to linux build tree
mkdir build_dir
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross W=1 O=build_dir ARCH=arm64 SHELL=/bin/bash drivers/crypto/allwinner/sun8i-ce/
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
All warnings (new ones prefixed by >>):
>> drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c:258:1: warning: unused label 'theend_key' [-Wunused-label]
theend_key:
^~~~~~~~~~~
1 warning generated.
vim +/theend_key +258 drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c
06f751b613296cc Corentin Labbe 2019-10-23 108
06f751b613296cc Corentin Labbe 2019-10-23 109 flow = rctx->flow;
06f751b613296cc Corentin Labbe 2019-10-23 110
06f751b613296cc Corentin Labbe 2019-10-23 111 chan = &ce->chanlist[flow];
06f751b613296cc Corentin Labbe 2019-10-23 112
06f751b613296cc Corentin Labbe 2019-10-23 113 cet = chan->tl;
06f751b613296cc Corentin Labbe 2019-10-23 114 memset(cet, 0, sizeof(struct ce_task));
06f751b613296cc Corentin Labbe 2019-10-23 115
93c7f4d357de68f Corentin Labbe 2019-11-17 116 cet->t_id = cpu_to_le32(flow);
93c7f4d357de68f Corentin Labbe 2019-11-17 117 common = ce->variant->alg_cipher[algt->ce_algo_id];
93c7f4d357de68f Corentin Labbe 2019-11-17 118 common |= rctx->op_dir | CE_COMM_INT;
93c7f4d357de68f Corentin Labbe 2019-11-17 119 cet->t_common_ctl = cpu_to_le32(common);
06f751b613296cc Corentin Labbe 2019-10-23 120 /* CTS and recent CE (H6) need length in bytes, in word otherwise */
6b4f76c2cd9e6c3 Corentin Labbe 2020-09-18 121 if (ce->variant->cipher_t_dlen_in_bytes)
93c7f4d357de68f Corentin Labbe 2019-11-17 122 cet->t_dlen = cpu_to_le32(areq->cryptlen);
93c7f4d357de68f Corentin Labbe 2019-11-17 123 else
93c7f4d357de68f Corentin Labbe 2019-11-17 124 cet->t_dlen = cpu_to_le32(areq->cryptlen / 4);
06f751b613296cc Corentin Labbe 2019-10-23 125
93c7f4d357de68f Corentin Labbe 2019-11-17 126 sym = ce->variant->op_mode[algt->ce_blockmode];
06f751b613296cc Corentin Labbe 2019-10-23 127 len = op->keylen;
06f751b613296cc Corentin Labbe 2019-10-23 128 switch (len) {
06f751b613296cc Corentin Labbe 2019-10-23 129 case 128 / 8:
93c7f4d357de68f Corentin Labbe 2019-11-17 130 sym |= CE_AES_128BITS;
06f751b613296cc Corentin Labbe 2019-10-23 131 break;
06f751b613296cc Corentin Labbe 2019-10-23 132 case 192 / 8:
93c7f4d357de68f Corentin Labbe 2019-11-17 133 sym |= CE_AES_192BITS;
06f751b613296cc Corentin Labbe 2019-10-23 134 break;
06f751b613296cc Corentin Labbe 2019-10-23 135 case 256 / 8:
93c7f4d357de68f Corentin Labbe 2019-11-17 136 sym |= CE_AES_256BITS;
06f751b613296cc Corentin Labbe 2019-10-23 137 break;
06f751b613296cc Corentin Labbe 2019-10-23 138 }
06f751b613296cc Corentin Labbe 2019-10-23 139
93c7f4d357de68f Corentin Labbe 2019-11-17 140 cet->t_sym_ctl = cpu_to_le32(sym);
06f751b613296cc Corentin Labbe 2019-10-23 141 cet->t_asym_ctl = 0;
06f751b613296cc Corentin Labbe 2019-10-23 142
0605fa0f78266cc Corentin Labbe 2020-09-18 143 rctx->addr_key = dma_map_single(ce->dev, op->key, op->keylen, DMA_TO_DEVICE);
0605fa0f78266cc Corentin Labbe 2020-09-18 144 if (dma_mapping_error(ce->dev, rctx->addr_key)) {
06f751b613296cc Corentin Labbe 2019-10-23 145 dev_err(ce->dev, "Cannot DMA MAP KEY\n");
06f751b613296cc Corentin Labbe 2019-10-23 146 err = -EFAULT;
06f751b613296cc Corentin Labbe 2019-10-23 147 goto theend;
06f751b613296cc Corentin Labbe 2019-10-23 148 }
0605fa0f78266cc Corentin Labbe 2020-09-18 149 cet->t_key = cpu_to_le32(rctx->addr_key);
06f751b613296cc Corentin Labbe 2019-10-23 150
06f751b613296cc Corentin Labbe 2019-10-23 151 ivsize = crypto_skcipher_ivsize(tfm);
06f751b613296cc Corentin Labbe 2019-10-23 152 if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) {
a216f8d540cf132 Corentin Labbe 2020-09-18 153 rctx->ivlen = ivsize;
06f751b613296cc Corentin Labbe 2019-10-23 154 if (rctx->op_dir & CE_DECRYPTION) {
06f751b613296cc Corentin Labbe 2019-10-23 155 offset = areq->cryptlen - ivsize;
d0b880af8c99abc Corentin Labbe 2022-01-26 156 scatterwalk_map_and_copy(chan->backup_iv, areq->src,
a216f8d540cf132 Corentin Labbe 2020-09-18 157 offset, ivsize, 0);
06f751b613296cc Corentin Labbe 2019-10-23 158 }
d0b880af8c99abc Corentin Labbe 2022-01-26 159 memcpy(chan->bounce_iv, areq->iv, ivsize);
d0b880af8c99abc Corentin Labbe 2022-01-26 160 rctx->addr_iv = dma_map_single(ce->dev, chan->bounce_iv, rctx->ivlen,
93c7f4d357de68f Corentin Labbe 2019-11-17 161 DMA_TO_DEVICE);
0605fa0f78266cc Corentin Labbe 2020-09-18 162 if (dma_mapping_error(ce->dev, rctx->addr_iv)) {
06f751b613296cc Corentin Labbe 2019-10-23 163 dev_err(ce->dev, "Cannot DMA MAP IV\n");
06f751b613296cc Corentin Labbe 2019-10-23 164 err = -ENOMEM;
06f751b613296cc Corentin Labbe 2019-10-23 165 goto theend_iv;
06f751b613296cc Corentin Labbe 2019-10-23 166 }
0605fa0f78266cc Corentin Labbe 2020-09-18 167 cet->t_iv = cpu_to_le32(rctx->addr_iv);
06f751b613296cc Corentin Labbe 2019-10-23 168 }
06f751b613296cc Corentin Labbe 2019-10-23 169
06f751b613296cc Corentin Labbe 2019-10-23 170 if (areq->src == areq->dst) {
06f751b613296cc Corentin Labbe 2019-10-23 171 nr_sgs = dma_map_sg(ce->dev, areq->src, sg_nents(areq->src),
06f751b613296cc Corentin Labbe 2019-10-23 172 DMA_BIDIRECTIONAL);
06f751b613296cc Corentin Labbe 2019-10-23 173 if (nr_sgs <= 0 || nr_sgs > MAX_SG) {
06f751b613296cc Corentin Labbe 2019-10-23 174 dev_err(ce->dev, "Invalid sg number %d\n", nr_sgs);
06f751b613296cc Corentin Labbe 2019-10-23 175 err = -EINVAL;
06f751b613296cc Corentin Labbe 2019-10-23 176 goto theend_iv;
06f751b613296cc Corentin Labbe 2019-10-23 177 }
06f751b613296cc Corentin Labbe 2019-10-23 178 nr_sgd = nr_sgs;
06f751b613296cc Corentin Labbe 2019-10-23 179 } else {
06f751b613296cc Corentin Labbe 2019-10-23 180 nr_sgs = dma_map_sg(ce->dev, areq->src, sg_nents(areq->src),
06f751b613296cc Corentin Labbe 2019-10-23 181 DMA_TO_DEVICE);
06f751b613296cc Corentin Labbe 2019-10-23 182 if (nr_sgs <= 0 || nr_sgs > MAX_SG) {
06f751b613296cc Corentin Labbe 2019-10-23 183 dev_err(ce->dev, "Invalid sg number %d\n", nr_sgs);
06f751b613296cc Corentin Labbe 2019-10-23 184 err = -EINVAL;
06f751b613296cc Corentin Labbe 2019-10-23 185 goto theend_iv;
06f751b613296cc Corentin Labbe 2019-10-23 186 }
06f751b613296cc Corentin Labbe 2019-10-23 187 nr_sgd = dma_map_sg(ce->dev, areq->dst, sg_nents(areq->dst),
06f751b613296cc Corentin Labbe 2019-10-23 188 DMA_FROM_DEVICE);
06f751b613296cc Corentin Labbe 2019-10-23 189 if (nr_sgd <= 0 || nr_sgd > MAX_SG) {
06f751b613296cc Corentin Labbe 2019-10-23 190 dev_err(ce->dev, "Invalid sg number %d\n", nr_sgd);
06f751b613296cc Corentin Labbe 2019-10-23 191 err = -EINVAL;
06f751b613296cc Corentin Labbe 2019-10-23 192 goto theend_sgs;
06f751b613296cc Corentin Labbe 2019-10-23 193 }
06f751b613296cc Corentin Labbe 2019-10-23 194 }
06f751b613296cc Corentin Labbe 2019-10-23 195
06f751b613296cc Corentin Labbe 2019-10-23 196 len = areq->cryptlen;
06f751b613296cc Corentin Labbe 2019-10-23 197 for_each_sg(areq->src, sg, nr_sgs, i) {
93c7f4d357de68f Corentin Labbe 2019-11-17 198 cet->t_src[i].addr = cpu_to_le32(sg_dma_address(sg));
06f751b613296cc Corentin Labbe 2019-10-23 199 todo = min(len, sg_dma_len(sg));
93c7f4d357de68f Corentin Labbe 2019-11-17 200 cet->t_src[i].len = cpu_to_le32(todo / 4);
06f751b613296cc Corentin Labbe 2019-10-23 201 dev_dbg(ce->dev, "%s total=%u SG(%d %u off=%d) todo=%u\n", __func__,
06f751b613296cc Corentin Labbe 2019-10-23 202 areq->cryptlen, i, cet->t_src[i].len, sg->offset, todo);
06f751b613296cc Corentin Labbe 2019-10-23 203 len -= todo;
06f751b613296cc Corentin Labbe 2019-10-23 204 }
06f751b613296cc Corentin Labbe 2019-10-23 205 if (len > 0) {
06f751b613296cc Corentin Labbe 2019-10-23 206 dev_err(ce->dev, "remaining len %d\n", len);
06f751b613296cc Corentin Labbe 2019-10-23 207 err = -EINVAL;
06f751b613296cc Corentin Labbe 2019-10-23 208 goto theend_sgs;
06f751b613296cc Corentin Labbe 2019-10-23 209 }
06f751b613296cc Corentin Labbe 2019-10-23 210
06f751b613296cc Corentin Labbe 2019-10-23 211 len = areq->cryptlen;
06f751b613296cc Corentin Labbe 2019-10-23 212 for_each_sg(areq->dst, sg, nr_sgd, i) {
93c7f4d357de68f Corentin Labbe 2019-11-17 213 cet->t_dst[i].addr = cpu_to_le32(sg_dma_address(sg));
06f751b613296cc Corentin Labbe 2019-10-23 214 todo = min(len, sg_dma_len(sg));
93c7f4d357de68f Corentin Labbe 2019-11-17 215 cet->t_dst[i].len = cpu_to_le32(todo / 4);
06f751b613296cc Corentin Labbe 2019-10-23 216 dev_dbg(ce->dev, "%s total=%u SG(%d %u off=%d) todo=%u\n", __func__,
06f751b613296cc Corentin Labbe 2019-10-23 217 areq->cryptlen, i, cet->t_dst[i].len, sg->offset, todo);
06f751b613296cc Corentin Labbe 2019-10-23 218 len -= todo;
06f751b613296cc Corentin Labbe 2019-10-23 219 }
06f751b613296cc Corentin Labbe 2019-10-23 220 if (len > 0) {
06f751b613296cc Corentin Labbe 2019-10-23 221 dev_err(ce->dev, "remaining len %d\n", len);
06f751b613296cc Corentin Labbe 2019-10-23 222 err = -EINVAL;
06f751b613296cc Corentin Labbe 2019-10-23 223 goto theend_sgs;
06f751b613296cc Corentin Labbe 2019-10-23 224 }
06f751b613296cc Corentin Labbe 2019-10-23 225
06f751b613296cc Corentin Labbe 2019-10-23 226 chan->timeout = areq->cryptlen;
0605fa0f78266cc Corentin Labbe 2020-09-18 227 rctx->nr_sgs = nr_sgs;
0605fa0f78266cc Corentin Labbe 2020-09-18 228 rctx->nr_sgd = nr_sgd;
0605fa0f78266cc Corentin Labbe 2020-09-18 229 return 0;
06f751b613296cc Corentin Labbe 2019-10-23 230
06f751b613296cc Corentin Labbe 2019-10-23 231 theend_sgs:
06f751b613296cc Corentin Labbe 2019-10-23 232 if (areq->src == areq->dst) {
884b93c51025026 Xiang Chen 2021-03-16 233 dma_unmap_sg(ce->dev, areq->src, sg_nents(areq->src),
884b93c51025026 Xiang Chen 2021-03-16 234 DMA_BIDIRECTIONAL);
06f751b613296cc Corentin Labbe 2019-10-23 235 } else {
06f751b613296cc Corentin Labbe 2019-10-23 236 if (nr_sgs > 0)
884b93c51025026 Xiang Chen 2021-03-16 237 dma_unmap_sg(ce->dev, areq->src, sg_nents(areq->src),
884b93c51025026 Xiang Chen 2021-03-16 238 DMA_TO_DEVICE);
884b93c51025026 Xiang Chen 2021-03-16 239 dma_unmap_sg(ce->dev, areq->dst, sg_nents(areq->dst),
884b93c51025026 Xiang Chen 2021-03-16 240 DMA_FROM_DEVICE);
06f751b613296cc Corentin Labbe 2019-10-23 241 }
06f751b613296cc Corentin Labbe 2019-10-23 242
06f751b613296cc Corentin Labbe 2019-10-23 243 theend_iv:
06f751b613296cc Corentin Labbe 2019-10-23 244 if (areq->iv && ivsize > 0) {
0605fa0f78266cc Corentin Labbe 2020-09-18 245 if (rctx->addr_iv)
0605fa0f78266cc Corentin Labbe 2020-09-18 246 dma_unmap_single(ce->dev, rctx->addr_iv, rctx->ivlen, DMA_TO_DEVICE);
06f751b613296cc Corentin Labbe 2019-10-23 247 offset = areq->cryptlen - ivsize;
06f751b613296cc Corentin Labbe 2019-10-23 248 if (rctx->op_dir & CE_DECRYPTION) {
d0b880af8c99abc Corentin Labbe 2022-01-26 249 memcpy(areq->iv, chan->backup_iv, ivsize);
d0b880af8c99abc Corentin Labbe 2022-01-26 250 memzero_explicit(chan->backup_iv, ivsize);
06f751b613296cc Corentin Labbe 2019-10-23 251 } else {
06f751b613296cc Corentin Labbe 2019-10-23 252 scatterwalk_map_and_copy(areq->iv, areq->dst, offset,
06f751b613296cc Corentin Labbe 2019-10-23 253 ivsize, 0);
06f751b613296cc Corentin Labbe 2019-10-23 254 }
d0b880af8c99abc Corentin Labbe 2022-01-26 255 memzero_explicit(chan->bounce_iv, ivsize);
06f751b613296cc Corentin Labbe 2019-10-23 256 }
06f751b613296cc Corentin Labbe 2019-10-23 257
06f751b613296cc Corentin Labbe 2019-10-23 @258 theend_key:
0605fa0f78266cc Corentin Labbe 2020-09-18 259 dma_unmap_single(ce->dev, rctx->addr_key, op->keylen, DMA_TO_DEVICE);
06f751b613296cc Corentin Labbe 2019-10-23 260
06f751b613296cc Corentin Labbe 2019-10-23 261 theend:
06f751b613296cc Corentin Labbe 2019-10-23 262 return err;
06f751b613296cc Corentin Labbe 2019-10-23 263 }
06f751b613296cc Corentin Labbe 2019-10-23 264
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c index 8f0031e45a03..f4221025d651 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-cipher.c @@ -151,23 +151,13 @@ static int sun8i_ce_cipher_prepare(struct crypto_engine *engine, void *async_req ivsize = crypto_skcipher_ivsize(tfm); if (areq->iv && crypto_skcipher_ivsize(tfm) > 0) { rctx->ivlen = ivsize; - rctx->bounce_iv = kzalloc(ivsize, GFP_KERNEL | GFP_DMA); - if (!rctx->bounce_iv) { - err = -ENOMEM; - goto theend_key; - } if (rctx->op_dir & CE_DECRYPTION) { - rctx->backup_iv = kzalloc(ivsize, GFP_KERNEL); - if (!rctx->backup_iv) { - err = -ENOMEM; - goto theend_key; - } offset = areq->cryptlen - ivsize; - scatterwalk_map_and_copy(rctx->backup_iv, areq->src, + scatterwalk_map_and_copy(chan->backup_iv, areq->src, offset, ivsize, 0); } - memcpy(rctx->bounce_iv, areq->iv, ivsize); - rctx->addr_iv = dma_map_single(ce->dev, rctx->bounce_iv, rctx->ivlen, + memcpy(chan->bounce_iv, areq->iv, ivsize); + rctx->addr_iv = dma_map_single(ce->dev, chan->bounce_iv, rctx->ivlen, DMA_TO_DEVICE); if (dma_mapping_error(ce->dev, rctx->addr_iv)) { dev_err(ce->dev, "Cannot DMA MAP IV\n"); @@ -256,13 +246,13 @@ static int sun8i_ce_cipher_prepare(struct crypto_engine *engine, void *async_req dma_unmap_single(ce->dev, rctx->addr_iv, rctx->ivlen, DMA_TO_DEVICE); offset = areq->cryptlen - ivsize; if (rctx->op_dir & CE_DECRYPTION) { - memcpy(areq->iv, rctx->backup_iv, ivsize); - kfree_sensitive(rctx->backup_iv); + memcpy(areq->iv, chan->backup_iv, ivsize); + memzero_explicit(chan->backup_iv, ivsize); } else { scatterwalk_map_and_copy(areq->iv, areq->dst, offset, ivsize, 0); } - kfree(rctx->bounce_iv); + memzero_explicit(chan->bounce_iv, ivsize); } theend_key: @@ -319,13 +309,13 @@ static int sun8i_ce_cipher_unprepare(struct crypto_engine *engine, void *async_r dma_unmap_single(ce->dev, rctx->addr_iv, rctx->ivlen, DMA_TO_DEVICE); offset = areq->cryptlen - ivsize; if (rctx->op_dir & CE_DECRYPTION) { - memcpy(areq->iv, rctx->backup_iv, ivsize); - kfree_sensitive(rctx->backup_iv); + memcpy(areq->iv, chan->backup_iv, ivsize); + memzero_explicit(chan->backup_iv, ivsize); } else { scatterwalk_map_and_copy(areq->iv, areq->dst, offset, ivsize, 0); } - kfree(rctx->bounce_iv); + memzero_explicit(chan->bounce_iv, ivsize); } dma_unmap_single(ce->dev, rctx->addr_key, op->keylen, DMA_TO_DEVICE); diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c index ea2c655e4ff1..b57aed120d33 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce-core.c @@ -305,7 +305,7 @@ static struct sun8i_ce_alg_template ce_algs[] = { .cra_priority = 400, .cra_blocksize = AES_BLOCK_SIZE, .cra_flags = CRYPTO_ALG_TYPE_SKCIPHER | - CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, .cra_ctxsize = sizeof(struct sun8i_cipher_tfm_ctx), .cra_module = THIS_MODULE, @@ -332,7 +332,7 @@ static struct sun8i_ce_alg_template ce_algs[] = { .cra_priority = 400, .cra_blocksize = AES_BLOCK_SIZE, .cra_flags = CRYPTO_ALG_TYPE_SKCIPHER | - CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, .cra_ctxsize = sizeof(struct sun8i_cipher_tfm_ctx), .cra_module = THIS_MODULE, @@ -358,7 +358,7 @@ static struct sun8i_ce_alg_template ce_algs[] = { .cra_priority = 400, .cra_blocksize = DES3_EDE_BLOCK_SIZE, .cra_flags = CRYPTO_ALG_TYPE_SKCIPHER | - CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, .cra_ctxsize = sizeof(struct sun8i_cipher_tfm_ctx), .cra_module = THIS_MODULE, @@ -385,7 +385,7 @@ static struct sun8i_ce_alg_template ce_algs[] = { .cra_priority = 400, .cra_blocksize = DES3_EDE_BLOCK_SIZE, .cra_flags = CRYPTO_ALG_TYPE_SKCIPHER | - CRYPTO_ALG_ASYNC | CRYPTO_ALG_ALLOCATES_MEMORY | + CRYPTO_ALG_ASYNC | CRYPTO_ALG_NEED_FALLBACK, .cra_ctxsize = sizeof(struct sun8i_cipher_tfm_ctx), .cra_module = THIS_MODULE, @@ -728,6 +728,18 @@ static int sun8i_ce_allocate_chanlist(struct sun8i_ce_dev *ce) err = -ENOMEM; goto error_engine; } + ce->chanlist[i].bounce_iv = devm_kmalloc(ce->dev, AES_BLOCK_SIZE, + GFP_KERNEL | GFP_DMA); + if (!ce->chanlist[i].bounce_iv) { + err = -ENOMEM; + goto error_engine; + } + ce->chanlist[i].backup_iv = devm_kmalloc(ce->dev, AES_BLOCK_SIZE, + GFP_KERNEL); + if (!ce->chanlist[i].backup_iv) { + err = -ENOMEM; + goto error_engine; + } } return 0; error_engine: diff --git a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h index 719f9a730857..229b696d5a2c 100644 --- a/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h +++ b/drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h @@ -213,6 +213,8 @@ struct ce_task { * @status: set to 1 by interrupt if task is done * @t_phy: Physical address of task * @tl: pointer to the current ce_task for this flow + * @backup_iv: buffer which contain the next IV to store + * @bounce_iv: buffer which contain the IV * @stat_req: number of request done by this flow */ struct sun8i_ce_flow { @@ -222,6 +224,8 @@ struct sun8i_ce_flow { dma_addr_t t_phy; int timeout; struct ce_task *tl; + void *backup_iv; + void *bounce_iv; #ifdef CONFIG_CRYPTO_DEV_SUN8I_CE_DEBUG unsigned long stat_req; #endif @@ -268,8 +272,6 @@ struct sun8i_ce_dev { * struct sun8i_cipher_req_ctx - context for a skcipher request * @op_dir: direction (encrypt vs decrypt) for this request * @flow: the flow to use for this request - * @backup_iv: buffer which contain the next IV to store - * @bounce_iv: buffer which contain the IV * @ivlen: size of bounce_iv * @nr_sgs: The number of source SG (as given by dma_map_sg()) * @nr_sgd: The number of destination SG (as given by dma_map_sg()) @@ -280,8 +282,6 @@ struct sun8i_ce_dev { struct sun8i_cipher_req_ctx { u32 op_dir; int flow; - void *backup_iv; - void *bounce_iv; unsigned int ivlen; int nr_sgs; int nr_sgd;
Instead of allocate memory on each requests, it is easier to pre-allocate buffer for IV. This made error path easier. Signed-off-by: Corentin Labbe <clabbe@baylibre.com> --- .../allwinner/sun8i-ce/sun8i-ce-cipher.c | 28 ++++++------------- .../crypto/allwinner/sun8i-ce/sun8i-ce-core.c | 20 ++++++++++--- drivers/crypto/allwinner/sun8i-ce/sun8i-ce.h | 8 +++--- 3 files changed, 29 insertions(+), 27 deletions(-)