Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 258f3f99 authored by Christian König's avatar Christian König Committed by Alex Deucher
Browse files

drm/amdgpu: move scheduler fence callback into fence v2



And call the processed callback directly after submitting the job.

v2: split adding error handling into separate patch.

Signed-off-by: default avatarChristian König <christian.koenig@amd.com>
Reviewed-by: default avatarChunming Zhou <david1.zhou@amd.com>
Reviewed-by: default avatarJunwei Zhang <Jerry.Zhang@amd.com>
Reviewed-by: default avatarJammy Zhou <Jammy.Zhou@amd.com>
parent 27439fca
Loading
Loading
Loading
Loading
+11 −10
Original line number Diff line number Diff line
@@ -319,15 +319,13 @@ amd_sched_select_job(struct amd_gpu_scheduler *sched)

static void amd_sched_process_job(struct fence *f, struct fence_cb *cb)
{
	struct amd_sched_job *sched_job =
		container_of(cb, struct amd_sched_job, cb);
	struct amd_gpu_scheduler *sched;
	struct amd_sched_fence *s_fence =
		container_of(cb, struct amd_sched_fence, cb);
	struct amd_gpu_scheduler *sched = s_fence->scheduler;

	sched = sched_job->sched;
	amd_sched_fence_signal(sched_job->s_fence);
	atomic_dec(&sched->hw_rq_count);
	fence_put(&sched_job->s_fence->base);
	sched->ops->process_job(sched_job);
	amd_sched_fence_signal(s_fence);
	fence_put(&s_fence->base);
	wake_up_interruptible(&sched->wake_up_worker);
}

@@ -341,6 +339,7 @@ static int amd_sched_main(void *param)

	while (!kthread_should_stop()) {
		struct amd_sched_entity *entity;
		struct amd_sched_fence *s_fence;
		struct amd_sched_job *job;
		struct fence *fence;

@@ -352,19 +351,21 @@ static int amd_sched_main(void *param)
			continue;

		entity = job->s_entity;
		s_fence = job->s_fence;
		atomic_inc(&sched->hw_rq_count);
		fence = sched->ops->run_job(job);
		sched->ops->process_job(job);
		if (fence) {
			r = fence_add_callback(fence, &job->cb,
			r = fence_add_callback(fence, &s_fence->cb,
					       amd_sched_process_job);
			if (r == -ENOENT)
				amd_sched_process_job(fence, &job->cb);
				amd_sched_process_job(fence, &s_fence->cb);
			else if (r)
				DRM_ERROR("fence add callback failed (%d)\n", r);
			fence_put(fence);
		} else {
			DRM_ERROR("Failed to run job!\n");
			amd_sched_process_job(NULL, &job->cb);
			amd_sched_process_job(NULL, &s_fence->cb);
		}

		count = kfifo_out(&entity->job_queue, &job, sizeof(job));
+1 −1
Original line number Diff line number Diff line
@@ -62,13 +62,13 @@ struct amd_sched_rq {

struct amd_sched_fence {
	struct fence                    base;
	struct fence_cb                 cb;
	struct amd_gpu_scheduler	*scheduler;
	spinlock_t			lock;
	void                            *owner;
};

struct amd_sched_job {
	struct fence_cb                 cb;
	struct amd_gpu_scheduler        *sched;
	struct amd_sched_entity         *s_entity;
	struct amd_sched_fence          *s_fence;