aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-08-21 08:27:51 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-08-24 11:48:42 -0400
commit6af0883ed9770cf9b0a4f224c91481484cd1b025 (patch)
tree4bc4f0e985cd8c4540b20d48b34d265bc108e056
parent2e8f9fbe985e930055eb55323b8491cc668b178f (diff)
drm/amdgpu: discard commands of killed processes
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@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Reviewed-by: Chunming Zhou <david1.zhou@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.c23
1 files 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 38cea6fb25a8..97c94f9683fa 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,
205 struct amd_sched_entity *entity) 205 struct amd_sched_entity *entity)
206{ 206{
207 struct amd_sched_rq *rq = entity->rq; 207 struct amd_sched_rq *rq = entity->rq;
208 int r;
208 209
209 if (!amd_sched_entity_is_initialized(sched, entity)) 210 if (!amd_sched_entity_is_initialized(sched, entity))
210 return; 211 return;
211
212 /** 212 /**
213 * The client will not queue more IBs during this fini, consume existing 213 * The client will not queue more IBs during this fini, consume existing
214 * queued IBs 214 * queued IBs or discard them on SIGKILL
215 */ 215 */
216 wait_event(sched->job_scheduled, amd_sched_entity_is_idle(entity)); 216 if ((current->flags & PF_SIGNALED) && current->exit_code == SIGKILL)
217 217 r = -ERESTARTSYS;
218 else
219 r = wait_event_killable(sched->job_scheduled,
220 amd_sched_entity_is_idle(entity));
218 amd_sched_rq_remove_entity(rq, entity); 221 amd_sched_rq_remove_entity(rq, entity);
222 if (r) {
223 struct amd_sched_job *job;
224
225 /* Park the kernel for a moment to make sure it isn't processing
226 * our enity.
227 */
228 kthread_park(sched->thread);
229 kthread_unpark(sched->thread);
230 while (kfifo_out(&entity->job_queue, &job, sizeof(job)))
231 sched->ops->free_job(job);
232
233 }
219 kfifo_free(&entity->job_queue); 234 kfifo_free(&entity->job_queue);
220} 235}
221 236