diff options
author | Christian König <christian.koenig@amd.com> | 2017-08-21 08:27:51 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2017-08-24 11:48:42 -0400 |
commit | 6af0883ed9770cf9b0a4f224c91481484cd1b025 (patch) | |
tree | 4bc4f0e985cd8c4540b20d48b34d265bc108e056 | |
parent | 2e8f9fbe985e930055eb55323b8491cc668b178f (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.c | 23 |
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 | ||