mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	drm/amdgpu: use scheduler dependencies for CS
Entirely remove the sync obj in the job. Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Luben Tuikov <luben.tuikov@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20221014084641.128280-11-christian.koenig@amd.com
This commit is contained in:
		
							parent
							
								
									46e0270c71
								
							
						
					
					
						commit
						1728baa7e4
					
				
					 4 changed files with 13 additions and 20 deletions
				
			
		| 
						 | 
					@ -426,7 +426,7 @@ static int amdgpu_cs_p2_dependencies(struct amdgpu_cs_parser *p,
 | 
				
			||||||
			dma_fence_put(old);
 | 
								dma_fence_put(old);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		r = amdgpu_sync_fence(&p->gang_leader->sync, fence);
 | 
							r = amdgpu_sync_fence(&p->sync, fence);
 | 
				
			||||||
		dma_fence_put(fence);
 | 
							dma_fence_put(fence);
 | 
				
			||||||
		if (r)
 | 
							if (r)
 | 
				
			||||||
			return r;
 | 
								return r;
 | 
				
			||||||
| 
						 | 
					@ -448,7 +448,7 @@ static int amdgpu_syncobj_lookup_and_add(struct amdgpu_cs_parser *p,
 | 
				
			||||||
		return r;
 | 
							return r;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = amdgpu_sync_fence(&p->gang_leader->sync, fence);
 | 
						r = amdgpu_sync_fence(&p->sync, fence);
 | 
				
			||||||
	if (r)
 | 
						if (r)
 | 
				
			||||||
		goto error;
 | 
							goto error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1108,7 +1108,7 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
 | 
				
			||||||
	if (r)
 | 
						if (r)
 | 
				
			||||||
		return r;
 | 
							return r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = amdgpu_sync_fence(&job->sync, fpriv->prt_va->last_pt_update);
 | 
						r = amdgpu_sync_fence(&p->sync, fpriv->prt_va->last_pt_update);
 | 
				
			||||||
	if (r)
 | 
						if (r)
 | 
				
			||||||
		return r;
 | 
							return r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1119,7 +1119,7 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
 | 
				
			||||||
		if (r)
 | 
							if (r)
 | 
				
			||||||
			return r;
 | 
								return r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		r = amdgpu_sync_fence(&job->sync, bo_va->last_pt_update);
 | 
							r = amdgpu_sync_fence(&p->sync, bo_va->last_pt_update);
 | 
				
			||||||
		if (r)
 | 
							if (r)
 | 
				
			||||||
			return r;
 | 
								return r;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1138,7 +1138,7 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
 | 
				
			||||||
		if (r)
 | 
							if (r)
 | 
				
			||||||
			return r;
 | 
								return r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		r = amdgpu_sync_fence(&job->sync, bo_va->last_pt_update);
 | 
							r = amdgpu_sync_fence(&p->sync, bo_va->last_pt_update);
 | 
				
			||||||
		if (r)
 | 
							if (r)
 | 
				
			||||||
			return r;
 | 
								return r;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1151,7 +1151,7 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
 | 
				
			||||||
	if (r)
 | 
						if (r)
 | 
				
			||||||
		return r;
 | 
							return r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	r = amdgpu_sync_fence(&job->sync, vm->last_update);
 | 
						r = amdgpu_sync_fence(&p->sync, vm->last_update);
 | 
				
			||||||
	if (r)
 | 
						if (r)
 | 
				
			||||||
		return r;
 | 
							return r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1183,7 +1183,6 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
 | 
				
			||||||
static int amdgpu_cs_sync_rings(struct amdgpu_cs_parser *p)
 | 
					static int amdgpu_cs_sync_rings(struct amdgpu_cs_parser *p)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
 | 
						struct amdgpu_fpriv *fpriv = p->filp->driver_priv;
 | 
				
			||||||
	struct amdgpu_job *leader = p->gang_leader;
 | 
					 | 
				
			||||||
	struct amdgpu_bo_list_entry *e;
 | 
						struct amdgpu_bo_list_entry *e;
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
	int r;
 | 
						int r;
 | 
				
			||||||
| 
						 | 
					@ -1195,14 +1194,14 @@ static int amdgpu_cs_sync_rings(struct amdgpu_cs_parser *p)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		sync_mode = amdgpu_bo_explicit_sync(bo) ?
 | 
							sync_mode = amdgpu_bo_explicit_sync(bo) ?
 | 
				
			||||||
			AMDGPU_SYNC_EXPLICIT : AMDGPU_SYNC_NE_OWNER;
 | 
								AMDGPU_SYNC_EXPLICIT : AMDGPU_SYNC_NE_OWNER;
 | 
				
			||||||
		r = amdgpu_sync_resv(p->adev, &leader->sync, resv, sync_mode,
 | 
							r = amdgpu_sync_resv(p->adev, &p->sync, resv, sync_mode,
 | 
				
			||||||
				     &fpriv->vm);
 | 
									     &fpriv->vm);
 | 
				
			||||||
		if (r)
 | 
							if (r)
 | 
				
			||||||
			return r;
 | 
								return r;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < p->gang_size - 1; ++i) {
 | 
						for (i = 0; i < p->gang_size; ++i) {
 | 
				
			||||||
		r = amdgpu_sync_clone(&leader->sync, &p->jobs[i]->sync);
 | 
							r = amdgpu_sync_push_to_job(&p->sync, p->jobs[i]);
 | 
				
			||||||
		if (r)
 | 
							if (r)
 | 
				
			||||||
			return r;
 | 
								return r;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -1248,7 +1247,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
 | 
				
			||||||
		struct dma_fence *fence;
 | 
							struct dma_fence *fence;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		fence = &p->jobs[i]->base.s_fence->scheduled;
 | 
							fence = &p->jobs[i]->base.s_fence->scheduled;
 | 
				
			||||||
		r = amdgpu_sync_fence(&leader->sync, fence);
 | 
							r = drm_sched_job_add_dependency(&leader->base, fence);
 | 
				
			||||||
		if (r)
 | 
							if (r)
 | 
				
			||||||
			goto error_cleanup;
 | 
								goto error_cleanup;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -75,6 +75,8 @@ struct amdgpu_cs_parser {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	unsigned			num_post_deps;
 | 
						unsigned			num_post_deps;
 | 
				
			||||||
	struct amdgpu_cs_post_dep	*post_deps;
 | 
						struct amdgpu_cs_post_dep	*post_deps;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct amdgpu_sync		sync;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
 | 
					int amdgpu_cs_find_mapping(struct amdgpu_cs_parser *parser,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -107,7 +107,6 @@ int amdgpu_job_alloc(struct amdgpu_device *adev, struct amdgpu_vm *vm,
 | 
				
			||||||
	(*job)->base.sched = &adev->rings[0]->sched;
 | 
						(*job)->base.sched = &adev->rings[0]->sched;
 | 
				
			||||||
	(*job)->vm = vm;
 | 
						(*job)->vm = vm;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	amdgpu_sync_create(&(*job)->sync);
 | 
					 | 
				
			||||||
	amdgpu_sync_create(&(*job)->explicit_sync);
 | 
						amdgpu_sync_create(&(*job)->explicit_sync);
 | 
				
			||||||
	(*job)->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
 | 
						(*job)->vram_lost_counter = atomic_read(&adev->vram_lost_counter);
 | 
				
			||||||
	(*job)->vm_pd_addr = AMDGPU_BO_INVALID_OFFSET;
 | 
						(*job)->vm_pd_addr = AMDGPU_BO_INVALID_OFFSET;
 | 
				
			||||||
| 
						 | 
					@ -175,9 +174,7 @@ static void amdgpu_job_free_cb(struct drm_sched_job *s_job)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	drm_sched_job_cleanup(s_job);
 | 
						drm_sched_job_cleanup(s_job);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	amdgpu_sync_free(&job->sync);
 | 
					 | 
				
			||||||
	amdgpu_sync_free(&job->explicit_sync);
 | 
						amdgpu_sync_free(&job->explicit_sync);
 | 
				
			||||||
 | 
					 | 
				
			||||||
	dma_fence_put(&job->hw_fence);
 | 
						dma_fence_put(&job->hw_fence);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -203,7 +200,6 @@ void amdgpu_job_free(struct amdgpu_job *job)
 | 
				
			||||||
		drm_sched_job_cleanup(&job->base);
 | 
							drm_sched_job_cleanup(&job->base);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	amdgpu_job_free_resources(job);
 | 
						amdgpu_job_free_resources(job);
 | 
				
			||||||
	amdgpu_sync_free(&job->sync);
 | 
					 | 
				
			||||||
	amdgpu_sync_free(&job->explicit_sync);
 | 
						amdgpu_sync_free(&job->explicit_sync);
 | 
				
			||||||
	if (job->gang_submit != &job->base.s_fence->scheduled)
 | 
						if (job->gang_submit != &job->base.s_fence->scheduled)
 | 
				
			||||||
		dma_fence_put(job->gang_submit);
 | 
							dma_fence_put(job->gang_submit);
 | 
				
			||||||
| 
						 | 
					@ -247,10 +243,9 @@ amdgpu_job_dependency(struct drm_sched_job *sched_job,
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct amdgpu_ring *ring = to_amdgpu_ring(s_entity->rq->sched);
 | 
						struct amdgpu_ring *ring = to_amdgpu_ring(s_entity->rq->sched);
 | 
				
			||||||
	struct amdgpu_job *job = to_amdgpu_job(sched_job);
 | 
						struct amdgpu_job *job = to_amdgpu_job(sched_job);
 | 
				
			||||||
	struct dma_fence *fence;
 | 
						struct dma_fence *fence = NULL;
 | 
				
			||||||
	int r;
 | 
						int r;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	fence = amdgpu_sync_get_fence(&job->sync);
 | 
					 | 
				
			||||||
	while (!fence && job->vm && !job->vmid) {
 | 
						while (!fence && job->vm && !job->vmid) {
 | 
				
			||||||
		r = amdgpu_vmid_grab(job->vm, ring, job, &fence);
 | 
							r = amdgpu_vmid_grab(job->vm, ring, job, &fence);
 | 
				
			||||||
		if (r)
 | 
							if (r)
 | 
				
			||||||
| 
						 | 
					@ -274,8 +269,6 @@ static struct dma_fence *amdgpu_job_run(struct drm_sched_job *sched_job)
 | 
				
			||||||
	job = to_amdgpu_job(sched_job);
 | 
						job = to_amdgpu_job(sched_job);
 | 
				
			||||||
	finished = &job->base.s_fence->finished;
 | 
						finished = &job->base.s_fence->finished;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	BUG_ON(amdgpu_sync_peek_fence(&job->sync, NULL));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	trace_amdgpu_sched_run_job(job);
 | 
						trace_amdgpu_sched_run_job(job);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Skip job if VRAM is lost and never resubmit gangs */
 | 
						/* Skip job if VRAM is lost and never resubmit gangs */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -47,7 +47,6 @@ enum amdgpu_ib_pool_type;
 | 
				
			||||||
struct amdgpu_job {
 | 
					struct amdgpu_job {
 | 
				
			||||||
	struct drm_sched_job    base;
 | 
						struct drm_sched_job    base;
 | 
				
			||||||
	struct amdgpu_vm	*vm;
 | 
						struct amdgpu_vm	*vm;
 | 
				
			||||||
	struct amdgpu_sync	sync;
 | 
					 | 
				
			||||||
	struct amdgpu_sync	explicit_sync;
 | 
						struct amdgpu_sync	explicit_sync;
 | 
				
			||||||
	struct dma_fence	hw_fence;
 | 
						struct dma_fence	hw_fence;
 | 
				
			||||||
	struct dma_fence	*gang_submit;
 | 
						struct dma_fence	*gang_submit;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue