mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-28 11:18:45 +07:00
amdgpu/dc: use kref for dc_state.
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>
This commit is contained in:
parent
cb56aceabd
commit
8ee5702afd
@ -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);
|
||||
}
|
||||
|
||||
static void dc_state_free(struct kref *kref)
|
||||
{
|
||||
struct dc_state *context = container_of(kref, struct dc_state, refcount);
|
||||
dc_resource_state_destruct(context);
|
||||
kfree(context);
|
||||
}
|
||||
|
||||
void dc_release_state(struct dc_state *context)
|
||||
{
|
||||
ASSERT(atomic_read(&context->ref_count) > 0);
|
||||
atomic_dec(&context->ref_count);
|
||||
|
||||
if (atomic_read(&context->ref_count) == 0) {
|
||||
dc_resource_state_destruct(context);
|
||||
kfree(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;
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
|
||||
|
@ -267,7 +267,7 @@ struct dc_state {
|
||||
|
||||
struct display_clock *dis_clk;
|
||||
|
||||
atomic_t ref_count;
|
||||
struct kref refcount;
|
||||
};
|
||||
|
||||
#endif /* _CORE_TYPES_H_ */
|
||||
|
Loading…
Reference in New Issue
Block a user