[PATCH] drm/scheduler: only kill entity if last user is killed

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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


[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux