drm/nouveau: sched: fix leaking memory of timedout job
authorDanilo Krummrich <dakr@redhat.com>
Sat, 16 Sep 2023 16:28:31 +0000 (18:28 +0200)
committerDanilo Krummrich <dakr@redhat.com>
Tue, 19 Sep 2023 22:15:50 +0000 (00:15 +0200)
Always stop and re-start the scheduler in order to let the scheduler
free up the timedout job in case it got signaled. In case of exec jobs
the job type specific callback will take care to signal all fences and
tear down the channel.

Fixes: b88baab82871 ("drm/nouveau: implement new VM_BIND uAPI")
Signed-off-by: Danilo Krummrich <dakr@redhat.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230916162835.5719-1-dakr@redhat.com
drivers/gpu/drm/nouveau/nouveau_exec.c
drivers/gpu/drm/nouveau/nouveau_sched.c

index 19024ce21fbbd968de9a26a77c59f23a7586a67b..5dda94e1318c201e6dc0003b1aaf6c600ece3f93 100644 (file)
@@ -213,7 +213,7 @@ nouveau_exec_job_timeout(struct nouveau_job *job)
 
        nouveau_sched_entity_fini(job->entity);
 
-       return DRM_GPU_SCHED_STAT_ENODEV;
+       return DRM_GPU_SCHED_STAT_NOMINAL;
 }
 
 static struct nouveau_job_ops nouveau_exec_job_ops = {
index 88217185e0f388353a247a7bb033c59300f73d2f..3b7ea52212260583ffbdfae77ddd92936d1d00ae 100644 (file)
@@ -375,14 +375,20 @@ nouveau_sched_run_job(struct drm_sched_job *sched_job)
 static enum drm_gpu_sched_stat
 nouveau_sched_timedout_job(struct drm_sched_job *sched_job)
 {
+       struct drm_gpu_scheduler *sched = sched_job->sched;
        struct nouveau_job *job = to_nouveau_job(sched_job);
+       enum drm_gpu_sched_stat stat = DRM_GPU_SCHED_STAT_NOMINAL;
 
-       NV_PRINTK(warn, job->cli, "Job timed out.\n");
+       drm_sched_stop(sched, sched_job);
 
        if (job->ops->timeout)
-               return job->ops->timeout(job);
+               stat = job->ops->timeout(job);
+       else
+               NV_PRINTK(warn, job->cli, "Generic job timeout.\n");
+
+       drm_sched_start(sched, true);
 
-       return DRM_GPU_SCHED_STAT_ENODEV;
+       return stat;
 }
 
 static void