On Thu Jun 18 16:32:47 2026 +0200, Arnd Bergmann wrote:
> tpg_fill_plane_buffer() is a rather complex function. While there is
> nothing wrong with it per se, I have run into corner cases with clang-22
> on s390 using KASAN that makes it run out of registers and blow the
> stack warning limit from excessive spills:
>
> drivers/media/common/v4l2-tpg/v4l2-tpg-core.c:2629:6: error: stack frame size
> (1560) exceeds limit (1536)
> in 'tpg_fill_plane_buffer' [-Werror,-Wframe-larger-than]
> 2629 | void tpg_fill_plane_buffer(struct tpg_data *tpg, v4l2_std_id std,
>
> Forcing the two largest callees out of line completely avoids the problem
> and prevents all the register spills, with the stack usage for each function
> going down to a few bytes for the local variables.
>
> Arguably this is a problem caused by clang rather than the code, but
> a noinline_for_stack annotation is an easy workaround.
>
> Signed-off-by: Arnd Bergmann <[email protected]>
> Signed-off-by: Hans Verkuil <[email protected]>
Patch committed.
Thanks,
Hans Verkuil
drivers/media/common/v4l2-tpg/v4l2-tpg-core.c | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
---
diff --git a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
index 931e5dc453b9..e1d5c220f738 100644
--- a/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
+++ b/drivers/media/common/v4l2-tpg/v4l2-tpg-core.c
@@ -2346,9 +2346,11 @@ static void tpg_fill_params_extras(const struct tpg_data
*tpg,
(params->is_60hz ? V4L2_FIELD_TOP : V4L2_FIELD_BOTTOM);
}
-static void tpg_fill_plane_extras(const struct tpg_data *tpg,
- const struct tpg_draw_params *params,
- unsigned p, unsigned h, u8 *vbuf)
+/* noinline to work around clang KASAN issues */
+static noinline_for_stack void
+tpg_fill_plane_extras(const struct tpg_data *tpg,
+ const struct tpg_draw_params *params,
+ unsigned p, unsigned h, u8 *vbuf)
{
unsigned twopixsize = params->twopixsize;
unsigned img_width = params->img_width;
@@ -2483,9 +2485,9 @@ static void tpg_fill_plane_extras(const struct tpg_data
*tpg,
}
}
-static void tpg_fill_plane_pattern(const struct tpg_data *tpg,
- const struct tpg_draw_params *params,
- unsigned p, unsigned h, u8 *vbuf)
+static noinline_for_stack void
+tpg_fill_plane_pattern(const struct tpg_data *tpg, const struct
tpg_draw_params *params,
+ unsigned p, unsigned h, u8 *vbuf)
{
unsigned twopixsize = params->twopixsize;
unsigned img_width = params->img_width;
_______________________________________________
linuxtv-commits mailing list -- [email protected]
To unsubscribe send an email to [email protected]