Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8ee5702a authored by Dave Airlie's avatar Dave Airlie Committed by Alex Deucher
Browse files

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: default avatarDave Airlie <airlied@redhat.com>
Reviewed-by: default avatarHarry Wentland <harry.wentland@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent cb56acea
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -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);

	if (atomic_read(&context->ref_count) == 0) {
	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)
{
	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;
	}
+2 −2
Original line number Diff line number Diff line
@@ -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;

}

+1 −1
Original line number Diff line number Diff line
@@ -267,7 +267,7 @@ struct dc_state {

	struct display_clock *dis_clk;

	atomic_t ref_count;
	struct kref refcount;
};

#endif /* _CORE_TYPES_H_ */