On 08/21/2017 07:58 AM, 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. s/enity/entity/ > + */ > + kthread_park(sched->thread); > + kthread_unpark(sched->thread); > + while (kfifo_out(&entity->job_queue, &job, sizeof(job))) > + sched->ops->free_job(job); > + > + } > kfifo_free(&entity->job_queue); > } >