RE: [PATCH] drm/amdgpu: unmap and remove csa_va properly

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[Public]

Ping. Hi Christian, what do you think?

Regards,
Lang

>-----Original Message-----
>From: Yu, Lang <Lang.Yu@xxxxxxx>
>Sent: Saturday, May 6, 2023 3:03 PM
>To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx
>Cc: Liu, Monk <Monk.Liu@xxxxxxx>; Koenig, Christian
><Christian.Koenig@xxxxxxx>; Yu, Lang <Lang.Yu@xxxxxxx>
>Subject: [PATCH] drm/amdgpu: unmap and remove csa_va properly
>
>Root PD BO should be reserved before unmap and remove a bo_va from VM
>otherwise lockdep will complain.
>
>[14616.936827] WARNING: CPU: 6 PID: 1711 at
>drivers/gpu/drm/amd/amdgpu/amdgpu_vm.c:1762
>amdgpu_vm_bo_del+0x399/0x3f0 [amdgpu] [14616.937096] Call Trace:
>[14616.937097]  <TASK>
>[14616.937102]  amdgpu_driver_postclose_kms+0x249/0x2f0 [amdgpu]
>[14616.937187]  drm_file_free+0x1d6/0x300 [drm] [14616.937207]
>drm_close_helper.isra.0+0x62/0x70 [drm] [14616.937220]
>drm_release+0x5e/0x100 [drm] [14616.937234]  __fput+0x9f/0x280
>[14616.937239]  ____fput+0xe/0x20 [14616.937241]
>task_work_run+0x61/0x90 [14616.937246]
>exit_to_user_mode_prepare+0x215/0x220
>[14616.937251]  syscall_exit_to_user_mode+0x2a/0x60
>[14616.937254]  do_syscall_64+0x48/0x90
>[14616.937257]  entry_SYSCALL_64_after_hwframe+0x63/0xcd
>
>Signed-off-by: Lang Yu <Lang.Yu@xxxxxxx>
>---
> drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c | 38
>+++++++++++++++++++++++++
>drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h |  3 ++
>drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c |  9 +++---
> 3 files changed, 45 insertions(+), 5 deletions(-)
>
>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
>b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
>index c6d4d41c4393..23d054526e7c 100644
>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.c
>@@ -106,3 +106,41 @@ int amdgpu_map_static_csa(struct amdgpu_device
>*adev, struct amdgpu_vm *vm,
>       ttm_eu_backoff_reservation(&ticket, &list);
>       return 0;
> }
>+
>+int amdgpu_unmap_static_csa(struct amdgpu_device *adev, struct
>amdgpu_vm *vm,
>+                          struct amdgpu_bo *bo, struct amdgpu_bo_va
>*bo_va,
>+                          uint64_t csa_addr)
>+{
>+      struct ww_acquire_ctx ticket;
>+      struct list_head list;
>+      struct amdgpu_bo_list_entry pd;
>+      struct ttm_validate_buffer csa_tv;
>+      int r;
>+
>+      INIT_LIST_HEAD(&list);
>+      INIT_LIST_HEAD(&csa_tv.head);
>+      csa_tv.bo = &bo->tbo;
>+      csa_tv.num_shared = 1;
>+
>+      list_add(&csa_tv.head, &list);
>+      amdgpu_vm_get_pd_bo(vm, &list, &pd);
>+
>+      r = ttm_eu_reserve_buffers(&ticket, &list, true, NULL);
>+      if (r) {
>+              DRM_ERROR("failed to reserve CSA,PD BOs: err=%d\n", r);
>+              return r;
>+      }
>+
>+      r = amdgpu_vm_bo_unmap(adev, bo_va, csa_addr);
>+      if (r) {
>+              DRM_ERROR("failed to do bo_unmap on static CSA,
>err=%d\n", r);
>+              ttm_eu_backoff_reservation(&ticket, &list);
>+              return r;
>+      }
>+
>+      amdgpu_vm_bo_del(adev, bo_va);
>+
>+      ttm_eu_backoff_reservation(&ticket, &list);
>+
>+      return 0;
>+}
>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h
>b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h
>index 524b4437a021..7dfc1f2012eb 100644
>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h
>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_csa.h
>@@ -34,6 +34,9 @@ int amdgpu_allocate_static_csa(struct amdgpu_device
>*adev, struct amdgpu_bo **bo  int amdgpu_map_static_csa(struct
>amdgpu_device *adev, struct amdgpu_vm *vm,
>                         struct amdgpu_bo *bo, struct amdgpu_bo_va
>**bo_va,
>                         uint64_t csa_addr, uint32_t size);
>+int amdgpu_unmap_static_csa(struct amdgpu_device *adev, struct
>amdgpu_vm *vm,
>+                          struct amdgpu_bo *bo, struct amdgpu_bo_va
>*bo_va,
>+                          uint64_t csa_addr);
> void amdgpu_free_static_csa(struct amdgpu_bo **bo);
>
> #endif
>diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>index 1d3b224b8b28..6b47ac3eb40d 100644
>--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
>@@ -1307,11 +1307,10 @@ void amdgpu_driver_postclose_kms(struct
>drm_device *dev,
>               amdgpu_vce_free_handles(adev, file_priv);
>
>       if (amdgpu_mcbp) {
>-              /* TODO: how to handle reserve failure */
>-              BUG_ON(amdgpu_bo_reserve(adev->virt.csa_obj, true));
>-              amdgpu_vm_bo_del(adev, fpriv->csa_va);
>-              fpriv->csa_va = NULL;
>-              amdgpu_bo_unreserve(adev->virt.csa_obj);
>+              uint64_t csa_addr = amdgpu_csa_vaddr(adev) &
>AMDGPU_GMC_HOLE_MASK;
>+
>+              WARN_ON(amdgpu_unmap_static_csa(adev, &fpriv->vm,
>adev->virt.csa_obj,
>+                                              fpriv->csa_va, csa_addr));
>       }
>
>       pasid = fpriv->vm.pasid;
>--
>2.25.1





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux