]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
media: st-delta: avoid excessive stack usage
authorArnd Bergmann <arnd@arndb.de>
Tue, 10 Jun 2025 09:31:56 +0000 (11:31 +0200)
committerHans Verkuil <hverkuil+cisco@kernel.org>
Fri, 29 Aug 2025 09:04:01 +0000 (11:04 +0200)
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>
drivers/media/platform/st/sti/delta/delta-mjpeg-dec.c

index 0533d4a083d249508ab0ddfbf7a4f2a5728e0101..a078f1107300ee7e271f570e9d74c533421a5ad9 100644 (file)
@@ -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;