diff options
Diffstat (limited to 'drivers/gpu/drm/amd/scheduler/gpu_scheduler.c')
-rw-r--r-- | drivers/gpu/drm/amd/scheduler/gpu_scheduler.c | 42 |
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 | */ |
285 | int amd_sched_push_job(struct amd_gpu_scheduler *sched, | 285 | int 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); |