Blob Blame History Raw
From: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Date: Tue, 20 Dec 2016 18:01:30 -0500
Subject: drm/amd/display: Add refcount debug assert
Git-commit: db96c69ee78845c4f4cadea9fd282fb265253874
Patch-mainline: v4.15-rc1
References: FATE#326289 FATE#326079 FATE#326049 FATE#322398 FATE#326166

Signed-off-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Signed-off-by: Jordan Lazare <Jordan.Lazare@amd.com>
Signed-off-by: Tony Cheng <tony.cheng@amd.com>
Reviewed-by: Andrey Grodzovsky <Andrey.Grodzovsky@amd.com>
Reviewed-by: Jordan Lazare <Jordan.Lazare@amd.com>
Acked-by: Harry Wentland <Harry.Wentland@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Acked-by: Petr Tesarik <ptesarik@suse.com>
---
 drivers/gpu/drm/amd/display/dc/core/dc_sink.c    |    5 +++--
 drivers/gpu/drm/amd/display/dc/core/dc_stream.c  |    5 ++++-
 drivers/gpu/drm/amd/display/dc/core/dc_surface.c |   14 +++++++++++---
 drivers/gpu/drm/amd/display/dc/core/dc_target.c  |    4 +++-
 4 files changed, 21 insertions(+), 7 deletions(-)

--- a/drivers/gpu/drm/amd/display/dc/core/dc_sink.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_sink.c
@@ -71,6 +71,7 @@ void dc_sink_retain(const struct dc_sink
 {
 	struct sink *sink = DC_SINK_TO_SINK(dc_sink);
 
+	ASSERT(sink->ref_count > 0);
 	++sink->ref_count;
 }
 
@@ -78,6 +79,7 @@ void dc_sink_release(const struct dc_sin
 {
 	struct sink *sink = DC_SINK_TO_SINK(dc_sink);
 
+	ASSERT(sink->ref_count > 0);
 	--sink->ref_count;
 
 	if (sink->ref_count == 0) {
@@ -96,8 +98,7 @@ struct dc_sink *dc_sink_create(const str
 	if (false == construct(sink, init_params))
 		goto construct_fail;
 
-	/* TODO should we move this outside to where the assignment actually happens? */
-	dc_sink_retain(&sink->protected.public);
+	++sink->ref_count;
 
 	return &sink->protected.public;
 
--- a/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_stream.c
@@ -99,6 +99,8 @@ static void destruct(struct core_stream
 void dc_stream_retain(const struct dc_stream *dc_stream)
 {
 	struct stream *stream = DC_STREAM_TO_STREAM(dc_stream);
+
+	ASSERT(stream->ref_count > 0);
 	stream->ref_count++;
 }
 
@@ -108,6 +110,7 @@ void dc_stream_release(const struct dc_s
 	struct core_stream *protected = DC_STREAM_TO_CORE(public);
 
 	if (public != NULL) {
+		ASSERT(stream->ref_count > 0);
 		stream->ref_count--;
 
 		if (stream->ref_count == 0) {
@@ -134,7 +137,7 @@ struct dc_stream *dc_create_stream_for_s
 	if (false == construct(&stream->protected, dc_sink))
 			goto construct_fail;
 
-	dc_stream_retain(&stream->protected.public);
+	stream->ref_count++;
 
 	return &stream->protected.public;
 
--- a/drivers/gpu/drm/amd/display/dc/core/dc_surface.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_surface.c
@@ -105,7 +105,7 @@ struct dc_surface *dc_create_surface(con
 	if (false == construct(core_dc->ctx, surface))
 		goto construct_fail;
 
-	dc_surface_retain(&surface->protected.public);
+	++surface->ref_count;
 
 	return &surface->protected.public;
 
@@ -162,6 +162,7 @@ void dc_surface_retain(const struct dc_s
 {
 	struct surface *surface = DC_SURFACE_TO_SURFACE(dc_surface);
 
+	ASSERT(surface->ref_count > 0);
 	++surface->ref_count;
 }
 
@@ -169,6 +170,7 @@ void dc_surface_release(const struct dc_
 {
 	struct surface *surface = DC_SURFACE_TO_SURFACE(dc_surface);
 
+	ASSERT(surface->ref_count > 0);
 	--surface->ref_count;
 
 	if (surface->ref_count == 0) {
@@ -181,12 +183,15 @@ void dc_gamma_retain(const struct dc_gam
 {
 	struct gamma *gamma = DC_GAMMA_TO_GAMMA(dc_gamma);
 
+	ASSERT(gamma->ref_count > 0);
 	++gamma->ref_count;
 }
 
 void dc_gamma_release(const struct dc_gamma *dc_gamma)
 {
 	struct gamma *gamma = DC_GAMMA_TO_GAMMA(dc_gamma);
+
+	ASSERT(gamma->ref_count > 0);
 	--gamma->ref_count;
 
 	if (gamma->ref_count == 0)
@@ -200,7 +205,7 @@ struct dc_gamma *dc_create_gamma()
 	if (gamma == NULL)
 		goto alloc_fail;
 
-	dc_gamma_retain(&gamma->protected.public);
+	++gamma->ref_count;
 
 	return &gamma->protected.public;
 
@@ -212,12 +217,15 @@ void dc_transfer_func_retain(const struc
 {
 	struct transfer_func *tf = DC_TRANSFER_FUNC_TO_TRANSFER_FUNC(dc_tf);
 
+	ASSERT(tf->ref_count > 0);
 	++tf->ref_count;
 }
 
 void dc_transfer_func_release(const struct dc_transfer_func *dc_tf)
 {
 	struct transfer_func *tf = DC_TRANSFER_FUNC_TO_TRANSFER_FUNC(dc_tf);
+
+	ASSERT(tf->ref_count > 0);
 	--tf->ref_count;
 
 	if (tf->ref_count == 0)
@@ -231,7 +239,7 @@ struct dc_transfer_func *dc_create_trans
 	if (tf == NULL)
 		goto alloc_fail;
 
-	dc_transfer_func_retain(&tf->protected.public);
+	++tf->ref_count;
 
 	return &tf->protected.public;
 
--- a/drivers/gpu/drm/amd/display/dc/core/dc_target.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_target.c
@@ -71,6 +71,7 @@ void dc_target_retain(const struct dc_ta
 {
 	struct target *target = DC_TARGET_TO_TARGET(dc_target);
 
+	ASSERT(target->ref_count > 0);
 	target->ref_count++;
 }
 
@@ -81,6 +82,7 @@ void dc_target_release(const struct dc_t
 
 	ASSERT(target->ref_count > 0);
 	target->ref_count--;
+
 	if (target->ref_count == 0) {
 		destruct(protected);
 		dm_free(target);
@@ -120,7 +122,7 @@ struct dc_target *dc_create_target_for_s
 
 	construct(&target->protected, stream->ctx, dc_streams, stream_count);
 
-	dc_target_retain(&target->protected.public);
+	target->ref_count++;
 
 	return &target->protected.public;