[PATCH v4 2/3] drm/amd/display: Destroy DC context while keeping DML
Alex Deucher
alexdeucher at gmail.com
Thu Oct 5 14:27:43 UTC 2023
On Wed, Oct 4, 2023 at 1:37 PM Mario Limonciello
<mario.limonciello at amd.com> wrote:
>
> If there is memory pressure at suspend time then dynamically
> allocating a large structure as part of DC suspend code will
> fail.
>
> Instead re-use the same structure and clear all members except
> those that should be maintained.
>
> Link: https://gitlab.freedesktop.org/drm/amd/-/issues/2362
> Signed-off-by: Mario Limonciello <mario.limonciello at amd.com>
> ---
> drivers/gpu/drm/amd/display/dc/core/dc.c | 25 -------------------
> .../gpu/drm/amd/display/dc/core/dc_resource.c | 12 +++++++++
> 2 files changed, 12 insertions(+), 25 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c
> index 39e291a467e2..cb8c7c5a8807 100644
> --- a/drivers/gpu/drm/amd/display/dc/core/dc.c
> +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c
> @@ -4728,9 +4728,6 @@ bool dc_set_power_state(
> struct dc *dc,
> enum dc_acpi_cm_power_state power_state)
> {
> - struct kref refcount;
> - struct display_mode_lib *dml;
> -
> if (!dc->current_state)
> return true;
>
> @@ -4750,30 +4747,8 @@ bool dc_set_power_state(
> break;
> default:
> ASSERT(dc->current_state->stream_count == 0);
> - /* Zero out the current context so that on resume we start with
> - * clean state, and dc hw programming optimizations will not
> - * cause any trouble.
> - */
> - dml = kzalloc(sizeof(struct display_mode_lib),
> - GFP_KERNEL);
> -
> - ASSERT(dml);
> - if (!dml)
> - return false;
> -
> - /* Preserve refcount */
> - refcount = dc->current_state->refcount;
> - /* Preserve display mode lib */
> - memcpy(dml, &dc->current_state->bw_ctx.dml, sizeof(struct display_mode_lib));
>
> dc_resource_state_destruct(dc->current_state);
> - memset(dc->current_state, 0,
> - sizeof(*dc->current_state));
> -
> - dc->current_state->refcount = refcount;
> - dc->current_state->bw_ctx.dml = *dml;
The dml dance seems a bit weird. I guess it's here because
dc_resource_state_destruct() might change it? Can we safely drop
this? If we do need it, we could pre-allocate a dml structure and use
that.
Alex
> -
> - kfree(dml);
>
> break;
> }
> diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> index aa7b5db83644..e487c966c118 100644
> --- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> +++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
> @@ -4350,6 +4350,18 @@ void dc_resource_state_destruct(struct dc_state *context)
> context->streams[i] = NULL;
> }
> context->stream_count = 0;
> + context->stream_mask = 0;
> + memset(&context->res_ctx, 0, sizeof(context->res_ctx));
> + memset(&context->pp_display_cfg, 0, sizeof(context->pp_display_cfg));
> + memset(&context->dcn_bw_vars, 0, sizeof(context->dcn_bw_vars));
> + context->clk_mgr = NULL;
> + memset(&context->bw_ctx.bw, 0, sizeof(context->bw_ctx.bw));
> + memset(context->block_sequence, 0, sizeof(context->block_sequence));
> + context->block_sequence_steps = 0;
> + memset(context->dc_dmub_cmd, 0, sizeof(context->dc_dmub_cmd));
> + context->dmub_cmd_count = 0;
> + memset(&context->perf_params, 0, sizeof(context->perf_params));
> + memset(&context->scratch, 0, sizeof(context->scratch));
> }
>
> void dc_resource_state_copy_construct(
> --
> 2.34.1
>
More information about the amd-gfx
mailing list