mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 19:13:47 +02:00
drm/amd/display: Move dml2_destroy to non-FPU compilation unit
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>
This commit is contained in:
parent
07598c7696
commit
8bf0cb97ed
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user