From: Jerry Zuo <Jerry.Zuo@xxxxxxx> In the full update type, need to add ref_count to the newly created dc_state->stream. It made mistake to add ref_count to dc->current_state->stream which keeps adding up without release. Signed-off-by: Jerry Zuo <Jerry.Zuo at amd.com> Reviewed-by: Roman Li <Roman.Li at amd.com> Acked-by: Harry Wentland <Harry.Wentland at amd.com> --- drivers/gpu/drm/amd/display/dc/core/dc.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/amd/display/dc/core/dc.c b/drivers/gpu/drm/amd/display/dc/core/dc.c index ffc36f5ac50c..3439bc46a4a2 100644 --- a/drivers/gpu/drm/amd/display/dc/core/dc.c +++ b/drivers/gpu/drm/amd/display/dc/core/dc.c @@ -1322,6 +1322,7 @@ void dc_commit_updates_for_stream(struct dc *dc, const struct dc_stream_status *stream_status; enum surface_update_type update_type; struct dc_state *context; + struct dc_context *dc_ctx = dc->ctx; int i; stream_status = dc_stream_get_status(stream); @@ -1334,8 +1335,17 @@ void dc_commit_updates_for_stream(struct dc *dc, update_surface_trace(dc, srf_updates, surface_count); - if (update_type >= UPDATE_TYPE_FULL) + if (update_type >= UPDATE_TYPE_FULL) { + + /* initialize scratch memory for building context */ + context = dc_create_state(); + if (context == NULL) { + DC_ERROR("Failed to allocate new validate context!\n"); + return; + } + dc_resource_state_copy_construct(state, context); + } for (i = 0; i < surface_count; i++) { @@ -1361,6 +1371,15 @@ void dc_commit_updates_for_stream(struct dc *dc, dc_post_update_surfaces_to_stream(dc); + if (dc->current_state != context) { + + struct dc_state *old = dc->current_state; + + dc->current_state = context; + dc_release_state(old); + + } + return; } -- 2.14.1