aboutsummaryrefslogtreecommitdiffstats
path: root/amdgpu/amdgpu_bo.c
diff options
context:
space:
mode:
authorJammy Zhou <Jammy.Zhou@amd.com>2015-05-13 01:14:11 +0800
committerAlex Deucher <alexander.deucher@amd.com>2015-08-05 13:47:49 -0400
commit241cf6d1051718a481c61b469171a34c0ca718a4 (patch)
treec48cadc94b9b0286e859ba38068a408abc689fe3 /amdgpu/amdgpu_bo.c
parentdb126d1d8a764b9d3ad322779b13904867b14e5c (diff)
downloadexternal_libdrm-241cf6d1051718a481c61b469171a34c0ca718a4.tar.gz
external_libdrm-241cf6d1051718a481c61b469171a34c0ca718a4.tar.bz2
external_libdrm-241cf6d1051718a481c61b469171a34c0ca718a4.zip
amdgpu: validate the upper limit of virtual address v2
Only 8GB virtual address space is used by default now v2: use -ENOSPC for the error case Signed-off-by: Jammy Zhou <Jammy.Zhou@amd.com>
Diffstat (limited to 'amdgpu/amdgpu_bo.c')
-rw-r--r--amdgpu/amdgpu_bo.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/amdgpu/amdgpu_bo.c b/amdgpu/amdgpu_bo.c
index 587c1d08..d78bb9a8 100644
--- a/amdgpu/amdgpu_bo.c
+++ b/amdgpu/amdgpu_bo.c
@@ -121,7 +121,14 @@ int amdgpu_bo_alloc(amdgpu_device_handle dev,
memset(&va, 0, sizeof(va));
- bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, alloc_buffer->alloc_size, alloc_buffer->phys_alignment);
+ bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr,
+ alloc_buffer->alloc_size,
+ alloc_buffer->phys_alignment);
+
+ if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) {
+ amdgpu_bo_free_internal(bo);
+ return -ENOSPC;
+ }
va.in.handle = bo->handle;
va.in.operation = AMDGPU_VA_OP_MAP;
@@ -440,6 +447,12 @@ int amdgpu_bo_import(amdgpu_device_handle dev,
bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, bo->alloc_size, 1 << 20);
+ if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) {
+ pthread_mutex_unlock(&dev->bo_table_mutex);
+ amdgpu_bo_reference(&bo, NULL);
+ return -ENOSPC;
+ }
+
memset(&va, 0, sizeof(va));
va.in.handle = bo->handle;
va.in.operation = AMDGPU_VA_OP_MAP;
@@ -615,6 +628,11 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
bo->handle = args.handle;
bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, size, 4 * 1024);
+ if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) {
+ amdgpu_bo_free_internal(bo);
+ return -ENOSPC;
+ }
+
memset(&va, 0, sizeof(va));
va.in.handle = bo->handle;
va.in.operation = AMDGPU_VA_OP_MAP;