Am 2021-11-29 um 2:14 p.m. schrieb Philip Yang: > drm_gem_object_put calls release_notify callback to free the mem > structure and unreserve_mem_limit, move it down after the last access > of mem and make it conditional call. > > Signed-off-by: Philip Yang <Philip.Yang@xxxxxxx> Reviewed-by: Felix Kuehling <Felix.Kuehling@xxxxxxx> > --- > drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > index c5362c23e687..5df89a295177 100644 > --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c > @@ -1460,7 +1460,7 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( > struct sg_table *sg = NULL; > uint64_t user_addr = 0; > struct amdgpu_bo *bo; > - struct drm_gem_object *gobj; > + struct drm_gem_object *gobj = NULL; > u32 domain, alloc_domain; > u64 alloc_flags; > int ret; > @@ -1582,14 +1582,16 @@ int amdgpu_amdkfd_gpuvm_alloc_memory_of_gpu( > err_pin_bo: > drm_vma_node_revoke(&gobj->vma_node, drm_priv); > err_node_allow: > - drm_gem_object_put(gobj); > /* Don't unreserve system mem limit twice */ > goto err_reserve_limit; > err_bo_create: > unreserve_mem_limit(adev, size, flags); > err_reserve_limit: > mutex_destroy(&(*mem)->lock); > - kfree(*mem); > + if (gobj) > + drm_gem_object_put(gobj); > + else > + kfree(*mem); > err: > if (sg) { > sg_free_table(sg);