Commit 3e7c6fe3 authored by James Zhu's avatar James Zhu Committed by Alex Deucher
Browse files

drm/amdgpu: update ref_cnt before ctx free



Update ref_cnt before ctx free.

Signed-off-by: default avatarJames Zhu <James.Zhu@amd.com>
Acked-by: default avatarLijo Lazar <lijo.lazar@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 9a18292d
Loading
Loading
Loading
Loading
+5 −2
Original line number Diff line number Diff line
@@ -266,7 +266,8 @@ static int amdgpu_ctx_init_entity(struct amdgpu_ctx *ctx, u32 hw_ip,
	return r;
}

static ktime_t amdgpu_ctx_fini_entity(struct amdgpu_ctx_entity *entity)
static ktime_t amdgpu_ctx_fini_entity(struct amdgpu_device *adev,
				  struct amdgpu_ctx_entity *entity)
{
	ktime_t res = ns_to_ktime(0);
	int i;
@@ -279,6 +280,8 @@ static ktime_t amdgpu_ctx_fini_entity(struct amdgpu_ctx_entity *entity)
		dma_fence_put(entity->fences[i]);
	}

	amdgpu_xcp_release_sched(adev, entity);

	kfree(entity);
	return res;
}
@@ -412,7 +415,7 @@ static void amdgpu_ctx_fini(struct kref *ref)
		for (j = 0; j < AMDGPU_MAX_ENTITY_NUM; ++j) {
			ktime_t spend;

			spend = amdgpu_ctx_fini_entity(ctx->entities[i][j]);
			spend = amdgpu_ctx_fini_entity(adev, ctx->entities[i][j]);
			atomic64_add(ktime_to_ns(spend), &mgr->time_spend[i]);
		}
	}
+16 −0
Original line number Diff line number Diff line
@@ -366,3 +366,19 @@ int amdgpu_xcp_open_device(struct amdgpu_device *adev,
	return 0;
}

void amdgpu_xcp_release_sched(struct amdgpu_device *adev,
				  struct amdgpu_ctx_entity *entity)
{
	struct drm_gpu_scheduler *sched;
	struct amdgpu_ring *ring;

	if (!adev->xcp_mgr)
		return;

	sched = entity->entity.rq->sched;
	if (sched->ready) {
		ring = to_amdgpu_ring(entity->entity.rq->sched);
		atomic_dec(&adev->xcp_mgr->xcp[ring->xcp_id].ref_cnt);
	}
}
+2 −0
Original line number Diff line number Diff line
@@ -128,6 +128,8 @@ void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev);
int amdgpu_xcp_open_device(struct amdgpu_device *adev,
			   struct amdgpu_fpriv *fpriv,
			   struct drm_file *file_priv);
void amdgpu_xcp_release_sched(struct amdgpu_device *adev,
			      struct amdgpu_ctx_entity *entity);

#define amdgpu_xcp_select_scheds(adev, e, c, d, x, y) \
	((adev)->xcp_mgr && (adev)->xcp_mgr->funcs && \