drm/amdgpu: Implement BO size validation V2
authorAndrey Grodzovsky <andrey.grodzovsky@amd.com>
Fri, 10 Nov 2017 23:35:56 +0000 (18:35 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 6 Dec 2017 17:47:22 +0000 (12:47 -0500)
Validates BO size against each requested domain's total memory.

v2:
Make GTT size check a MUST to allow fall back to GTT.
Rmove redundant NULL check.

Signed-off-by: Andrey Grodzovsky <andrey.grodzovsky@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/amdgpu/amdgpu_object.c

index a937c49590a978bca01ad2b7b6ff378f5bddf82b..5acf20cfb1d0a5326304dc5c75b14f4b83b3b872 100644 (file)
@@ -281,6 +281,44 @@ void amdgpu_bo_free_kernel(struct amdgpu_bo **bo, u64 *gpu_addr,
                *cpu_addr = NULL;
 }
 
+/* Validate bo size is bit bigger then the request domain */
+static bool amdgpu_bo_validate_size(struct amdgpu_device *adev,
+                                         unsigned long size, u32 domain)
+{
+       struct ttm_mem_type_manager *man = NULL;
+
+       /*
+        * If GTT is part of requested domains the check must succeed to
+        * allow fall back to GTT
+        */
+       if (domain & AMDGPU_GEM_DOMAIN_GTT) {
+               man = &adev->mman.bdev.man[TTM_PL_TT];
+
+               if (size < (man->size << PAGE_SHIFT))
+                       return true;
+               else
+                       goto fail;
+       }
+
+       if (domain & AMDGPU_GEM_DOMAIN_VRAM) {
+               man = &adev->mman.bdev.man[TTM_PL_VRAM];
+
+               if (size < (man->size << PAGE_SHIFT))
+                       return true;
+               else
+                       goto fail;
+       }
+
+
+       /* TODO add more domains checks, such as AMDGPU_GEM_DOMAIN_CPU */
+       return true;
+
+fail:
+       DRM_ERROR("BO size %lu > total memory in domain: %llu\n", size,
+                                             man->size << PAGE_SHIFT);
+       return false;
+}
+
 static int amdgpu_bo_do_create(struct amdgpu_device *adev,
                               unsigned long size, int byte_align,
                               bool kernel, u32 domain, u64 flags,
@@ -299,6 +337,9 @@ static int amdgpu_bo_do_create(struct amdgpu_device *adev,
        page_align = roundup(byte_align, PAGE_SIZE) >> PAGE_SHIFT;
        size = ALIGN(size, PAGE_SIZE);
 
+       if (!amdgpu_bo_validate_size(adev, size, domain))
+               return -ENOMEM;
+
        if (kernel) {
                type = ttm_bo_type_kernel;
        } else if (sg) {