[PATCH] drm/amdgpu: discard commands of killed processes

Alex Deucher alexdeucher at gmail.com
Mon Aug 21 19:27:58 UTC 2017


On Mon, Aug 21, 2017 at 8:58 AM, Christian König
<deathsimple at vodafone.de> 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>

Reviewed-by: Alex Deucher <alexander.deucher 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);
> +               while (kfifo_out(&entity->job_queue, &job, sizeof(job)))
> +                       sched->ops->free_job(job);
> +
> +       }
>         kfifo_free(&entity->job_queue);
>  }
>
> --
> 2.7.4
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx


More information about the amd-gfx mailing list