Commit a4176cb4 authored by Andrey Grodzovsky's avatar Andrey Grodzovsky Committed by Alex Deucher

drm/amdgpu: Remove job->s_entity to avoid keeping reference to stale pointer.

Signed-off-by: default avatarAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Reviewed-by: default avatarChristian König <christian.koenig@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 83f4b118
...@@ -1203,7 +1203,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p, ...@@ -1203,7 +1203,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
amdgpu_ring_priority_get(job->ring, job->base.s_priority); amdgpu_ring_priority_get(job->ring, job->base.s_priority);
trace_amdgpu_cs_ioctl(job); trace_amdgpu_cs_ioctl(job);
amd_sched_entity_push_job(&job->base); amd_sched_entity_push_job(&job->base, entity);
ttm_eu_fence_buffer_objects(&p->ticket, &p->validated, p->fence); ttm_eu_fence_buffer_objects(&p->ticket, &p->validated, p->fence);
amdgpu_mn_unlock(p->mn); amdgpu_mn_unlock(p->mn);
......
...@@ -142,12 +142,13 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring, ...@@ -142,12 +142,13 @@ int amdgpu_job_submit(struct amdgpu_job *job, struct amdgpu_ring *ring,
*f = dma_fence_get(&job->base.s_fence->finished); *f = dma_fence_get(&job->base.s_fence->finished);
amdgpu_job_free_resources(job); amdgpu_job_free_resources(job);
amdgpu_ring_priority_get(job->ring, job->base.s_priority); amdgpu_ring_priority_get(job->ring, job->base.s_priority);
amd_sched_entity_push_job(&job->base); amd_sched_entity_push_job(&job->base, entity);
return 0; return 0;
} }
static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job,
struct amd_sched_entity *s_entity)
{ {
struct amdgpu_job *job = to_amdgpu_job(sched_job); struct amdgpu_job *job = to_amdgpu_job(sched_job);
struct amdgpu_vm *vm = job->vm; struct amdgpu_vm *vm = job->vm;
...@@ -155,7 +156,7 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job) ...@@ -155,7 +156,7 @@ static struct dma_fence *amdgpu_job_dependency(struct amd_sched_job *sched_job)
struct dma_fence *fence = amdgpu_sync_get_fence(&job->dep_sync); struct dma_fence *fence = amdgpu_sync_get_fence(&job->dep_sync);
int r; int r;
if (amd_sched_dependency_optimized(fence, sched_job->s_entity)) { if (amd_sched_dependency_optimized(fence, s_entity)) {
r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence); r = amdgpu_sync_fence(job->adev, &job->sched_sync, fence);
if (r) if (r)
DRM_ERROR("Error adding fence to sync (%d)\n", r); DRM_ERROR("Error adding fence to sync (%d)\n", r);
......
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
#define TRACE_INCLUDE_FILE gpu_sched_trace #define TRACE_INCLUDE_FILE gpu_sched_trace
TRACE_EVENT(amd_sched_job, TRACE_EVENT(amd_sched_job,
TP_PROTO(struct amd_sched_job *sched_job), TP_PROTO(struct amd_sched_job *sched_job, struct amd_sched_entity *entity),
TP_ARGS(sched_job), TP_ARGS(sched_job, entity),
TP_STRUCT__entry( TP_STRUCT__entry(
__field(struct amd_sched_entity *, entity) __field(struct amd_sched_entity *, entity)
__field(struct dma_fence *, fence) __field(struct dma_fence *, fence)
...@@ -25,12 +25,11 @@ TRACE_EVENT(amd_sched_job, ...@@ -25,12 +25,11 @@ TRACE_EVENT(amd_sched_job,
), ),
TP_fast_assign( TP_fast_assign(
__entry->entity = sched_job->s_entity; __entry->entity = entity;
__entry->id = sched_job->id; __entry->id = sched_job->id;
__entry->fence = &sched_job->s_fence->finished; __entry->fence = &sched_job->s_fence->finished;
__entry->name = sched_job->sched->name; __entry->name = sched_job->sched->name;
__entry->job_count = spsc_queue_count( __entry->job_count = spsc_queue_count(&entity->job_queue);
&sched_job->s_entity->job_queue);
__entry->hw_job_count = atomic_read( __entry->hw_job_count = atomic_read(
&sched_job->sched->hw_rq_count); &sched_job->sched->hw_rq_count);
), ),
......
...@@ -341,11 +341,10 @@ amd_sched_entity_pop_job(struct amd_sched_entity *entity) ...@@ -341,11 +341,10 @@ amd_sched_entity_pop_job(struct amd_sched_entity *entity)
if (!sched_job) if (!sched_job)
return NULL; return NULL;
while ((entity->dependency = sched->ops->dependency(sched_job))) while ((entity->dependency = sched->ops->dependency(sched_job, entity)))
if (amd_sched_entity_add_dependency_cb(entity)) if (amd_sched_entity_add_dependency_cb(entity))
return NULL; return NULL;
sched_job->s_entity = NULL;
spsc_queue_pop(&entity->job_queue); spsc_queue_pop(&entity->job_queue);
return sched_job; return sched_job;
} }
...@@ -357,13 +356,13 @@ amd_sched_entity_pop_job(struct amd_sched_entity *entity) ...@@ -357,13 +356,13 @@ amd_sched_entity_pop_job(struct amd_sched_entity *entity)
* *
* Returns 0 for success, negative error code otherwise. * Returns 0 for success, negative error code otherwise.
*/ */
void amd_sched_entity_push_job(struct amd_sched_job *sched_job) void amd_sched_entity_push_job(struct amd_sched_job *sched_job,
struct amd_sched_entity *entity)
{ {
struct amd_gpu_scheduler *sched = sched_job->sched; struct amd_gpu_scheduler *sched = sched_job->sched;
struct amd_sched_entity *entity = sched_job->s_entity;
bool first = false; bool first = false;
trace_amd_sched_job(sched_job); trace_amd_sched_job(sched_job, entity);
spin_lock(&entity->queue_lock); spin_lock(&entity->queue_lock);
first = spsc_queue_push(&entity->job_queue, &sched_job->queue_node); first = spsc_queue_push(&entity->job_queue, &sched_job->queue_node);
...@@ -442,11 +441,12 @@ static void amd_sched_job_timedout(struct work_struct *work) ...@@ -442,11 +441,12 @@ static void amd_sched_job_timedout(struct work_struct *work)
job->sched->ops->timedout_job(job); job->sched->ops->timedout_job(job);
} }
static void amd_sched_set_guilty(struct amd_sched_job *s_job) static void amd_sched_set_guilty(struct amd_sched_job *s_job,
struct amd_sched_entity *s_entity)
{ {
if (atomic_inc_return(&s_job->karma) > s_job->sched->hang_limit) if (atomic_inc_return(&s_job->karma) > s_job->sched->hang_limit)
if (s_job->s_entity->guilty) if (s_entity->guilty)
atomic_set(s_job->s_entity->guilty, 1); atomic_set(s_entity->guilty, 1);
} }
void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched, struct amd_sched_job *bad) void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched, struct amd_sched_job *bad)
...@@ -477,7 +477,7 @@ void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched, struct amd_sched_jo ...@@ -477,7 +477,7 @@ void amd_sched_hw_job_reset(struct amd_gpu_scheduler *sched, struct amd_sched_jo
list_for_each_entry_safe(entity, tmp, &rq->entities, list) { list_for_each_entry_safe(entity, tmp, &rq->entities, list) {
if (bad->s_fence->scheduled.context == entity->fence_context) { if (bad->s_fence->scheduled.context == entity->fence_context) {
found = true; found = true;
amd_sched_set_guilty(bad); amd_sched_set_guilty(bad, entity);
break; break;
} }
} }
...@@ -541,7 +541,6 @@ int amd_sched_job_init(struct amd_sched_job *job, ...@@ -541,7 +541,6 @@ int amd_sched_job_init(struct amd_sched_job *job,
void *owner) void *owner)
{ {
job->sched = sched; job->sched = sched;
job->s_entity = entity;
job->s_priority = entity->rq - sched->sched_rq; job->s_priority = entity->rq - sched->sched_rq;
job->s_fence = amd_sched_fence_create(entity, owner); job->s_fence = amd_sched_fence_create(entity, owner);
if (!job->s_fence) if (!job->s_fence)
......
...@@ -91,7 +91,6 @@ struct amd_sched_fence { ...@@ -91,7 +91,6 @@ struct amd_sched_fence {
struct amd_sched_job { struct amd_sched_job {
struct spsc_node queue_node; struct spsc_node queue_node;
struct amd_gpu_scheduler *sched; struct amd_gpu_scheduler *sched;
struct amd_sched_entity *s_entity;
struct amd_sched_fence *s_fence; struct amd_sched_fence *s_fence;
struct dma_fence_cb finish_cb; struct dma_fence_cb finish_cb;
struct work_struct finish_work; struct work_struct finish_work;
...@@ -125,7 +124,8 @@ static inline bool amd_sched_invalidate_job(struct amd_sched_job *s_job, int thr ...@@ -125,7 +124,8 @@ static inline bool amd_sched_invalidate_job(struct amd_sched_job *s_job, int thr
* these functions should be implemented in driver side * these functions should be implemented in driver side
*/ */
struct amd_sched_backend_ops { struct amd_sched_backend_ops {
struct dma_fence *(*dependency)(struct amd_sched_job *sched_job); struct dma_fence *(*dependency)(struct amd_sched_job *sched_job,
struct amd_sched_entity *s_entity);
struct dma_fence *(*run_job)(struct amd_sched_job *sched_job); struct dma_fence *(*run_job)(struct amd_sched_job *sched_job);
void (*timedout_job)(struct amd_sched_job *sched_job); void (*timedout_job)(struct amd_sched_job *sched_job);
void (*free_job)(struct amd_sched_job *sched_job); void (*free_job)(struct amd_sched_job *sched_job);
...@@ -161,7 +161,8 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched, ...@@ -161,7 +161,8 @@ int amd_sched_entity_init(struct amd_gpu_scheduler *sched,
uint32_t jobs, atomic_t* guilty); uint32_t jobs, atomic_t* guilty);
void amd_sched_entity_fini(struct amd_gpu_scheduler *sched, void amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
struct amd_sched_entity *entity); struct amd_sched_entity *entity);
void amd_sched_entity_push_job(struct amd_sched_job *sched_job); void amd_sched_entity_push_job(struct amd_sched_job *sched_job,
struct amd_sched_entity *entity);
void amd_sched_entity_set_rq(struct amd_sched_entity *entity, void amd_sched_entity_set_rq(struct amd_sched_entity *entity,
struct amd_sched_rq *rq); struct amd_sched_rq *rq);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment