Am 22.08.2017 um 04:37 schrieb zhoucm1: > > > On 2017å¹´08æ??21æ?¥ 20:58, Christian König wrote: >> From: Christian König <christian.koenig at amd.com> >> >> When a process is killed we shouldn't submit all waiting jobs, but >> instead >> clean up as fast as possible. >> >> Signed-off-by: Christian König <christian.koenig at amd.com> >> --- >> drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 23 >> +++++++++++++++++++---- >> 1 file changed, 19 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c >> b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c >> index 38cea6f..97c94f9 100644 >> --- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c >> +++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c >> @@ -205,17 +205,32 @@ void amd_sched_entity_fini(struct >> amd_gpu_scheduler *sched, >> struct amd_sched_entity *entity) >> { >> struct amd_sched_rq *rq = entity->rq; >> + int r; >> if (!amd_sched_entity_is_initialized(sched, entity)) >> return; >> - >> /** >> * The client will not queue more IBs during this fini, consume >> existing >> - * queued IBs >> + * queued IBs or discard them on SIGKILL >> */ >> - wait_event(sched->job_scheduled, amd_sched_entity_is_idle(entity)); >> - >> + if ((current->flags & PF_SIGNALED) && current->exit_code == >> SIGKILL) >> + r = -ERESTARTSYS; >> + else >> + r = wait_event_killable(sched->job_scheduled, >> + amd_sched_entity_is_idle(entity)); >> amd_sched_rq_remove_entity(rq, entity); >> + if (r) { >> + struct amd_sched_job *job; >> + >> + /* Park the kernel for a moment to make sure it isn't >> processing >> + * our enity. >> + */ >> + kthread_park(sched->thread); >> + kthread_unpark(sched->thread); > When entity has been removed, how does sched process entity? seems not > need here. > otherwise looks good to me. It's possible that we race here, e.g. we removed the entity but the scheduler is still processing one last job from that entity. Regards, Christian. > > Regards, > David Zhou >> + while (kfifo_out(&entity->job_queue, &job, sizeof(job))) >> + sched->ops->free_job(job); >> + >> + } >> kfifo_free(&entity->job_queue); >> } > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx