Skip to content

Commit 66cc911

Browse files
sean-anderson-secogregkh
authored andcommitted
crypto: mxs-dcp - Use sg_mapping_iter to copy data
[ Upstream commit 2e6d793e1bf07fe5e20cfbbdcec9e1af7e5097eb ] This uses the sg_pcopy_from_buffer to copy data, instead of doing it ourselves. In addition to reducing code size, this fixes the following oops resulting from failing to kmap the page: [ 68.896381] Unable to handle kernel NULL pointer dereference at virtual address 00000ab8 [ 68.904539] pgd = 3561adb3 [ 68.907475] [00000ab8] *pgd=00000000 [ 68.911153] Internal error: Oops: 805 [okta-10#1] ARM [ 68.915618] Modules linked in: cfg80211 rfkill des_generic libdes arc4 libarc4 cbc ecb algif_skcipher sha256_generic libsha256 sha1_generic hmac aes_generic libaes cmac sha512_generic md5 md4 algif_hash af_alg i2c_imx i2c_core ci_hdrc_imx ci_hdrc mxs_dcp ulpi roles udc_core imx_sdma usbmisc_imx usb_common firmware_class virt_dma phy_mxs_usb nf_tables nfnetlink ip_tables x_tables ipv6 autofs4 [ 68.950741] CPU: 0 PID: 139 Comm: mxs_dcp_chan/ae Not tainted 5.10.34 #296 [ 68.958501] Hardware name: Freescale i.MX6 Ultralite (Device Tree) [ 68.964710] PC is at memcpy+0xa8/0x330 [ 68.968479] LR is at 0xd7b2bc9d [ 68.971638] pc : [<c053e7c8>] lr : [<d7b2bc9d>] psr: 000f0013 [ 68.977920] sp : c2cbbee4 ip : 00000010 fp : 00000010 [ 68.983159] r10: 00000000 r9 : c3283a40 r8 : 1a5a6f08 [ 68.988402] r7 : 4bfe0ecc r6 : 76d8a220 r5 : c32f9050 r4 : 00000001 [ 68.994945] r3 : 00000ab8 r2 : fffffff0 r1 : c32f9050 r0 : 00000ab8 [ 69.001492] Flags: nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment none [ 69.008646] Control: 10c53c7d Table: 83664059 DAC: 00000051 [ 69.014414] Process mxs_dcp_chan/ae (pid: 139, stack limit = 0x667b57ab) [ 69.021133] Stack: (0xc2cbbee4 to 0xc2cbc000) [ 69.025519] bee0: c32f9050 c3235408 00000010 00000010 00000ab8 00000001 bf10406c [ 69.033720] bf00: 00000000 00000000 00000010 00000000 c32355d0 832fb080 00000000 c13de2fc [ 69.041921] bf20: c3628010 00000010 c33d5780 00000ab8 bf1067e 00000002 c21e5010 c2cba000 [ 69.050125] bf40: c32f8040 00000000 bf106a40 c32f9040 c3283a80 00000001 bf105240 c3234040 [ 69.058327] bf60: ffffe000 c3204100 c2c69800 c2cba000 00000000 bf103b84 00000000 c2eddc54 [ 69.066530] bf80: c3204144 c0140d1c c2cba000 c2c69800 c0140be8 00000000 00000000 00000000 [ 69.074730] bfa0: 00000000 00000000 00000000 c0100114 00000000 00000000 00000000 00000000 [ 69.082932] bfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 69.091131] bfe0: 00000000 00000000 00000000 00000000 00000013 00000000 00000000 00000000 [ 69.099364] [<c053e7c8>] (memcpy) from [<bf10406c>] (dcp_chan_thread_aes+0x4e8/0x840 [mxs_dcp]) [ 69.108117] [<bf10406c>] (dcp_chan_thread_aes [mxs_dcp]) from [<c0140d1c>] (kthread+0x134/0x160) [ 69.116941] [<c0140d1c>] (kthread) from [<c0100114>] (ret_from_fork+0x14/0x20) [ 69.124178] Exception stack(0xc2cbbfb0 to 0xc2cbbff8) [ 69.129250] bfa0: 00000000 00000000 00000000 00000000 [ 69.137450] bfc0: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 [ 69.145648] bfe0: 00000000 00000000 00000000 00000000 00000013 00000000 [ 69.152289] Code: e320f000 e4803004 e4804004 e4805004 (e4806004) Signed-off-by: Sean Anderson <sean.anderson@seco.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: Sasha Levin <sashal@kernel.org>
1 parent 0fda79d commit 66cc911

File tree

1 file changed

+9
-27
lines changed

1 file changed

+9
-27
lines changed

drivers/crypto/mxs-dcp.c

Lines changed: 9 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -297,21 +297,20 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)
297297

298298
struct scatterlist *dst = req->dst;
299299
struct scatterlist *src = req->src;
300-
const int nents = sg_nents(req->src);
300+
int dst_nents = sg_nents(dst);
301301

302302
const int out_off = DCP_BUF_SZ;
303303
uint8_t *in_buf = sdcp->coh->aes_in_buf;
304304
uint8_t *out_buf = sdcp->coh->aes_out_buf;
305305

306-
uint8_t *out_tmp, *src_buf, *dst_buf = NULL;
307306
uint32_t dst_off = 0;
307+
uint8_t *src_buf = NULL;
308308
uint32_t last_out_len = 0;
309309

310310
uint8_t *key = sdcp->coh->aes_key;
311311

312312
int ret = 0;
313-
int split = 0;
314-
unsigned int i, len, clen, rem = 0, tlen = 0;
313+
unsigned int i, len, clen, tlen = 0;
315314
int init = 0;
316315
bool limit_hit = false;
317316

@@ -329,7 +328,7 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)
329328
memset(key + AES_KEYSIZE_128, 0, AES_KEYSIZE_128);
330329
}
331330

332-
for_each_sg(req->src, src, nents, i) {
331+
for_each_sg(req->src, src, sg_nents(src), i) {
333332
src_buf = sg_virt(src);
334333
len = sg_dma_len(src);
335334
tlen += len;
@@ -354,34 +353,17 @@ static int mxs_dcp_aes_block_crypt(struct crypto_async_request *arq)
354353
* submit the buffer.
355354
*/
356355
if (actx->fill == out_off || sg_is_last(src) ||
357-
limit_hit) {
356+
limit_hit) {
358357
ret = mxs_dcp_run_aes(actx, req, init);
359358
if (ret)
360359
return ret;
361360
init = 0;
362361

363-
out_tmp = out_buf;
362+
sg_pcopy_from_buffer(dst, dst_nents, out_buf,
363+
actx->fill, dst_off);
364+
dst_off += actx->fill;
364365
last_out_len = actx->fill;
365-
while (dst && actx->fill) {
366-
if (!split) {
367-
dst_buf = sg_virt(dst);
368-
dst_off = 0;
369-
}
370-
rem = min(sg_dma_len(dst) - dst_off,
371-
actx->fill);
372-
373-
memcpy(dst_buf + dst_off, out_tmp, rem);
374-
out_tmp += rem;
375-
dst_off += rem;
376-
actx->fill -= rem;
377-
378-
if (dst_off == sg_dma_len(dst)) {
379-
dst = sg_next(dst);
380-
split = 0;
381-
} else {
382-
split = 1;
383-
}
384-
}
366+
actx->fill = 0;
385367
}
386368
} while (len);
387369

0 commit comments

Comments
 (0)