aboutsummaryrefslogtreecommitdiffstats
path: root/amdgpu
diff options
context:
space:
mode:
authorJammy Zhou2015-05-12 12:14:11 -0500
committerAlex Deucher2015-08-05 12:47:49 -0500
commit241cf6d1051718a481c61b469171a34c0ca718a4 (patch)
treec48cadc94b9b0286e859ba38068a408abc689fe3 /amdgpu
parentdb126d1d8a764b9d3ad322779b13904867b14e5c (diff)
downloadexternal-libdrm-241cf6d1051718a481c61b469171a34c0ca718a4.tar.gz
external-libdrm-241cf6d1051718a481c61b469171a34c0ca718a4.tar.xz
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')
-rw-r--r--amdgpu/amdgpu_bo.c20
-rw-r--r--amdgpu/amdgpu_internal.h3
-rw-r--r--amdgpu/amdgpu_vamgr.c7
3 files changed, 29 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,
121 121
122 memset(&va, 0, sizeof(va)); 122 memset(&va, 0, sizeof(va));
123 123
124 bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, alloc_buffer->alloc_size, alloc_buffer->phys_alignment); 124 bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr,
125 alloc_buffer->alloc_size,
126 alloc_buffer->phys_alignment);
127
128 if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) {
129 amdgpu_bo_free_internal(bo);
130 return -ENOSPC;
131 }
125 132
126 va.in.handle = bo->handle; 133 va.in.handle = bo->handle;
127 va.in.operation = AMDGPU_VA_OP_MAP; 134 va.in.operation = AMDGPU_VA_OP_MAP;
@@ -440,6 +447,12 @@ int amdgpu_bo_import(amdgpu_device_handle dev,
440 447
441 bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, bo->alloc_size, 1 << 20); 448 bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, bo->alloc_size, 1 << 20);
442 449
450 if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) {
451 pthread_mutex_unlock(&dev->bo_table_mutex);
452 amdgpu_bo_reference(&bo, NULL);
453 return -ENOSPC;
454 }
455
443 memset(&va, 0, sizeof(va)); 456 memset(&va, 0, sizeof(va));
444 va.in.handle = bo->handle; 457 va.in.handle = bo->handle;
445 va.in.operation = AMDGPU_VA_OP_MAP; 458 va.in.operation = AMDGPU_VA_OP_MAP;
@@ -615,6 +628,11 @@ int amdgpu_create_bo_from_user_mem(amdgpu_device_handle dev,
615 bo->handle = args.handle; 628 bo->handle = args.handle;
616 bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, size, 4 * 1024); 629 bo->virtual_mc_base_address = amdgpu_vamgr_find_va(&dev->vamgr, size, 4 * 1024);
617 630
631 if (bo->virtual_mc_base_address == AMDGPU_INVALID_VA_ADDRESS) {
632 amdgpu_bo_free_internal(bo);
633 return -ENOSPC;
634 }
635
618 memset(&va, 0, sizeof(va)); 636 memset(&va, 0, sizeof(va));
619 va.in.handle = bo->handle; 637 va.in.handle = bo->handle;
620 va.in.operation = AMDGPU_VA_OP_MAP; 638 va.in.operation = AMDGPU_VA_OP_MAP;
diff --git a/amdgpu/amdgpu_internal.h b/amdgpu/amdgpu_internal.h
index cc911c5b..7910d340 100644
--- a/amdgpu/amdgpu_internal.h
+++ b/amdgpu/amdgpu_internal.h
@@ -40,6 +40,8 @@
40#define ROUND_UP(x, y) ((((x)-1) | __round_mask(x, y))+1) 40#define ROUND_UP(x, y) ((((x)-1) | __round_mask(x, y))+1)
41#define ROUND_DOWN(x, y) ((x) & ~__round_mask(x, y)) 41#define ROUND_DOWN(x, y) ((x) & ~__round_mask(x, y))
42 42
43#define AMDGPU_INVALID_VA_ADDRESS 0xffffffffffffffff
44
43struct amdgpu_bo_va_hole { 45struct amdgpu_bo_va_hole {
44 struct list_head list; 46 struct list_head list;
45 uint64_t offset; 47 uint64_t offset;
@@ -49,6 +51,7 @@ struct amdgpu_bo_va_hole {
49struct amdgpu_bo_va_mgr { 51struct amdgpu_bo_va_mgr {
50 /* the start virtual address */ 52 /* the start virtual address */
51 uint64_t va_offset; 53 uint64_t va_offset;
54 uint64_t va_max;
52 struct list_head va_holes; 55 struct list_head va_holes;
53 pthread_mutex_t bo_va_mutex; 56 pthread_mutex_t bo_va_mutex;
54 uint32_t va_alignment; 57 uint32_t va_alignment;
diff --git a/amdgpu/amdgpu_vamgr.c b/amdgpu/amdgpu_vamgr.c
index 23359122..070ecc47 100644
--- a/amdgpu/amdgpu_vamgr.c
+++ b/amdgpu/amdgpu_vamgr.c
@@ -33,6 +33,7 @@ void amdgpu_vamgr_init(struct amdgpu_device *dev)
33 struct amdgpu_bo_va_mgr *vamgr = &dev->vamgr; 33 struct amdgpu_bo_va_mgr *vamgr = &dev->vamgr;
34 34
35 vamgr->va_offset = dev->dev_info.virtual_address_offset; 35 vamgr->va_offset = dev->dev_info.virtual_address_offset;
36 vamgr->va_max = dev->dev_info.virtual_address_max;
36 vamgr->va_alignment = dev->dev_info.virtual_address_alignment; 37 vamgr->va_alignment = dev->dev_info.virtual_address_alignment;
37 38
38 list_inithead(&vamgr->va_holes); 39 list_inithead(&vamgr->va_holes);
@@ -89,6 +90,12 @@ uint64_t amdgpu_vamgr_find_va(struct amdgpu_bo_va_mgr *mgr,
89 offset = mgr->va_offset; 90 offset = mgr->va_offset;
90 waste = offset % alignment; 91 waste = offset % alignment;
91 waste = waste ? alignment - waste : 0; 92 waste = waste ? alignment - waste : 0;
93
94 if (offset + waste + size > mgr->va_max) {
95 pthread_mutex_unlock(&mgr->bo_va_mutex);
96 return AMDGPU_INVALID_VA_ADDRESS;
97 }
98
92 if (waste) { 99 if (waste) {
93 n = calloc(1, sizeof(struct amdgpu_bo_va_hole)); 100 n = calloc(1, sizeof(struct amdgpu_bo_va_hole));
94 n->size = waste; 101 n->size = waste;