crypto: caam - save caam memory to support crypto engine retry mechanism.
[ Upstream commit087e1d715b
] 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:2d653936eb
("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> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
Родитель
db3c2121d1
Коммит
2efa4dd460
|
@ -1533,6 +1533,9 @@ static int aead_do_one_req(struct crypto_engine *engine, void *areq)
|
|||
|
||||
ret = caam_jr_enqueue(ctx->jrdev, desc, aead_crypt_done, req);
|
||||
|
||||
if (ret == -ENOSPC && engine->retry_support)
|
||||
return ret;
|
||||
|
||||
if (ret != -EINPROGRESS) {
|
||||
aead_unmap(ctx->jrdev, rctx->edesc, req);
|
||||
kfree(rctx->edesc);
|
||||
|
@ -1762,6 +1765,9 @@ static int skcipher_do_one_req(struct crypto_engine *engine, void *areq)
|
|||
|
||||
ret = caam_jr_enqueue(ctx->jrdev, desc, skcipher_crypt_done, req);
|
||||
|
||||
if (ret == -ENOSPC && engine->retry_support)
|
||||
return ret;
|
||||
|
||||
if (ret != -EINPROGRESS) {
|
||||
skcipher_unmap(ctx->jrdev, rctx->edesc, req);
|
||||
kfree(rctx->edesc);
|
||||
|
|
|
@ -765,6 +765,9 @@ static int ahash_do_one_req(struct crypto_engine *engine, void *areq)
|
|||
|
||||
ret = caam_jr_enqueue(jrdev, desc, state->ahash_op_done, req);
|
||||
|
||||
if (ret == -ENOSPC && engine->retry_support)
|
||||
return ret;
|
||||
|
||||
if (ret != -EINPROGRESS) {
|
||||
ahash_unmap(jrdev, state->edesc, req, 0);
|
||||
kfree(state->edesc);
|
||||
|
|
|
@ -380,6 +380,9 @@ static int akcipher_do_one_req(struct crypto_engine *engine, void *areq)
|
|||
|
||||
ret = caam_jr_enqueue(jrdev, desc, req_ctx->akcipher_op_done, req);
|
||||
|
||||
if (ret == -ENOSPC && engine->retry_support)
|
||||
return ret;
|
||||
|
||||
if (ret != -EINPROGRESS) {
|
||||
rsa_pub_unmap(jrdev, req_ctx->edesc, req);
|
||||
rsa_io_unmap(jrdev, req_ctx->edesc, req);
|
||||
|
|
Загрузка…
Ссылка в новой задаче