]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
drm/amd/display: Fix ref_count messed up issue
authorJerry Zuo <Jerry.Zuo@amd.com>
Mon, 25 Sep 2017 20:39:45 +0000 (16:39 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Sat, 21 Oct 2017 20:43:57 +0000 (16:43 -0400)
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@amd.com>
Reviewed-by: Roman Li <Roman.Li@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/dc/core/dc.c

index ffc36f5ac50c035a54aa0df8571ecd8dfef30c15..3439bc46a4a24f231bca593fbff3e80cf250033d 100644 (file)
@@ -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;
 
 }