On Thu, Jul 26, 2018 at 01:45:54PM +0200, Christian König wrote: > Note which task is using the entity and only kill it if the last user of > the entity is killed. This should prevent problems when entities are leaked to > child processes. > > Signed-off-by: Christian König <christian.koenig at amd.com> I am not very familiar with scheduler yet. From code logic, it looks fine for me. Reviewed-by: Huang Rui <ray.huang at amd.com> > --- > drivers/gpu/drm/scheduler/gpu_scheduler.c | 6 +++++- > include/drm/gpu_scheduler.h | 1 + > 2 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/scheduler/gpu_scheduler.c b/drivers/gpu/drm/scheduler/gpu_scheduler.c > index 3f2fc5e8242a..f563e4fbb4b6 100644 > --- a/drivers/gpu/drm/scheduler/gpu_scheduler.c > +++ b/drivers/gpu/drm/scheduler/gpu_scheduler.c > @@ -275,6 +275,7 @@ static void drm_sched_entity_kill_jobs_cb(struct dma_fence *f, > long drm_sched_entity_flush(struct drm_sched_entity *entity, long timeout) > { > struct drm_gpu_scheduler *sched; > + struct task_struct *last_user; > long ret = timeout; > > sched = entity->rq->sched; > @@ -295,7 +296,9 @@ long drm_sched_entity_flush(struct drm_sched_entity *entity, long timeout) > > > /* For killed process disable any more IBs enqueue right now */ > - if ((current->flags & PF_EXITING) && (current->exit_code == SIGKILL)) > + last_user = cmpxchg(&entity->last_user, current->group_leader, NULL); > + if ((!last_user || last_user == current->group_leader) && > + (current->flags & PF_EXITING) && (current->exit_code == SIGKILL)) > drm_sched_entity_set_rq(entity, NULL); > > return ret; > @@ -541,6 +544,7 @@ void drm_sched_entity_push_job(struct drm_sched_job *sched_job, > > trace_drm_sched_job(sched_job, entity); > > + WRITE_ONCE(entity->last_user, current->group_leader); > first = spsc_queue_push(&entity->job_queue, &sched_job->queue_node); > > /* first job wakes up scheduler */ > diff --git a/include/drm/gpu_scheduler.h b/include/drm/gpu_scheduler.h > index 091b9afcd184..64016446a103 100644 > --- a/include/drm/gpu_scheduler.h > +++ b/include/drm/gpu_scheduler.h > @@ -85,6 +85,7 @@ struct drm_sched_entity { > struct dma_fence_cb cb; > atomic_t *guilty; > struct dma_fence *last_scheduled; > + struct task_struct *last_user; > }; > > /** > -- > 2.14.1 > > _______________________________________________ > amd-gfx mailing list > amd-gfx at lists.freedesktop.org > https://lists.freedesktop.org/mailman/listinfo/amd-gfx