[PATCH 2/2] drm/amd/display: Protect dml2_validate() from its callers
Alex Hung
alex.hung at amd.com
Thu Mar 20 02:17:26 UTC 2025
Please see comments for patch 1.
On 3/18/25 05:17, Huacai Chen wrote:
> Similar to dml2_create()/dml2_copy()/dml2_create_copy(), dml2_validate()
> should also be protected from its callers because "All the DC_FP_START/END
> should be used before call anything from DML2".
>
> So protect dml2_validate() with DC_FP_START() and DC_FP_END(), otherwise
> it causes such errors:
>
> do_fpu invoked from kernel context![#1]:
> CPU: 10 UID: 0 PID: 331 Comm: kworker/10:1H Not tainted 6.14.0-rc6+ #4
> Workqueue: events_highpri dm_irq_work_func [amdgpu]
> pc ffff800003191eb0 ra ffff800003191e60 tp 9000000107a94000 sp 9000000107a975b0
> a0 9000000140ce4910 a1 0000000000000000 a2 9000000140ce49b0 a3 9000000140ce49a8
> a4 9000000140ce49a8 a5 0000000100000000 a6 0000000000000001 a7 9000000107a97660
> t0 ffff800003790000 t1 9000000140ce5000 t2 0000000000000001 t3 0000000000000000
> t4 0000000000000004 t5 0000000000000000 t6 0000000000000000 t7 0000000000000000
> t8 0000000100000000 u0 ffff8000031a3b9c s9 9000000130bc0000 s0 9000000132400000
> s1 9000000140ec0000 s2 9000000132400000 s3 9000000140ce0000 s4 90000000057f8b88
> s5 9000000140ec0000 s6 9000000140ce4910 s7 0000000000000001 s8 9000000130d45010
> ra: ffff800003191e60 dml21_map_dc_state_into_dml_display_cfg+0x40/0x1140 [amdgpu]
> ERA: ffff800003191eb0 dml21_map_dc_state_into_dml_display_cfg+0x90/0x1140 [amdgpu]
> CRMD: 000000b0 (PLV0 -IE -DA +PG DACF=CC DACM=CC -WE)
> PRMD: 00000004 (PPLV0 +PIE -PWE)
> EUEN: 00000000 (-FPE -SXE -ASXE -BTE)
> ECFG: 00071c1d (LIE=0,2-4,10-12 VS=7)
> ESTAT: 000f0000 [FPD] (IS= ECode=15 EsubCode=0)
> PRID: 0014d010 (Loongson-64bit, Loongson-3C6000/S)
> Process kworker/10:1H (pid: 331, threadinfo=000000007bf9ddb0, task=00000000cc4ab9f3)
> Stack : 0000000100000000 0000043800000780 0000000100000001 0000000100000001
> 0000000000000000 0000078000000000 0000000000000438 0000078000000000
> 0000000000000438 0000078000000000 0000000000000438 0000000100000000
> 0000000100000000 0000000100000000 0000000100000000 0000000100000000
> 0000000000000001 9000000140ec0000 9000000132400000 9000000132400000
> ffff800003408000 ffff800003408000 9000000132400000 9000000140ce0000
> 9000000140ce0000 ffff800003193850 0000000000000001 9000000140ec0000
> 9000000132400000 9000000140ec0860 9000000140ec0738 0000000000000001
> 90000001405e8000 9000000130bc0000 9000000140ec02a8 ffff8000031b5db8
> 0000000000000000 0000043800000780 0000000000000003 ffff8000031b79cc
> ...
> Call Trace:
> [<ffff800003191eb0>] dml21_map_dc_state_into_dml_display_cfg+0x90/0x1140 [amdgpu]
> [<ffff80000319384c>] dml21_validate+0xcc/0x520 [amdgpu]
> [<ffff8000031b8948>] dc_validate_global_state+0x2e8/0x460 [amdgpu]
> [<ffff800002e94034>] create_validate_stream_for_sink+0x3d4/0x420 [amdgpu]
> [<ffff800002e940e4>] amdgpu_dm_connector_mode_valid+0x64/0x240 [amdgpu]
> [<900000000441d6b8>] drm_connector_mode_valid+0x38/0x80
> [<900000000441d824>] __drm_helper_update_and_validate+0x124/0x3e0
> [<900000000441ddc0>] drm_helper_probe_single_connector_modes+0x2e0/0x620
> [<90000000044050dc>] drm_client_modeset_probe+0x23c/0x1780
> [<9000000004420384>] __drm_fb_helper_initial_config_and_unlock+0x44/0x5a0
> [<9000000004403acc>] drm_client_dev_hotplug+0xcc/0x140
> [<ffff800002e9ab50>] handle_hpd_irq_helper+0x1b0/0x1e0 [amdgpu]
> [<90000000038f5da0>] process_one_work+0x160/0x300
> [<90000000038f6718>] worker_thread+0x318/0x440
> [<9000000003901b8c>] kthread+0x12c/0x220
> [<90000000038b1484>] ret_from_kernel_thread+0x8/0xa4
>
> Cc: stable at vger.kernel.org
> Signed-off-by: Huacai Chen <chenhuacai at loongson.cn>
> ---
> .../gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c | 5 ++++-
> .../gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c | 2 ++
> .../gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c | 2 ++
> .../gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c | 5 ++++-
> 4 files changed, 12 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
> index 664302876019..63ef8629d7ed 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn32/dcn32_resource.c
> @@ -1811,10 +1811,13 @@ bool dcn32_validate_bandwidth(struct dc *dc,
> {
> bool out = false;
>
> - if (dc->debug.using_dml2)
> + if (dc->debug.using_dml2) {
> + DC_FP_START();
> out = dml2_validate(dc, context,
> context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
> fast_validate);
> + DC_FP_END();
> + }
> else
> out = dml1_validate(dc, context, fast_validate);
> return out;
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c
> index 8ee3d99ea2aa..0495c8dbcf1e 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn35/dcn35_resource.c
> @@ -1738,9 +1738,11 @@ static bool dcn35_validate_bandwidth(struct dc *dc,
> {
> bool out = false;
>
> + DC_FP_START();
> out = dml2_validate(dc, context,
> context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
> fast_validate);
> + DC_FP_END();
>
> if (fast_validate)
> return out;
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
> index 14f7c3acdc96..aea5acf22b26 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn351/dcn351_resource.c
> @@ -1718,9 +1718,11 @@ static bool dcn351_validate_bandwidth(struct dc *dc,
> {
> bool out = false;
>
> + DC_FP_START();
> out = dml2_validate(dc, context,
> context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
> fast_validate);
> + DC_FP_END();
>
> if (fast_validate)
> return out;
> diff --git a/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c b/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c
> index c1ebc6b1c937..a1815fa59b02 100644
> --- a/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/resource/dcn401/dcn401_resource.c
> @@ -1650,10 +1650,13 @@ bool dcn401_validate_bandwidth(struct dc *dc,
> bool fast_validate)
> {
> bool out = false;
> - if (dc->debug.using_dml2)
> + if (dc->debug.using_dml2) {
> + DC_FP_START();
> out = dml2_validate(dc, context,
> context->power_source == DC_POWER_SOURCE_DC ? context->bw_ctx.dml2_dc_power_source : context->bw_ctx.dml2,
> fast_validate);
> + DC_FP_END();
> + }
> return out;
> }
>
More information about the amd-gfx
mailing list