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

media: st-delta: avoid excessive stack usage

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>

authored by

Arnd Bergmann and committed by
Hans Verkuil
5954ad7d 16428e24

+11 -9
+11 -9
drivers/media/platform/st/sti/delta/delta-mjpeg-dec.c
··· 239 239 return 0; 240 240 } 241 241 242 - static int delta_mjpeg_ipc_decode(struct delta_ctx *pctx, struct delta_au *au) 242 + static int delta_mjpeg_ipc_decode(struct delta_ctx *pctx, dma_addr_t pstart, dma_addr_t pend) 243 243 { 244 244 struct delta_dev *delta = pctx->dev; 245 245 struct delta_mjpeg_ctx *ctx = to_ctx(pctx); ··· 256 256 257 257 memset(params, 0, sizeof(*params)); 258 258 259 - params->picture_start_addr_p = (u32)(au->paddr); 260 - params->picture_end_addr_p = (u32)(au->paddr + au->size - 1); 259 + params->picture_start_addr_p = pstart; 260 + params->picture_end_addr_p = pend; 261 261 262 262 /* 263 263 * !WARNING! ··· 374 374 struct delta_dev *delta = pctx->dev; 375 375 struct delta_mjpeg_ctx *ctx = to_ctx(pctx); 376 376 int ret; 377 - struct delta_au au = *pau; 377 + void *au_vaddr = pau->vaddr; 378 + dma_addr_t au_dma = pau->paddr; 379 + size_t au_size = pau->size; 378 380 unsigned int data_offset = 0; 379 381 struct mjpeg_header *header = &ctx->header_struct; 380 382 381 383 if (!ctx->header) { 382 - ret = delta_mjpeg_read_header(pctx, au.vaddr, au.size, 384 + ret = delta_mjpeg_read_header(pctx, au_vaddr, au_size, 383 385 header, &data_offset); 384 386 if (ret) { 385 387 pctx->stream_errors++; ··· 407 405 goto err; 408 406 } 409 407 410 - ret = delta_mjpeg_read_header(pctx, au.vaddr, au.size, 408 + ret = delta_mjpeg_read_header(pctx, au_vaddr, au_size, 411 409 ctx->header, &data_offset); 412 410 if (ret) { 413 411 pctx->stream_errors++; 414 412 goto err; 415 413 } 416 414 417 - au.paddr += data_offset; 418 - au.vaddr += data_offset; 415 + au_dma += data_offset; 416 + au_vaddr += data_offset; 419 417 420 - ret = delta_mjpeg_ipc_decode(pctx, &au); 418 + ret = delta_mjpeg_ipc_decode(pctx, au_dma, au_dma + au_size - 1); 421 419 if (ret) 422 420 goto err; 423 421