drm/amdgpu: update ref_cnt before ctx free
authorJames Zhu <James.Zhu@amd.com>
Mon, 15 Aug 2022 21:21:44 +0000 (17:21 -0400)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 9 Jun 2023 13:59:44 +0000 (09:59 -0400)
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>
drivers/gpu/drm/amd/amdgpu/amdgpu_ctx.c
drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.c
drivers/gpu/drm/amd/amdgpu/amdgpu_xcp.h

index 3337574..410acdd 100644 (file)
@@ -266,7 +266,8 @@ error_free_entity:
        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]);
                }
        }
index 78fce5a..9b960ba 100644 (file)
@@ -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);
+       }
+}
+
index cca06d3..39aca87 100644 (file)
@@ -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 && \