On 15.07.25 15:50, Lin.Cao wrote: > When application A submits jobs and application B submits a job with a > dependency on A's fence, the normal flow wakes up the scheduler after > processing each job. However, the optimization in > drm_sched_entity_add_dependency_cb() uses a callback that only clears > dependencies without waking up the scheduler. > > When application A is killed before its jobs can run, the callback gets > triggered but only clears the dependency without waking up the scheduler, > causing the scheduler to enter sleep state and application B to hang. > > Remove the optimization by deleting drm_sched_entity_clear_dep() and its > usage, ensuring the scheduler is always woken up when dependencies are > cleared. > > Signed-off-by: Lin.Cao <linca...@amd.com>
Reviewed-by: Christian König <christian.koe...@amd.com> > --- > drivers/gpu/drm/scheduler/sched_entity.c | 21 ++------------------- > 1 file changed, 2 insertions(+), 19 deletions(-) > > diff --git a/drivers/gpu/drm/scheduler/sched_entity.c > b/drivers/gpu/drm/scheduler/sched_entity.c > index e671aa241720..ac678de7fe5e 100644 > --- a/drivers/gpu/drm/scheduler/sched_entity.c > +++ b/drivers/gpu/drm/scheduler/sched_entity.c > @@ -355,17 +355,6 @@ void drm_sched_entity_destroy(struct drm_sched_entity > *entity) > } > EXPORT_SYMBOL(drm_sched_entity_destroy); > > -/* drm_sched_entity_clear_dep - callback to clear the entities dependency */ > -static void drm_sched_entity_clear_dep(struct dma_fence *f, > - struct dma_fence_cb *cb) > -{ > - struct drm_sched_entity *entity = > - container_of(cb, struct drm_sched_entity, cb); > - > - entity->dependency = NULL; > - dma_fence_put(f); > -} > - > /* > * drm_sched_entity_wakeup - callback to clear the entity's dependency and > * wake up the scheduler > @@ -376,7 +365,8 @@ static void drm_sched_entity_wakeup(struct dma_fence *f, > struct drm_sched_entity *entity = > container_of(cb, struct drm_sched_entity, cb); > > - drm_sched_entity_clear_dep(f, cb); > + entity->dependency = NULL; > + dma_fence_put(f); > drm_sched_wakeup(entity->rq->sched); > } > > @@ -429,13 +419,6 @@ static bool drm_sched_entity_add_dependency_cb(struct > drm_sched_entity *entity) > fence = dma_fence_get(&s_fence->scheduled); > dma_fence_put(entity->dependency); > entity->dependency = fence; > - if (!dma_fence_add_callback(fence, &entity->cb, > - drm_sched_entity_clear_dep)) > - return true; > - > - /* Ignore it when it is already scheduled */ > - dma_fence_put(fence); > - return false; > } > > if (!dma_fence_add_callback(entity->dependency, &entity->cb,