| From 2c4f94e06f81e23435c68eeaa1dcc10f3d824808 Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Tue, 10 Jun 2025 11:31:56 +0200 |
| Subject: media: st-delta: avoid excessive stack usage |
| |
| From: Arnd Bergmann <arnd@arndb.de> |
| |
| [ Upstream commit 5954ad7d1af92cb6244c5f31216e43af55febbb7 ] |
| |
| Building with a reduced stack warning limit shows that delta_mjpeg_decode() |
| copies a giant structure to the stack each time but only uses three of |
| its members: |
| |
| drivers/media/platform/st/sti/delta/delta-mjpeg-dec.c: In function 'delta_mjpeg_decode': |
| drivers/media/platform/st/sti/delta/delta-mjpeg-dec.c:427:1: error: the frame size of 1296 bytes is larger than 1280 bytes [-Werror=frame-larger-than=] |
| |
| Open-code the passing of the structure members that are actually used here. |
| |
| Fixes: 433ff5b4a29b ("[media] st-delta: add mjpeg support") |
| Signed-off-by: Arnd Bergmann <arnd@arndb.de> |
| Signed-off-by: Hans Verkuil <hverkuil+cisco@kernel.org> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| .../platform/st/sti/delta/delta-mjpeg-dec.c | 20 ++++++++++--------- |
| 1 file changed, 11 insertions(+), 9 deletions(-) |
| |
| diff --git a/drivers/media/platform/st/sti/delta/delta-mjpeg-dec.c b/drivers/media/platform/st/sti/delta/delta-mjpeg-dec.c |
| index 0533d4a083d24..a078f1107300e 100644 |
| --- a/drivers/media/platform/st/sti/delta/delta-mjpeg-dec.c |
| +++ b/drivers/media/platform/st/sti/delta/delta-mjpeg-dec.c |
| @@ -239,7 +239,7 @@ static int delta_mjpeg_ipc_open(struct delta_ctx *pctx) |
| return 0; |
| } |
| |
| -static int delta_mjpeg_ipc_decode(struct delta_ctx *pctx, struct delta_au *au) |
| +static int delta_mjpeg_ipc_decode(struct delta_ctx *pctx, dma_addr_t pstart, dma_addr_t pend) |
| { |
| struct delta_dev *delta = pctx->dev; |
| struct delta_mjpeg_ctx *ctx = to_ctx(pctx); |
| @@ -256,8 +256,8 @@ static int delta_mjpeg_ipc_decode(struct delta_ctx *pctx, struct delta_au *au) |
| |
| memset(params, 0, sizeof(*params)); |
| |
| - params->picture_start_addr_p = (u32)(au->paddr); |
| - params->picture_end_addr_p = (u32)(au->paddr + au->size - 1); |
| + params->picture_start_addr_p = pstart; |
| + params->picture_end_addr_p = pend; |
| |
| /* |
| * !WARNING! |
| @@ -374,12 +374,14 @@ static int delta_mjpeg_decode(struct delta_ctx *pctx, struct delta_au *pau) |
| struct delta_dev *delta = pctx->dev; |
| struct delta_mjpeg_ctx *ctx = to_ctx(pctx); |
| int ret; |
| - struct delta_au au = *pau; |
| + void *au_vaddr = pau->vaddr; |
| + dma_addr_t au_dma = pau->paddr; |
| + size_t au_size = pau->size; |
| unsigned int data_offset = 0; |
| struct mjpeg_header *header = &ctx->header_struct; |
| |
| if (!ctx->header) { |
| - ret = delta_mjpeg_read_header(pctx, au.vaddr, au.size, |
| + ret = delta_mjpeg_read_header(pctx, au_vaddr, au_size, |
| header, &data_offset); |
| if (ret) { |
| pctx->stream_errors++; |
| @@ -405,17 +407,17 @@ static int delta_mjpeg_decode(struct delta_ctx *pctx, struct delta_au *pau) |
| goto err; |
| } |
| |
| - ret = delta_mjpeg_read_header(pctx, au.vaddr, au.size, |
| + ret = delta_mjpeg_read_header(pctx, au_vaddr, au_size, |
| ctx->header, &data_offset); |
| if (ret) { |
| pctx->stream_errors++; |
| goto err; |
| } |
| |
| - au.paddr += data_offset; |
| - au.vaddr += data_offset; |
| + au_dma += data_offset; |
| + au_vaddr += data_offset; |
| |
| - ret = delta_mjpeg_ipc_decode(pctx, &au); |
| + ret = delta_mjpeg_ipc_decode(pctx, au_dma, au_dma + au_size - 1); |
| if (ret) |
| goto err; |
| |
| -- |
| 2.51.0 |
| |