[PATCH] drm/amd/display: make DC_RUN_WITH_PREEMPTION_ENABLED misuse a build error
From: Mikhail Gavrilov
Date: Thu Jul 30 2026 - 03:09:50 EST
Inside an FPU compilation unit DC_FP_START() and DC_FP_END() are defined
as BUILD_BUG(), so using them there fails the build. That was done on
purpose by
commit a574f53ed52e ("drm/amd/display: Permit DC_FP_START/END only in non-FP compilation units").
DC_RUN_WITH_PREEMPTION_ENABLED() was added later by
commit 3539437f354b ("drm/amd/display: Move FPU Guards From DML To DC - Part 1")
and defined as a plain pass-through in that same branch instead. A wrap
placed inside an FPU compilation unit therefore compiles cleanly, reads
as correct during review, and does nothing at all.
This is not hypothetical. While chasing a "scheduling while atomic"
splat in dc_create_plane_state() on PREEMPT_RT, an attempt to place the
guard further up the call chain, in dml21_add_phantom_plane() in
dc/dml2_0/dml21/dml21_utils.c, had no effect for exactly this reason:
dc/dml2_0/Makefile applies CC_FLAGS_FPU to every object under that
directory, and the top level Makefile adds -D_LINUX_FPU_COMPILATION_UNIT
to CC_FLAGS_FPU.
Define the macro as BUILD_BUG() there as well, so that the mistake is a
compile error rather than a guard that silently does nothing. The code
argument is kept in the expansion so the BUILD_BUG() failure is not
accompanied by set-but-unused diagnostics for variables assigned inside
it.
No current user is affected. dc/core/dc_stream.c and
dc/resource/dcn32/dcn32_resource.c are outside the dml directories, and
dc/dml2_0/dml2_wrapper.c and dc/dml2_0/dml21/dml21_wrapper.c are built
without the FPU flags because dc/dml2_0/Makefile replaces their CFLAGS
with CC_FLAGS_NO_FPU and removes CC_FLAGS_FPU.
Link: https://lore.kernel.org/all/1ead313022bc62dce1f42af9f855727eb9074443.camel@xxxxxx/
Signed-off-by: Mikhail Gavrilov <mikhail.v.gavrilov@xxxxxxxxx>
---
This is a build-time change, so there is nothing to reproduce at
runtime. Verified in both directions on x86_64 with
CONFIG_DRM_AMD_DC_FP=y, by adding
DC_RUN_WITH_PREEMPTION_ENABLED((void)0);
to dcn10_resource_construct_fp() in dc/dml/dcn10/dcn10_fpu.c, which is
compiled with CC_FLAGS_FPU and already includes dc_fpu.h.
Without the patch 'make drivers/gpu/drm/amd/amdgpu/' compiles that file
and the whole module links, so the guard is silently ineffective. With
the patch the build stops there:
dcn10_fpu.c: In function 'dcn10_resource_construct_fp':
include/linux/compiler_types.h:702:45: error: call to
'__compiletime_assert_524' declared with attribute error: BUILD_BUG failed
dc_fpu.h:56:17: note: in expansion of macro 'BUILD_BUG'
dcn10_fpu.c:129:9: note: in expansion of macro 'DC_RUN_WITH_PREEMPTION_ENABLED'
No set-but-unused diagnostics accompany it. Removing the added line
builds cleanly again.
drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.h | 6 +++++-
1 file changed, 5 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.h b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.h
index 5e95419d3798..e89b39a4aa83 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.h
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/dc_fpu.h
@@ -51,7 +51,11 @@ void dc_fpu_end(const char *function_name, const int line);
#else
#define DC_FP_START() BUILD_BUG()
#define DC_FP_END() BUILD_BUG()
-#define DC_RUN_WITH_PREEMPTION_ENABLED(code) code
+#define DC_RUN_WITH_PREEMPTION_ENABLED(code) \
+ do { \
+ BUILD_BUG(); \
+ code; \
+ } while (0)
#endif // !_LINUX_FPU_COMPILATION_UNIT
#endif /* __DC_FPU_H__ */
--
2.55.0