mirror of
https://github.com/lkl/linux.git
synced 2025-12-19 16:13:19 +09:00
drm/amdgpu: update ref_cnt before ctx free
Update ref_cnt before ctx free. Signed-off-by: James Zhu <James.Zhu@amd.com> Acked-by: Lijo Lazar <lijo.lazar@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
@@ -266,7 +266,8 @@ error_free_entity:
|
|||||||
return r;
|
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);
|
ktime_t res = ns_to_ktime(0);
|
||||||
int i;
|
int i;
|
||||||
@@ -279,6 +280,8 @@ static ktime_t amdgpu_ctx_fini_entity(struct amdgpu_ctx_entity *entity)
|
|||||||
dma_fence_put(entity->fences[i]);
|
dma_fence_put(entity->fences[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
amdgpu_xcp_release_sched(adev, entity);
|
||||||
|
|
||||||
kfree(entity);
|
kfree(entity);
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
@@ -412,7 +415,7 @@ static void amdgpu_ctx_fini(struct kref *ref)
|
|||||||
for (j = 0; j < AMDGPU_MAX_ENTITY_NUM; ++j) {
|
for (j = 0; j < AMDGPU_MAX_ENTITY_NUM; ++j) {
|
||||||
ktime_t spend;
|
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]);
|
atomic64_add(ktime_to_ns(spend), &mgr->time_spend[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -366,3 +366,19 @@ int amdgpu_xcp_open_device(struct amdgpu_device *adev,
|
|||||||
return 0;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -128,6 +128,8 @@ void amdgpu_xcp_dev_unplug(struct amdgpu_device *adev);
|
|||||||
int amdgpu_xcp_open_device(struct amdgpu_device *adev,
|
int amdgpu_xcp_open_device(struct amdgpu_device *adev,
|
||||||
struct amdgpu_fpriv *fpriv,
|
struct amdgpu_fpriv *fpriv,
|
||||||
struct drm_file *file_priv);
|
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) \
|
#define amdgpu_xcp_select_scheds(adev, e, c, d, x, y) \
|
||||||
((adev)->xcp_mgr && (adev)->xcp_mgr->funcs && \
|
((adev)->xcp_mgr && (adev)->xcp_mgr->funcs && \
|
||||||
|
|||||||
Reference in New Issue
Block a user