When amdgpu_hmm_range_alloc() fails amdgpu_gem_userptr_ioctl() returns
-ENOMEM right away and skips the cleanup every other error path goes
through. The GEM object, the bo->parent reference on the VM root and the
MMU notifier registration are all left behind.

Use release_object here, not user_pages_done, range is still NULL at
this point.

Fixes: e095b55155ef ("drm/amdgpu: use user provided hmm_range buffer in 
amdgpu_ttm_tt_get_user_pages")
Signed-off-by: Perry Yuan <[email protected]>
Reviewed-by: Christian König <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c 
b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
index 0d579517c03c..49080d2d6acb 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c
@@ -576,8 +576,10 @@ int amdgpu_gem_userptr_ioctl(struct drm_device *dev, void 
*data,
 
        if (args->flags & AMDGPU_GEM_USERPTR_VALIDATE) {
                range = amdgpu_hmm_range_alloc(NULL);
-               if (unlikely(!range))
-                       return -ENOMEM;
+               if (unlikely(!range)) {
+                       r = -ENOMEM;
+                       goto release_object;
+               }
                r = amdgpu_ttm_tt_get_user_pages(bo, range);
                if (r) {
                        amdgpu_hmm_range_free(range);
-- 
2.34.1

Reply via email to