diff options
Diffstat (limited to 'meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3793-drm-amdgpu-split-the-VM-entity-into-direct-and-delay.patch')
-rw-r--r-- | meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3793-drm-amdgpu-split-the-VM-entity-into-direct-and-delay.patch | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3793-drm-amdgpu-split-the-VM-entity-into-direct-and-delay.patch b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3793-drm-amdgpu-split-the-VM-entity-into-direct-and-delay.patch new file mode 100644 index 00000000..d8fa04aa --- /dev/null +++ b/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.19.8/3793-drm-amdgpu-split-the-VM-entity-into-direct-and-delay.patch @@ -0,0 +1,148 @@ +From ef5c04c3d93475e3e5ab856779f8963adf380f73 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> +Date: Fri, 19 Jul 2019 14:41:12 +0200 +Subject: [PATCH 3793/4256] drm/amdgpu: split the VM entity into direct and + delayed +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +For page fault handling we need to use a direct update which can't be +blocked by ongoing user CS. + +Signed-off-by: Christian König <christian.koenig@amd.com> +Reviewed-by: Felix Kuehling <Felix.Kuehling@amd.com> +--- + drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 6 +++--- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 21 +++++++++++++++------ + drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h | 5 +++-- + drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c | 5 +++-- + 4 files changed, 24 insertions(+), 13 deletions(-) + +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +index cd15540c5622..dfe155566571 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c +@@ -282,7 +282,7 @@ static int amdgpu_vmid_grab_reserved(struct amdgpu_vm *vm, + !dma_fence_is_later(updates, (*id)->flushed_updates)) + updates = NULL; + +- if ((*id)->owner != vm->entity.fence_context || ++ if ((*id)->owner != vm->direct.fence_context || + job->vm_pd_addr != (*id)->pd_gpu_addr || + updates || !(*id)->last_flush || + ((*id)->last_flush->context != fence_context && +@@ -349,7 +349,7 @@ static int amdgpu_vmid_grab_used(struct amdgpu_vm *vm, + struct dma_fence *flushed; + + /* Check all the prerequisites to using this VMID */ +- if ((*id)->owner != vm->entity.fence_context) ++ if ((*id)->owner != vm->direct.fence_context) + continue; + + if ((*id)->pd_gpu_addr != job->vm_pd_addr) +@@ -449,7 +449,7 @@ int amdgpu_vmid_grab(struct amdgpu_vm *vm, struct amdgpu_ring *ring, + } + + id->pd_gpu_addr = job->vm_pd_addr; +- id->owner = vm->entity.fence_context; ++ id->owner = vm->direct.fence_context; + + if (job->vm_needs_flush) { + dma_fence_put(id->last_flush); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +index 6865baac7823..031d5bd3cf27 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +@@ -2654,12 +2654,17 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, + spin_lock_init(&vm->invalidated_lock); + INIT_LIST_HEAD(&vm->freed); + +- /* create scheduler entity for page table updates */ +- r = drm_sched_entity_init(&vm->entity, adev->vm_manager.vm_pte_rqs, ++ /* create scheduler entities for page table updates */ ++ r = drm_sched_entity_init(&vm->direct, adev->vm_manager.vm_pte_rqs, + adev->vm_manager.vm_pte_num_rqs, NULL); + if (r) + return r; + ++ r = drm_sched_entity_init(&vm->delayed, adev->vm_manager.vm_pte_rqs, ++ adev->vm_manager.vm_pte_num_rqs, NULL); ++ if (r) ++ goto error_free_direct; ++ + vm->pte_support_ats = false; + + if (vm_context == AMDGPU_VM_CONTEXT_COMPUTE) { +@@ -2688,7 +2693,7 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, + bp.flags &= ~AMDGPU_GEM_CREATE_SHADOW; + r = amdgpu_bo_create(adev, &bp, &root); + if (r) +- goto error_free_sched_entity; ++ goto error_free_delayed; + + r = amdgpu_bo_reserve(root, true); + if (r) +@@ -2731,8 +2736,11 @@ int amdgpu_vm_init(struct amdgpu_device *adev, struct amdgpu_vm *vm, + amdgpu_bo_unref(&vm->root.base.bo); + vm->root.base.bo = NULL; + +-error_free_sched_entity: +- drm_sched_entity_destroy(&vm->entity); ++error_free_delayed: ++ drm_sched_entity_destroy(&vm->delayed); ++ ++error_free_direct: ++ drm_sched_entity_destroy(&vm->direct); + + return r; + } +@@ -2891,7 +2899,8 @@ void amdgpu_vm_fini(struct amdgpu_device *adev, struct amdgpu_vm *vm) + spin_unlock_irqrestore(&adev->vm_manager.pasid_lock, flags); + } + +- drm_sched_entity_destroy(&vm->entity); ++ drm_sched_entity_destroy(&vm->direct); ++ drm_sched_entity_destroy(&vm->delayed); + + if (!RB_EMPTY_ROOT(&vm->va.rb_root)) { + dev_err(adev->dev, "still active bo inside vm\n"); +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +index 269e55082737..8bb6d0a5c55d 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.h +@@ -257,8 +257,9 @@ struct amdgpu_vm { + struct amdgpu_vm_pt root; + struct dma_fence *last_update; + +- /* Scheduler entity for page table updates */ +- struct drm_sched_entity entity; ++ /* Scheduler entities for page table updates */ ++ struct drm_sched_entity direct; ++ struct drm_sched_entity delayed; + + unsigned int pasid; + /* dedicated to vm */ +diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c +index ddd181f5ed37..d087d6650d79 100644 +--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c ++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm_sdma.c +@@ -99,12 +99,13 @@ static int amdgpu_vm_sdma_commit(struct amdgpu_vm_update_params *p, + struct dma_fence *f; + int r; + +- ring = container_of(p->vm->entity.rq->sched, struct amdgpu_ring, sched); ++ ring = container_of(p->vm->delayed.rq->sched, struct amdgpu_ring, ++ sched); + + WARN_ON(ib->length_dw == 0); + amdgpu_ring_pad_ib(ring, ib); + WARN_ON(ib->length_dw > p->num_dw_left); +- r = amdgpu_job_submit(p->job, &p->vm->entity, ++ r = amdgpu_job_submit(p->job, &p->vm->delayed, + AMDGPU_FENCE_OWNER_VM, &f); + if (r) + goto error; +-- +2.17.1 + |