@@ -129,7 +129,7 @@ void amdgpu_amdkfd_reserve_system_mem(uint64_t size)
129129 *
130130 * Return: returns -ENOMEM in case of error, ZERO otherwise
131131 */
132- static int amdgpu_amdkfd_reserve_mem_limit (struct amdgpu_device * adev ,
132+ int amdgpu_amdkfd_reserve_mem_limit (struct amdgpu_device * adev ,
133133 uint64_t size , u32 alloc_flag )
134134{
135135 uint64_t reserved_for_pt =
@@ -169,7 +169,7 @@ static int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
169169 kfd_mem_limit .max_system_mem_limit && !no_system_mem_limit ) ||
170170 (kfd_mem_limit .ttm_mem_used + ttm_mem_needed >
171171 kfd_mem_limit .max_ttm_mem_limit ) ||
172- (adev -> kfd .vram_used + vram_needed >
172+ (adev && adev -> kfd .vram_used + vram_needed >
173173 adev -> gmc .real_vram_size -
174174 atomic64_read (& adev -> vram_pin_size ) -
175175 reserved_for_pt )) {
@@ -180,7 +180,10 @@ static int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
180180 /* Update memory accounting by decreasing available system
181181 * memory, TTM memory and GPU memory as computed above
182182 */
183- adev -> kfd .vram_used += vram_needed ;
183+ WARN_ONCE (vram_needed && !adev ,
184+ "adev reference can't be null when vram is used" );
185+ if (adev )
186+ adev -> kfd .vram_used += vram_needed ;
184187 kfd_mem_limit .system_mem_used += system_mem_needed ;
185188 kfd_mem_limit .ttm_mem_used += ttm_mem_needed ;
186189
@@ -189,7 +192,7 @@ static int amdgpu_amdkfd_reserve_mem_limit(struct amdgpu_device *adev,
189192 return ret ;
190193}
191194
192- static void unreserve_mem_limit (struct amdgpu_device * adev ,
195+ void amdgpu_amdkfd_unreserve_mem_limit (struct amdgpu_device * adev ,
193196 uint64_t size , u32 alloc_flag )
194197{
195198 spin_lock (& kfd_mem_limit .mem_limit_lock );
@@ -198,7 +201,10 @@ static void unreserve_mem_limit(struct amdgpu_device *adev,
198201 kfd_mem_limit .system_mem_used -= size ;
199202 kfd_mem_limit .ttm_mem_used -= size ;
200203 } else if (alloc_flag & KFD_IOC_ALLOC_MEM_FLAGS_VRAM ) {
201- adev -> kfd .vram_used -= ALIGN (size , VRAM_ALLOCATION_ALIGN );
204+ WARN_ONCE (!adev ,
205+ "adev reference can't be null when alloc mem flags vram is set" );
206+ if (adev )
207+ adev -> kfd .vram_used -= ALIGN (size , VRAM_ALLOCATION_ALIGN );
202208 } else if (alloc_flag & KFD_IOC_ALLOC_MEM_FLAGS_USERPTR ) {
203209 kfd_mem_limit .system_mem_used -= size ;
204210 } else if (!(alloc_flag &
@@ -207,8 +213,7 @@ static void unreserve_mem_limit(struct amdgpu_device *adev,
207213 pr_err ("%s: Invalid BO type %#x\n" , __func__ , alloc_flag );
208214 goto release ;
209215 }
210-
211- WARN_ONCE (adev -> kfd .vram_used < 0 ,
216+ WARN_ONCE (adev && adev -> kfd .vram_used < 0 ,
212217 "KFD VRAM memory accounting unbalanced" );
213218 WARN_ONCE (kfd_mem_limit .ttm_mem_used < 0 ,
214219 "KFD TTM memory accounting unbalanced" );
@@ -225,7 +230,7 @@ void amdgpu_amdkfd_release_notify(struct amdgpu_bo *bo)
225230 u32 alloc_flags = bo -> kfd_bo -> alloc_flags ;
226231 u64 size = amdgpu_bo_size (bo );
227232
228- unreserve_mem_limit (adev , size , alloc_flags );
233+ amdgpu_amdkfd_unreserve_mem_limit (adev , size , alloc_flags );
229234
230235 kfree (bo -> kfd_bo );
231236}
@@ -773,7 +778,6 @@ kfd_mem_attach_dmabuf(struct amdgpu_device *adev, struct kgd_mem *mem,
773778
774779 * bo = gem_to_amdgpu_bo (gobj );
775780 (* bo )-> flags |= AMDGPU_GEM_CREATE_PREEMPTIBLE ;
776- (* bo )-> parent = amdgpu_bo_ref (mem -> bo );
777781
778782 return 0 ;
779783}
@@ -1749,7 +1753,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu(
17491753 /* Don't unreserve system mem limit twice */
17501754 goto err_reserve_limit ;
17511755err_bo_create :
1752- unreserve_mem_limit (adev , size , flags );
1756+ amdgpu_amdkfd_unreserve_mem_limit (adev , size , flags );
17531757err_reserve_limit :
17541758 mutex_destroy (& (* mem )-> lock );
17551759 if (gobj )
@@ -1770,6 +1774,7 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
17701774{
17711775 struct amdkfd_process_info * process_info = mem -> process_info ;
17721776 unsigned long bo_size = mem -> bo -> tbo .base .size ;
1777+ bool use_release_notifier = (mem -> bo -> kfd_bo == mem );
17731778 struct kfd_mem_attachment * entry , * tmp ;
17741779 struct bo_vm_reservation_context ctx ;
17751780 struct ttm_validate_buffer * bo_list_entry ;
@@ -1861,6 +1866,13 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
18611866 */
18621867 drm_gem_object_put (& mem -> bo -> tbo .base );
18631868
1869+ /*
1870+ * For kgd_mem allocated in amdgpu_amdkfd_gpuvm_import_dmabuf(),
1871+ * explicitly free it here.
1872+ */
1873+ if (!use_release_notifier )
1874+ kfree (mem );
1875+
18641876 return ret ;
18651877}
18661878
@@ -2883,3 +2895,22 @@ bool amdgpu_amdkfd_bo_mapped_to_dev(struct amdgpu_device *adev, struct kgd_mem *
28832895 }
28842896 return false;
28852897}
2898+
2899+ #if defined(CONFIG_DEBUG_FS )
2900+
2901+ int kfd_debugfs_kfd_mem_limits (struct seq_file * m , void * data )
2902+ {
2903+
2904+ spin_lock (& kfd_mem_limit .mem_limit_lock );
2905+ seq_printf (m , "System mem used %lldM out of %lluM\n" ,
2906+ (kfd_mem_limit .system_mem_used >> 20 ),
2907+ (kfd_mem_limit .max_system_mem_limit >> 20 ));
2908+ seq_printf (m , "TTM mem used %lldM out of %lluM\n" ,
2909+ (kfd_mem_limit .ttm_mem_used >> 20 ),
2910+ (kfd_mem_limit .max_ttm_mem_limit >> 20 ));
2911+ spin_unlock (& kfd_mem_limit .mem_limit_lock );
2912+
2913+ return 0 ;
2914+ }
2915+
2916+ #endif
0 commit comments