drm/amdgpu: fix amdgpu_bo_unreserve order in GEM_OP IOCTL v2
authorChristian König <christian.koenig@amd.com>
Fri, 28 Aug 2015 15:27:54 +0000 (17:27 +0200)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 2 Sep 2015 16:19:53 +0000 (12:19 -0400)
No copy_(to|from)_user while BO is reserved.

v2: handle default path as well

Signed-off-by: Christian König <christian.koenig@amd.com>
Reviewed-by: Chunming Zhou <david1.zhou@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_gem.c

index 4afc507820c01db355600631e67f98a3e5d4a644..4b36e779622f9459b6556854102a3ec8ebd877aa 100644 (file)
@@ -615,6 +615,7 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
                info.alignment = robj->tbo.mem.page_alignment << PAGE_SHIFT;
                info.domains = robj->initial_domain;
                info.domain_flags = robj->flags;
+               amdgpu_bo_unreserve(robj);
                if (copy_to_user(out, &info, sizeof(info)))
                        r = -EFAULT;
                break;
@@ -622,17 +623,19 @@ int amdgpu_gem_op_ioctl(struct drm_device *dev, void *data,
        case AMDGPU_GEM_OP_SET_PLACEMENT:
                if (amdgpu_ttm_tt_has_userptr(robj->tbo.ttm)) {
                        r = -EPERM;
+                       amdgpu_bo_unreserve(robj);
                        break;
                }
                robj->initial_domain = args->value & (AMDGPU_GEM_DOMAIN_VRAM |
                                                      AMDGPU_GEM_DOMAIN_GTT |
                                                      AMDGPU_GEM_DOMAIN_CPU);
+               amdgpu_bo_unreserve(robj);
                break;
        default:
+               amdgpu_bo_unreserve(robj);
                r = -EINVAL;
        }
 
-       amdgpu_bo_unreserve(robj);
 out:
        drm_gem_object_unreference_unlocked(gobj);
        return r;