Message ID | 20210322105900.14068-30-Felix.Kuehling@amd.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add HMM-based SVM memory manager to KFD v2 | expand |
Am 22.03.21 um 11:58 schrieb Felix Kuehling: > From: Philip Yang <Philip.Yang@amd.com> > > Forgot to reserve a fence slot to use sdma to update page table, cause > below kernel BUG backtrace to handle vm retry fault while application is > exiting. > > [ 133.048143] kernel BUG at /home/yangp/git/compute_staging/kernel/drivers/dma-buf/dma-resv.c:281! > [ 133.048487] Workqueue: events amdgpu_irq_handle_ih1 [amdgpu] > [ 133.048506] RIP: 0010:dma_resv_add_shared_fence+0x204/0x280 > [ 133.048672] amdgpu_vm_sdma_commit+0x134/0x220 [amdgpu] > [ 133.048788] amdgpu_vm_bo_update_range+0x220/0x250 [amdgpu] > [ 133.048905] amdgpu_vm_handle_fault+0x202/0x370 [amdgpu] > [ 133.049031] gmc_v9_0_process_interrupt+0x1ab/0x310 [amdgpu] > [ 133.049165] ? kgd2kfd_interrupt+0x9a/0x180 [amdgpu] > [ 133.049289] ? amdgpu_irq_dispatch+0xb6/0x240 [amdgpu] > [ 133.049408] amdgpu_irq_dispatch+0xb6/0x240 [amdgpu] > [ 133.049534] amdgpu_ih_process+0x9b/0x1c0 [amdgpu] > [ 133.049657] amdgpu_irq_handle_ih1+0x21/0x60 [amdgpu] > [ 133.049669] process_one_work+0x29f/0x640 > [ 133.049678] worker_thread+0x39/0x3f0 > [ 133.049685] ? process_one_work+0x640/0x640 > > Signed-off-by: Philip Yang <Philip.Yang@amd.com> > Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com> Reviewed-by: Christian König <christian.koenig@amd.com> I'm going to push this to amd-staging-drm-next since it is really an independent bug fix. Christian. > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > index a61df234f012..3e32f76cd7bb 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c > @@ -3302,7 +3302,7 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, > struct amdgpu_bo *root; > uint64_t value, flags; > struct amdgpu_vm *vm; > - long r; > + int r; > bool is_compute_context = false; > > spin_lock(&adev->vm_manager.pasid_lock); > @@ -3360,6 +3360,12 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, > value = 0; > } > > + r = dma_resv_reserve_shared(root->tbo.base.resv, 1); > + if (r) { > + pr_debug("failed %d to reserve fence slot\n", r); > + goto error_unlock; > + } > + > r = amdgpu_vm_bo_update_mapping(adev, adev, vm, true, false, NULL, addr, > addr, flags, value, NULL, NULL, > NULL); > @@ -3371,7 +3377,7 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, > error_unlock: > amdgpu_bo_unreserve(root); > if (r < 0) > - DRM_ERROR("Can't handle page fault (%ld)\n", r); > + DRM_ERROR("Can't handle page fault (%d)\n", r); > > error_unref: > amdgpu_bo_unref(&root);
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c index a61df234f012..3e32f76cd7bb 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c @@ -3302,7 +3302,7 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, struct amdgpu_bo *root; uint64_t value, flags; struct amdgpu_vm *vm; - long r; + int r; bool is_compute_context = false; spin_lock(&adev->vm_manager.pasid_lock); @@ -3360,6 +3360,12 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, value = 0; } + r = dma_resv_reserve_shared(root->tbo.base.resv, 1); + if (r) { + pr_debug("failed %d to reserve fence slot\n", r); + goto error_unlock; + } + r = amdgpu_vm_bo_update_mapping(adev, adev, vm, true, false, NULL, addr, addr, flags, value, NULL, NULL, NULL); @@ -3371,7 +3377,7 @@ bool amdgpu_vm_handle_fault(struct amdgpu_device *adev, u32 pasid, error_unlock: amdgpu_bo_unreserve(root); if (r < 0) - DRM_ERROR("Can't handle page fault (%ld)\n", r); + DRM_ERROR("Can't handle page fault (%d)\n", r); error_unref: amdgpu_bo_unref(&root);