aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/amd/scheduler/gpu_scheduler.c')
-rw-r--r--drivers/gpu/drm/amd/scheduler/gpu_scheduler.c42
1 files changed, 15 insertions, 27 deletions
diff --git a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
index 265d3e2f63cc..462c1617d56e 100644
--- a/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/amd/scheduler/gpu_scheduler.c
@@ -282,30 +282,18 @@ int amd_sched_entity_fini(struct amd_gpu_scheduler *sched,
282 * scheduler consum some queued command. 282 * scheduler consum some queued command.
283 * -1 other fail. 283 * -1 other fail.
284*/ 284*/
285int amd_sched_push_job(struct amd_gpu_scheduler *sched, 285int amd_sched_push_job(struct amd_sched_job *sched_job)
286 struct amd_sched_entity *c_entity,
287 void *data,
288 struct amd_sched_fence **fence)
289{ 286{
290 struct amd_sched_job *job; 287 struct amd_sched_fence *fence =
291 288 amd_sched_fence_create(sched_job->s_entity);
292 if (!fence) 289 if (!fence)
293 return -EINVAL; 290 return -EINVAL;
294 job = kzalloc(sizeof(struct amd_sched_job), GFP_KERNEL); 291 fence_get(&fence->base);
295 if (!job) 292 sched_job->s_fence = fence;
296 return -ENOMEM; 293 while (kfifo_in_spinlocked(&sched_job->s_entity->job_queue,
297 job->sched = sched; 294 &sched_job, sizeof(void *),
298 job->s_entity = c_entity; 295 &sched_job->s_entity->queue_lock) !=
299 job->data = data; 296 sizeof(void *)) {
300 *fence = amd_sched_fence_create(c_entity);
301 if ((*fence) == NULL) {
302 kfree(job);
303 return -EINVAL;
304 }
305 fence_get(&(*fence)->base);
306 job->s_fence = *fence;
307 while (kfifo_in_spinlocked(&c_entity->job_queue, &job, sizeof(void *),
308 &c_entity->queue_lock) != sizeof(void *)) {
309 /** 297 /**
310 * Current context used up all its IB slots 298 * Current context used up all its IB slots
311 * wait here, or need to check whether GPU is hung 299 * wait here, or need to check whether GPU is hung
@@ -313,8 +301,8 @@ int amd_sched_push_job(struct amd_gpu_scheduler *sched,
313 schedule(); 301 schedule();
314 } 302 }
315 /* first job wake up scheduler */ 303 /* first job wake up scheduler */
316 if ((kfifo_len(&c_entity->job_queue) / sizeof(void *)) == 1) 304 if ((kfifo_len(&sched_job->s_entity->job_queue) / sizeof(void *)) == 1)
317 wake_up_interruptible(&sched->wait_queue); 305 wake_up_interruptible(&sched_job->sched->wait_queue);
318 return 0; 306 return 0;
319} 307}
320 308
@@ -333,10 +321,8 @@ static void amd_sched_process_job(struct fence *f, struct fence_cb *cb)
333 list_del(&sched_job->list); 321 list_del(&sched_job->list);
334 atomic64_dec(&sched->hw_rq_count); 322 atomic64_dec(&sched->hw_rq_count);
335 spin_unlock_irqrestore(&sched->queue_lock, flags); 323 spin_unlock_irqrestore(&sched->queue_lock, flags);
336
337 sched->ops->process_job(sched, sched_job);
338 fence_put(&sched_job->s_fence->base); 324 fence_put(&sched_job->s_fence->base);
339 kfree(sched_job); 325 sched->ops->process_job(sched, sched_job);
340 wake_up_interruptible(&sched->wait_queue); 326 wake_up_interruptible(&sched->wait_queue);
341} 327}
342 328
@@ -359,7 +345,9 @@ static int amd_sched_main(void *param)
359 r = kfifo_out(&c_entity->job_queue, &job, sizeof(void *)); 345 r = kfifo_out(&c_entity->job_queue, &job, sizeof(void *));
360 if (r != sizeof(void *)) 346 if (r != sizeof(void *))
361 continue; 347 continue;
362 r = sched->ops->prepare_job(sched, c_entity, job); 348 r = 0;
349 if (sched->ops->prepare_job)
350 r = sched->ops->prepare_job(sched, c_entity, job);
363 if (!r) { 351 if (!r) {
364 unsigned long flags; 352 unsigned long flags;
365 spin_lock_irqsave(&sched->queue_lock, flags); 353 spin_lock_irqsave(&sched->queue_lock, flags);