amdgpu/dc: use kref for dc_state.
authorDave Airlie <airlied@redhat.com>
Tue, 3 Oct 2017 02:39:02 +0000 (12:39 +1000)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 6 Oct 2017 17:10:25 +0000 (13:10 -0400)
I'm not a huge fan of those copying around refcounts bits, might
want to consider alternates, but this should work for now.

Signed-off-by: Dave Airlie <airlied@redhat.com>
Reviewed-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
drivers/gpu/drm/amd/display/dc/core/dc_resource.c
drivers/gpu/drm/amd/display/dc/inc/core_types.h

index d8820d6f79c63ba645b906661b901d9206630290..f41f15faf0195f55be81d226c21866b58a0463b9 100644 (file)
@@ -940,25 +940,25 @@ struct dc_state *dc_create_state(void)
        if (!context)
                return NULL;
 
-       atomic_inc(&context->ref_count);
+       kref_init(&context->refcount);
        return context;
 }
 
 void dc_retain_state(struct dc_state *context)
 {
-       ASSERT(atomic_read(&context->ref_count) > 0);
-       atomic_inc(&context->ref_count);
+       kref_get(&context->refcount);
 }
 
-void dc_release_state(struct dc_state *context)
+static void dc_state_free(struct kref *kref)
 {
-       ASSERT(atomic_read(&context->ref_count) > 0);
-       atomic_dec(&context->ref_count);
+       struct dc_state *context = container_of(kref, struct dc_state, refcount);
+       dc_resource_state_destruct(context);
+       kfree(context);
+}
 
-       if (atomic_read(&context->ref_count) == 0) {
-               dc_resource_state_destruct(context);
-               kfree(context);
-       }
+void dc_release_state(struct dc_state *context)
+{
+       kref_put(&context->refcount, dc_state_free);
 }
 
 static bool is_surface_in_context(
@@ -1520,7 +1520,7 @@ void dc_set_power_state(
        struct dc *dc,
        enum dc_acpi_cm_power_state power_state)
 {
-       atomic_t ref_count;
+       struct kref refcount;
 
        switch (power_state) {
        case DC_ACPI_CM_POWER_STATE_D0:
@@ -1538,12 +1538,12 @@ void dc_set_power_state(
                 */
 
                /* Preserve refcount */
-               ref_count = dc->current_state->ref_count;
+               refcount = dc->current_state->refcount;
                dc_resource_state_destruct(dc->current_state);
                memset(dc->current_state, 0,
                                sizeof(*dc->current_state));
 
-               dc->current_state->ref_count = ref_count;
+               dc->current_state->refcount = refcount;
 
                break;
        }
index 99a4d19f582d9ba5615c9d22a4a647b3e707bbbc..77b3474a7c9e0544d3fb423c1cfb6aab59c3a7c6 100644 (file)
@@ -2432,7 +2432,7 @@ void dc_resource_state_copy_construct(
                struct dc_state *dst_ctx)
 {
        int i, j;
-       atomic_t ref_count = dst_ctx->ref_count;
+       struct kref refcount = dst_ctx->refcount;
 
        *dst_ctx = *src_ctx;
 
@@ -2455,7 +2455,7 @@ void dc_resource_state_copy_construct(
        }
 
        /* context refcount should not be overridden */
-       dst_ctx->ref_count = ref_count;
+       dst_ctx->refcount = refcount;
 
 }
 
index c47ce6b9fc6be2327debbf4f6bccd15d05b3e3fa..ff23f268fe02e595bcbfd1590d4320a935e43502 100644 (file)
@@ -267,7 +267,7 @@ struct dc_state {
 
        struct display_clock *dis_clk;
 
-       atomic_t ref_count;
+       struct kref refcount;
 };
 
 #endif /* _CORE_TYPES_H_ */