aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
diff options
context:
space:
mode:
authorChristian König <christian.koenig@amd.com>2017-09-12 14:25:14 -0400
committerAlex Deucher <alexander.deucher@amd.com>2017-09-12 14:26:37 -0400
commit3fe89771cb0a65d3b686bcafb5b7e3ebae0ea604 (patch)
treea952951fd0b2b4334eb9616a283b3ce39d26fd02 /drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
parent60de1c1740f390fe48141b54d04cc53a6073d347 (diff)
drm/amdgpu: stop reserving the BO in the MMU callback v3
Instead take the callback lock during the final parts of CS. This should solve the last remaining locking order problems with BO reservations. v2: rebase, make dummy functions static inline v3: add one more missing inline and comments Signed-off-by: Christian König <christian.koenig@amd.com> Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c30
1 files changed, 24 insertions, 6 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
index 4877df83b801..c2310d4eebc8 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
@@ -513,8 +513,11 @@ static int amdgpu_cs_parser_bos(struct amdgpu_cs_parser *p,
513 INIT_LIST_HEAD(&p->validated); 513 INIT_LIST_HEAD(&p->validated);
514 514
515 p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle); 515 p->bo_list = amdgpu_bo_list_get(fpriv, cs->in.bo_list_handle);
516 if (p->bo_list) 516 if (p->bo_list) {
517 amdgpu_bo_list_get_list(p->bo_list, &p->validated); 517 amdgpu_bo_list_get_list(p->bo_list, &p->validated);
518 if (p->bo_list->first_userptr != p->bo_list->num_entries)
519 p->mn = amdgpu_mn_get(p->adev);
520 }
518 521
519 INIT_LIST_HEAD(&duplicates); 522 INIT_LIST_HEAD(&duplicates);
520 amdgpu_vm_get_pd_bo(&fpriv->vm, &p->validated, &p->vm_pd); 523 amdgpu_vm_get_pd_bo(&fpriv->vm, &p->validated, &p->vm_pd);
@@ -722,11 +725,7 @@ static void amdgpu_cs_parser_fini(struct amdgpu_cs_parser *parser, int error,
722{ 725{
723 unsigned i; 726 unsigned i;
724 727
725 if (!error) 728 if (error && backoff)
726 ttm_eu_fence_buffer_objects(&parser->ticket,
727 &parser->validated,
728 parser->fence);
729 else if (backoff)
730 ttm_eu_backoff_reservation(&parser->ticket, 729 ttm_eu_backoff_reservation(&parser->ticket,
731 &parser->validated); 730 &parser->validated);
732 731
@@ -1127,14 +1126,29 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
1127 struct amdgpu_ring *ring = p->job->ring; 1126 struct amdgpu_ring *ring = p->job->ring;
1128 struct amd_sched_entity *entity = &p->ctx->rings[ring->idx].entity; 1127 struct amd_sched_entity *entity = &p->ctx->rings[ring->idx].entity;
1129 struct amdgpu_job *job; 1128 struct amdgpu_job *job;
1129 unsigned i;
1130 int r; 1130 int r;
1131 1131
1132 amdgpu_mn_lock(p->mn);
1133 if (p->bo_list) {
1134 for (i = p->bo_list->first_userptr;
1135 i < p->bo_list->num_entries; ++i) {
1136 struct amdgpu_bo *bo = p->bo_list->array[i].robj;
1137
1138 if (amdgpu_ttm_tt_userptr_needs_pages(bo->tbo.ttm)) {
1139 amdgpu_mn_unlock(p->mn);
1140 return -ERESTARTSYS;
1141 }
1142 }
1143 }
1144
1132 job = p->job; 1145 job = p->job;
1133 p->job = NULL; 1146 p->job = NULL;
1134 1147
1135 r = amd_sched_job_init(&job->base, &ring->sched, entity, p->filp); 1148 r = amd_sched_job_init(&job->base, &ring->sched, entity, p->filp);
1136 if (r) { 1149 if (r) {
1137 amdgpu_job_free(job); 1150 amdgpu_job_free(job);
1151 amdgpu_mn_unlock(p->mn);
1138 return r; 1152 return r;
1139 } 1153 }
1140 1154
@@ -1150,6 +1164,10 @@ static int amdgpu_cs_submit(struct amdgpu_cs_parser *p,
1150 1164
1151 trace_amdgpu_cs_ioctl(job); 1165 trace_amdgpu_cs_ioctl(job);
1152 amd_sched_entity_push_job(&job->base); 1166 amd_sched_entity_push_job(&job->base);
1167
1168 ttm_eu_fence_buffer_objects(&p->ticket, &p->validated, p->fence);
1169 amdgpu_mn_unlock(p->mn);
1170
1153 return 0; 1171 return 0;
1154} 1172}
1155 1173