diff mbox series

[29/44] drm/amdgpu: reserve fence slot to update page table

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

Commit Message

Felix Kuehling March 22, 2021, 10:58 a.m. UTC
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>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

Comments

Christian König March 22, 2021, 1:32 p.m. UTC | #1
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 mbox series

Patch

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);