On Fri, 2025-04-25 at 11:20 +0100, Tvrtko Ursulin wrote:
> Reduce to one spin_unlock for hopefully a little bit clearer flow in
> the
> function. It may appear that there is a behavioural change with the
> drm_sched_start_timeout_unlocked() now not being called if there were
> initially no jobs on the pending list, and then some appeared after
> unlock, however if the code would rely on the TDR handler restarting
> itself then it would fail to do that if the job arrived on the
> pending
> list after the check.
> 
> Also fix one stale comment while touching the function.

Same here, that's a good candidate for a separate patch / series.

P.

> 
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@igalia.com>
> Cc: Christian König <christian.koe...@amd.com>
> Cc: Danilo Krummrich <d...@kernel.org>
> Cc: Matthew Brost <matthew.br...@intel.com>
> Cc: Philipp Stanner <pha...@kernel.org>
> ---
>  drivers/gpu/drm/scheduler/sched_main.c | 37 +++++++++++++-----------
> --
>  1 file changed, 18 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/scheduler/sched_main.c
> b/drivers/gpu/drm/scheduler/sched_main.c
> index a45b02fd2af3..a26cc11c8ade 100644
> --- a/drivers/gpu/drm/scheduler/sched_main.c
> +++ b/drivers/gpu/drm/scheduler/sched_main.c
> @@ -516,38 +516,37 @@ static void drm_sched_job_begin(struct
> drm_sched_job *s_job)
>  
>  static void drm_sched_job_timedout(struct work_struct *work)
>  {
> -     struct drm_gpu_scheduler *sched;
> +     struct drm_gpu_scheduler *sched =
> +             container_of(work, struct drm_gpu_scheduler,
> work_tdr.work);
> +     enum drm_gpu_sched_stat status;
>       struct drm_sched_job *job;
> -     enum drm_gpu_sched_stat status = DRM_GPU_SCHED_STAT_NOMINAL;
> -
> -     sched = container_of(work, struct drm_gpu_scheduler,
> work_tdr.work);
>  
>       /* Protects against concurrent deletion in
> drm_sched_get_finished_job */
>       spin_lock(&sched->job_list_lock);
>       job = list_first_entry_or_null(&sched->pending_list,
>                                      struct drm_sched_job, list);
> -
>       if (job) {
>               /*
>                * Remove the bad job so it cannot be freed by
> concurrent
> -              * drm_sched_cleanup_jobs. It will be reinserted
> back after sched->thread
> -              * is parked at which point it's safe.
> +              * drm_sched_get_finished_job. It will be reinserted
> back after
> +              * scheduler worker is stopped at which point it's
> safe.
>                */
>               list_del_init(&job->list);
> -             spin_unlock(&sched->job_list_lock);
> +     }
> +     spin_unlock(&sched->job_list_lock);
>  
> -             status = job->sched->ops->timedout_job(job);
> +     if (!job)
> +             return;
>  
> -             /*
> -              * Guilty job did complete and hence needs to be
> manually removed
> -              * See drm_sched_stop doc.
> -              */
> -             if (sched->free_guilty) {
> -                     job->sched->ops->free_job(job);
> -                     sched->free_guilty = false;
> -             }
> -     } else {
> -             spin_unlock(&sched->job_list_lock);
> +     status = job->sched->ops->timedout_job(job);
> +
> +     /*
> +      * Guilty job did complete and hence needs to be manually
> removed. See
> +      * documentation for drm_sched_stop.
> +      */
> +     if (sched->free_guilty) {
> +             job->sched->ops->free_job(job);
> +             sched->free_guilty = false;
>       }
>  
>       if (status != DRM_GPU_SCHED_STAT_ENODEV)

Reply via email to