Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: caam - save caam memory to support crypto engine retry mechanism.

When caam queue is full (-ENOSPC), caam frees descriptor memory.
crypto-engine checks if retry support is true and h/w queue
is full(-ENOSPC), then requeue the crypto request.
During processing the requested descriptor again, caam gives below error.
(caam_jr 30902000.jr: 40000006: DECO: desc idx 0: Invalid KEY Command).

This patch adds a check to return when caam input ring is full
and retry support is true. so descriptor memory is not freed
and requeued request can be processed again.

Fixes: 2d653936eb2cf ("crypto: caam - enable crypto-engine retry mechanism")
Signed-off-by: Gaurav Jain <gaurav.jain@nxp.com>
Reviewed-by: Horia Geantă <horia.geanta@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Gaurav Jain and committed by
Herbert Xu
087e1d71 330507fb

+12
+6
drivers/crypto/caam/caamalg.c
··· 1533 1533 1534 1534 ret = caam_jr_enqueue(ctx->jrdev, desc, aead_crypt_done, req); 1535 1535 1536 + if (ret == -ENOSPC && engine->retry_support) 1537 + return ret; 1538 + 1536 1539 if (ret != -EINPROGRESS) { 1537 1540 aead_unmap(ctx->jrdev, rctx->edesc, req); 1538 1541 kfree(rctx->edesc); ··· 1764 1761 rctx->edesc->bklog = true; 1765 1762 1766 1763 ret = caam_jr_enqueue(ctx->jrdev, desc, skcipher_crypt_done, req); 1764 + 1765 + if (ret == -ENOSPC && engine->retry_support) 1766 + return ret; 1767 1767 1768 1768 if (ret != -EINPROGRESS) { 1769 1769 skcipher_unmap(ctx->jrdev, rctx->edesc, req);
+3
drivers/crypto/caam/caamhash.c
··· 765 765 766 766 ret = caam_jr_enqueue(jrdev, desc, state->ahash_op_done, req); 767 767 768 + if (ret == -ENOSPC && engine->retry_support) 769 + return ret; 770 + 768 771 if (ret != -EINPROGRESS) { 769 772 ahash_unmap(jrdev, state->edesc, req, 0); 770 773 kfree(state->edesc);
+3
drivers/crypto/caam/caampkc.c
··· 380 380 381 381 ret = caam_jr_enqueue(jrdev, desc, req_ctx->akcipher_op_done, req); 382 382 383 + if (ret == -ENOSPC && engine->retry_support) 384 + return ret; 385 + 383 386 if (ret != -EINPROGRESS) { 384 387 rsa_pub_unmap(jrdev, req_ctx->edesc, req); 385 388 rsa_io_unmap(jrdev, req_ctx->edesc, req);