Skip to content

Commit

Permalink
amdgpu/dc: use kref for dc_state.
Browse files Browse the repository at this point in the history
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 <[email protected]>
Reviewed-by: Harry Wentland <[email protected]>
Signed-off-by: Alex Deucher <[email protected]>
  • Loading branch information
airlied authored and alexdeucher committed Oct 6, 2017
1 parent cb56ace commit 8ee5702
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 16 deletions.
26 changes: 13 additions & 13 deletions drivers/gpu/drm/amd/display/dc/core/dc.c
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down Expand Up @@ -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:
Expand All @@ -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;
}
Expand Down
4 changes: 2 additions & 2 deletions drivers/gpu/drm/amd/display/dc/core/dc_resource.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;

}

Expand Down
2 changes: 1 addition & 1 deletion drivers/gpu/drm/amd/display/dc/inc/core_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -267,7 +267,7 @@ struct dc_state {

struct display_clock *dis_clk;

atomic_t ref_count;
struct kref refcount;
};

#endif /* _CORE_TYPES_H_ */

0 comments on commit 8ee5702

Please sign in to comment.