]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amd/display: Move dml2_destroy to non-FPU compilation unit
authorRafal Ostrowski <rafal.ostrowski@amd.com>
Fri, 10 Apr 2026 07:09:57 +0000 (09:09 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 17 Apr 2026 19:25:27 +0000 (15:25 -0400)
On PREEMPT_RT kernels, vfree() can sleep because spin_lock is
converted to rt_mutex. dml2_destroy() calls vfree() while inside
an FPU-guarded region (preempt_count=2), which is illegal.

dml2_wrapper_fpu.c is compiled with CC_FLAGS_FPU which defines
_LINUX_FPU_COMPILATION_UNIT, making DC_RUN_WITH_PREEMPTION_ENABLED()
resolve to a no-op. This prevents the macro from cycling FPU
context off/on around vfree().

Move dml2_destroy() to dml2_wrapper.c (non-FPU compilation unit)
where DC_RUN_WITH_PREEMPTION_ENABLED() properly cycles DC_FP_END/
DC_FP_START around vfree(). This pairs it with dml2_allocate_memory()
which already lives there.

Reviewed-by: Dillon Varone <dillon.varone@amd.com>
Signed-off-by: Rafal Ostrowski <rafal.ostrowski@amd.com>
Signed-off-by: Chenyu Chen <chen-yu.chen@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/dml2_0/dml21/dml21_wrapper.c
drivers/gpu/drm/amd/display/dc/dml2_0/dml2_wrapper.c
drivers/gpu/drm/amd/display/dc/dml2_0/dml2_wrapper_fpu.c

index 7398f8b69adbe9aa09ed712ca9f3504f13236ef5..8bed59e976d1633f1f0cd2313c56103bd0d68850 100644 (file)
@@ -58,8 +58,8 @@ bool dml21_create(const struct dc *in_dc, struct dml2_context **dml_ctx, const s
 
 void dml21_destroy(struct dml2_context *dml2)
 {
-       vfree(dml2->v21.dml_init.dml2_instance);
-       vfree(dml2->v21.mode_programming.programming);
+       DC_RUN_WITH_PREEMPTION_ENABLED(vfree(dml2->v21.dml_init.dml2_instance));
+       DC_RUN_WITH_PREEMPTION_ENABLED(vfree(dml2->v21.mode_programming.programming));
 }
 
 void dml21_copy(struct dml2_context *dst_dml_ctx,
index 93b7613fc4f22541aa1756385e3ca298b237910b..1772e74349c7ba678495f5fdb498c83e9042ff33 100644 (file)
@@ -108,6 +108,17 @@ bool dml2_create(const struct dc *in_dc, const struct dml2_configuration_options
        return true;
 }
 
+void dml2_destroy(struct dml2_context *dml2)
+{
+       if (!dml2)
+               return;
+
+       if (dml2->architecture == dml2_architecture_21)
+               dml21_destroy(dml2);
+
+       DC_RUN_WITH_PREEMPTION_ENABLED(vfree(dml2));
+}
+
 void dml2_reinit(const struct dc *in_dc,
                                 const struct dml2_configuration_options *config,
                                 struct dml2_context **dml2)
index 66624cfc27b1712fb65973934fb8b97e43b8774c..a14e3004a7b722bcc8ad802f7b836aa5bdaeaea8 100644 (file)
@@ -548,16 +548,6 @@ void dml2_apply_debug_options(const struct dc *dc, struct dml2_context *dml2)
        }
 }
 
-void dml2_destroy(struct dml2_context *dml2)
-{
-       if (!dml2)
-               return;
-
-       if (dml2->architecture == dml2_architecture_21)
-               dml21_destroy(dml2);
-       vfree(dml2);
-}
-
 void dml2_extract_dram_and_fclk_change_support(struct dml2_context *dml2,
        unsigned int *fclk_change_support, unsigned int *dram_clk_change_support)
 {