128 lines
4.8 KiB
Diff
128 lines
4.8 KiB
Diff
From 5a7dc49ebe22d776913e8fd4fd3c835d1ac57db8 Mon Sep 17 00:00:00 2001
|
|
From: Vladislav Dronov <vdronov@redhat.com>
|
|
Date: Sun, 7 Jun 2026 23:23:19 +0200
|
|
Subject: [PATCH] crypto: tegra - Fix dma_free_coherent size error
|
|
|
|
JIRA: https://redhat.atlassian.net/browse/RHEL-176465
|
|
Upstream Status: merged into herbert/crypto-2.6.git
|
|
|
|
commit 03215b8457784540acc741e6331e355b62c6c8ab
|
|
Author: Herbert Xu <herbert@gondor.apana.org.au>
|
|
Date: Tue May 19 12:22:18 2026 +0800
|
|
|
|
crypto: tegra - Fix dma_free_coherent size error
|
|
|
|
When freeing a coherent DMA buffer, the size must match the value
|
|
that was used during the allocation.
|
|
|
|
Unfortunately the size field in the tegra driver gets overwritten
|
|
by this point so it no longer matches and creates a warning.
|
|
|
|
Fix this by saving a copy of the size on the stack.
|
|
|
|
Note that the ccm function actually mixes up the inbuf and outbuf
|
|
sizes, but it doesn't matter because the two sizes are actually
|
|
equal.
|
|
|
|
Fixes: 1cb328da4e8f ("crypto: tegra - Do not use fixed size buffers")
|
|
Reporeted-by: Patrick Talbert <ptalbert@redhat.com>
|
|
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
Reviewed-by: Vladislav Dronov <vdronov@redhat.com>
|
|
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
|
|
|
|
Signed-off-by: Vladislav Dronov <vdronov@redhat.com>
|
|
|
|
diff --git a/drivers/crypto/tegra/tegra-se-aes.c b/drivers/crypto/tegra/tegra-se-aes.c
|
|
index 30c78afe3dea..5086e7f140c3 100644
|
|
--- a/drivers/crypto/tegra/tegra-se-aes.c
|
|
+++ b/drivers/crypto/tegra/tegra-se-aes.c
|
|
@@ -1201,6 +1201,7 @@ static int tegra_ccm_do_one_req(struct crypto_engine *engine, void *areq)
|
|
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
|
struct tegra_aead_ctx *ctx = crypto_aead_ctx(tfm);
|
|
struct tegra_se *se = ctx->se;
|
|
+ unsigned int bufsize;
|
|
int ret;
|
|
|
|
ret = tegra_ccm_crypt_init(req, se, rctx);
|
|
@@ -1210,14 +1211,15 @@ static int tegra_ccm_do_one_req(struct crypto_engine *engine, void *areq)
|
|
rctx->key_id = ctx->key_id;
|
|
|
|
/* Allocate buffers required */
|
|
- rctx->inbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen + 100;
|
|
- rctx->inbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->inbuf.size,
|
|
+ bufsize = rctx->assoclen + rctx->authsize + rctx->cryptlen + 100;
|
|
+ rctx->inbuf.size = bufsize;
|
|
+ rctx->inbuf.buf = dma_alloc_coherent(ctx->se->dev, bufsize,
|
|
&rctx->inbuf.addr, GFP_KERNEL);
|
|
if (!rctx->inbuf.buf)
|
|
goto out_finalize;
|
|
|
|
- rctx->outbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen + 100;
|
|
- rctx->outbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->outbuf.size,
|
|
+ rctx->outbuf.size = bufsize;
|
|
+ rctx->outbuf.buf = dma_alloc_coherent(ctx->se->dev, bufsize,
|
|
&rctx->outbuf.addr, GFP_KERNEL);
|
|
if (!rctx->outbuf.buf) {
|
|
ret = -ENOMEM;
|
|
@@ -1254,11 +1256,11 @@ static int tegra_ccm_do_one_req(struct crypto_engine *engine, void *areq)
|
|
}
|
|
|
|
out:
|
|
- dma_free_coherent(ctx->se->dev, rctx->inbuf.size,
|
|
+ dma_free_coherent(ctx->se->dev, bufsize,
|
|
rctx->outbuf.buf, rctx->outbuf.addr);
|
|
|
|
out_free_inbuf:
|
|
- dma_free_coherent(ctx->se->dev, rctx->outbuf.size,
|
|
+ dma_free_coherent(ctx->se->dev, bufsize,
|
|
rctx->inbuf.buf, rctx->inbuf.addr);
|
|
|
|
if (tegra_key_is_reserved(rctx->key_id))
|
|
@@ -1278,6 +1280,7 @@ static int tegra_gcm_do_one_req(struct crypto_engine *engine, void *areq)
|
|
struct crypto_aead *tfm = crypto_aead_reqtfm(req);
|
|
struct tegra_aead_ctx *ctx = crypto_aead_ctx(tfm);
|
|
struct tegra_aead_reqctx *rctx = aead_request_ctx(req);
|
|
+ unsigned int bufsize;
|
|
int ret;
|
|
|
|
rctx->src_sg = req->src;
|
|
@@ -1296,16 +1299,17 @@ static int tegra_gcm_do_one_req(struct crypto_engine *engine, void *areq)
|
|
rctx->key_id = ctx->key_id;
|
|
|
|
/* Allocate buffers required */
|
|
- rctx->inbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen;
|
|
- rctx->inbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->inbuf.size,
|
|
+ bufsize = rctx->assoclen + rctx->authsize + rctx->cryptlen;
|
|
+ rctx->inbuf.size = bufsize;
|
|
+ rctx->inbuf.buf = dma_alloc_coherent(ctx->se->dev, bufsize,
|
|
&rctx->inbuf.addr, GFP_KERNEL);
|
|
if (!rctx->inbuf.buf) {
|
|
ret = -ENOMEM;
|
|
goto out_finalize;
|
|
}
|
|
|
|
- rctx->outbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen;
|
|
- rctx->outbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->outbuf.size,
|
|
+ rctx->outbuf.size = bufsize;
|
|
+ rctx->outbuf.buf = dma_alloc_coherent(ctx->se->dev, bufsize,
|
|
&rctx->outbuf.addr, GFP_KERNEL);
|
|
if (!rctx->outbuf.buf) {
|
|
ret = -ENOMEM;
|
|
@@ -1342,11 +1346,11 @@ static int tegra_gcm_do_one_req(struct crypto_engine *engine, void *areq)
|
|
ret = tegra_gcm_do_verify(ctx->se, rctx);
|
|
|
|
out:
|
|
- dma_free_coherent(ctx->se->dev, rctx->outbuf.size,
|
|
+ dma_free_coherent(ctx->se->dev, bufsize,
|
|
rctx->outbuf.buf, rctx->outbuf.addr);
|
|
|
|
out_free_inbuf:
|
|
- dma_free_coherent(ctx->se->dev, rctx->inbuf.size,
|
|
+ dma_free_coherent(ctx->se->dev, bufsize,
|
|
rctx->inbuf.buf, rctx->inbuf.addr);
|
|
|
|
if (tegra_key_is_reserved(rctx->key_id))
|
|
--
|
|
2.50.1 (Apple Git-155)
|
|
|