1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
|
From 3f86e7d5fc64822e35dec1db86d12be69c68a2bb Mon Sep 17 00:00:00 2001
From: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
Date: Mon, 27 Jun 2016 18:00:13 -0400
Subject: [PATCH 1513/4131] drm/amdkgd: Keep kgd_mem validation list in
amdkfd_vm
For KFD memory eviction / restore, all the KFD process BOs needs to be
atomically reserved. So keep the list of kgd_mem in amdkfd_vm readily
available.
Change-Id: Ice91c2d481f934f76b7d2de42606df744db94b7d
Signed-off-by: Harish Kasiviswanathan <Harish.Kasiviswanathan@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h | 1 +
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 31 +++++++++++++++++++++++-
2 files changed, 31 insertions(+), 1 deletion(-)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
index c0fdf52..1ee31f9 100755
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd.h
@@ -53,6 +53,7 @@ struct kgd_mem {
struct mutex lock;
struct amdgpu_bo *bo;
struct list_head bo_va_list;
+ struct amdgpu_bo_list_entry bo_list_entry;
uint32_t domain;
unsigned int mapped_to_gpu_memory;
void *kptr;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index edf1a6a..60bbcfe 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -290,6 +290,21 @@ static int amdgpu_amdkfd_gpuvm_clear_bo(struct amdgpu_device *adev,
return r;
}
+static void add_kgd_mem_to_kfd_bo_list(struct kgd_mem *mem,
+ struct amdkfd_vm *kfd_vm)
+{
+ struct amdgpu_bo_list_entry *entry = &mem->data2.bo_list_entry;
+ struct amdgpu_bo *bo = mem->data2.bo;
+
+ entry->robj = bo;
+ INIT_LIST_HEAD(&entry->tv.head);
+ entry->tv.shared = true;
+ entry->tv.bo = &bo->tbo;
+ mutex_lock(&kfd_vm->master->lock);
+ list_add_tail(&entry->tv.head, &kfd_vm->master->kfd_bo_list);
+ mutex_unlock(&kfd_vm->master->lock);
+}
+
static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
uint64_t size, void *vm, struct kgd_mem **mem,
uint64_t *offset, void **kptr, struct kfd_process_device *pdd,
@@ -302,11 +317,12 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
uint64_t user_addr = 0;
int byte_align;
u32 alloc_domain;
+ struct amdkfd_vm *kfd_vm = (struct amdkfd_vm *)vm;
BUG_ON(kgd == NULL);
BUG_ON(size == 0);
BUG_ON(mem == NULL);
- BUG_ON(vm == NULL);
+ BUG_ON(kfd_vm == NULL);
if (aql_queue)
size = size >> 1;
@@ -416,6 +432,7 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
(*mem)->data2.va = va;
(*mem)->data2.domain = domain;
(*mem)->data2.mapped_to_gpu_memory = 0;
+ add_kgd_mem_to_kfd_bo_list(*mem, kfd_vm);
if (offset)
*offset = amdgpu_bo_mmap_offset(bo);
@@ -867,11 +884,16 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
struct kfd_bo_va_list *entry, *tmp;
struct bo_vm_reservation_context ctx;
int ret;
+ struct amdgpu_bo_list_entry *bo_list_entry;
+ struct amdkfd_vm *master_vm;
BUG_ON(kgd == NULL);
BUG_ON(mem == NULL);
+ BUG_ON(vm == NULL);
adev = get_amdgpu_device(kgd);
+ master_vm = ((struct amdkfd_vm *)vm)->master;
+ BUG_ON(master_vm == NULL);
mutex_lock(&mem->data2.lock);
@@ -916,6 +938,11 @@ int amdgpu_amdkfd_gpuvm_free_memory_of_gpu(
}
/* Free the BO*/
+ bo_list_entry = &mem->data2.bo_list_entry;
+ mutex_lock(&master_vm->lock);
+ list_del(&bo_list_entry->tv.head);
+ mutex_unlock(&master_vm->lock);
+
amdgpu_bo_unref(&mem->data2.bo);
kfree(mem);
@@ -1476,6 +1503,7 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd,
struct drm_gem_object *obj;
struct amdgpu_bo *bo;
int r = 0;
+ struct amdkfd_vm *kfd_vm = (struct amdkfd_vm *)vm;
dma_buf = dma_buf_get(dma_buf_fd);
if (IS_ERR(dma_buf))
@@ -1515,6 +1543,7 @@ int amdgpu_amdkfd_gpuvm_import_dmabuf(struct kgd_dev *kgd, int dma_buf_fd,
(*mem)->data2.domain = (bo->prefered_domains & AMDGPU_GEM_DOMAIN_VRAM) ?
AMDGPU_GEM_DOMAIN_VRAM : AMDGPU_GEM_DOMAIN_GTT;
(*mem)->data2.mapped_to_gpu_memory = 0;
+ add_kgd_mem_to_kfd_bo_list(*mem, kfd_vm);
out_put:
dma_buf_put(dma_buf);
--
2.7.4
|