diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c | 20 | 
1 files changed, 11 insertions, 9 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c index a52a084158b1..af91627b19b0 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c @@ -28,6 +28,7 @@  #include <linux/file.h>  #include <linux/pagemap.h>  #include <linux/sync_file.h> +#include <linux/dma-buf.h>  #include <drm/amdgpu_drm.h>  #include <drm/drm_syncobj.h> @@ -415,7 +416,9 @@ static int amdgpu_cs_bo_validate(struct amdgpu_cs_parser *p,  	/* Don't move this buffer if we have depleted our allowance  	 * to move it. Don't move anything if the threshold is zero.  	 */ -	if (p->bytes_moved < p->bytes_moved_threshold) { +	if (p->bytes_moved < p->bytes_moved_threshold && +	    (!bo->tbo.base.dma_buf || +	    list_empty(&bo->tbo.base.dma_buf->attachments))) {  		if (!amdgpu_gmc_vram_full_visible(&adev->gmc) &&  		    (bo->flags & AMDGPU_GEM_CREATE_CPU_ACCESS_REQUIRED)) {  			/* And don't move a CPU_ACCESS_REQUIRED BO to limited @@ -651,16 +654,19 @@ out:  static int amdgpu_cs_sync_rings(struct amdgpu_cs_parser *p)  { +	struct amdgpu_fpriv *fpriv = p->filp->driver_priv;  	struct amdgpu_bo_list_entry *e;  	int r;  	list_for_each_entry(e, &p->validated, tv.head) {  		struct amdgpu_bo *bo = ttm_to_amdgpu_bo(e->tv.bo);  		struct dma_resv *resv = bo->tbo.base.resv; +		enum amdgpu_sync_mode sync_mode; -		r = amdgpu_sync_resv(p->adev, &p->job->sync, resv, p->filp, -				     amdgpu_bo_explicit_sync(bo)); - +		sync_mode = amdgpu_bo_explicit_sync(bo) ? +			AMDGPU_SYNC_EXPLICIT : AMDGPU_SYNC_NE_OWNER; +		r = amdgpu_sync_resv(p->adev, &p->job->sync, resv, sync_mode, +				     &fpriv->vm);  		if (r)  			return r;  	} @@ -1202,7 +1208,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,  	struct amdgpu_fpriv *fpriv = p->filp->driver_priv;  	struct drm_sched_entity *entity = p->entity;  	enum drm_sched_priority priority; -	struct amdgpu_ring *ring;  	struct amdgpu_bo_list_entry *e;  	struct amdgpu_job *job;  	uint64_t seq; @@ -1211,7 +1216,7 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,  	job = p->job;  	p->job = NULL; -	r = drm_sched_job_init(&job->base, entity, p->filp); +	r = drm_sched_job_init(&job->base, entity, &fpriv->vm);  	if (r)  		goto error_unlock; @@ -1255,9 +1260,6 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,  	priority = job->base.s_priority;  	drm_sched_entity_push_job(&job->base, entity); -	ring = to_amdgpu_ring(entity->rq->sched); -	amdgpu_ring_priority_get(ring, priority); -  	amdgpu_vm_move_to_lru_tail(p->adev, &fpriv->vm);  	ttm_eu_fence_buffer_objects(&p->ticket, &p->validated, p->fence);  |