aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1639-drm-amdgpu-Refactor-HSA-page-table-validation.patch
blob: 83d1b315cd6efcdb31bd10f803d5e0abd505d7bc (plain)
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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
From 88232f46a43509ea29521c07a7b1f3b7b3f862f7 Mon Sep 17 00:00:00 2001
From: Felix Kuehling <Felix.Kuehling@amd.com>
Date: Tue, 21 Mar 2017 15:05:31 -0400
Subject: [PATCH 1639/4131] drm/amdgpu: Refactor HSA page table validation

Factor page table validation out of
amdgpu_amdkfd_gpuvm_restore_process_bos for reuse in userptr restore.

Change-Id: I9d45b48c484d4f2f6ff8c4662a51b9dceebb0493
Signed-off-by: Felix Kuehling <Felix.Kuehling@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 92 +++++++++++++-----------
 1 file changed, 49 insertions(+), 43 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index e8d3b5d..29ca428 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -1904,6 +1904,40 @@ int amdgpu_amdkfd_gpuvm_export_dmabuf(struct kgd_dev *kgd, void *vm,
 	return 0;
 }
 
+static int validate_pd_pt_bos(struct amdkfd_process_info *process_info)
+{
+	struct amdkfd_vm *peer_vm;
+	struct amdgpu_vm_parser param;
+	int ret;
+
+	param.domain = AMDGPU_GEM_DOMAIN_VRAM;
+	param.wait = false;
+
+	list_for_each_entry(peer_vm, &process_info->vm_list_head,
+			    vm_list_node) {
+		struct amdgpu_bo *pd_bo = peer_vm->base.root.bo;
+		struct amdgpu_device *adev = amdgpu_ttm_adev(pd_bo->tbo.bdev);
+
+		ret = amdgpu_amdkfd_bo_validate(pd_bo, pd_bo->prefered_domains,
+						false);
+		if (ret) {
+			pr_debug("Validate PD failed. Try again\n");
+			return ret;
+		}
+
+		ret = amdgpu_vm_validate_pt_bos(adev, &peer_vm->base,
+				amdgpu_amdkfd_validate, &param);
+		if (ret) {
+			pr_debug("Validate PTs failed. Try again\n");
+			return ret;
+		}
+		peer_vm->base.last_eviction_counter =
+				atomic64_read(&adev->num_evictions);
+	}
+
+	return 0;
+}
+
 /* Runs out of process context. mem->lock must be held. */
 int amdgpu_amdkfd_gpuvm_evict_mem(struct kgd_mem *mem, struct mm_struct *mm)
 {
@@ -2129,26 +2163,23 @@ int amdgpu_amdkfd_gpuvm_restore_mem(struct kgd_mem *mem, struct mm_struct *mm)
 
 int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info)
 {
-	struct amdgpu_bo_list_entry *pd_bo_list, *entry;
+	struct amdgpu_bo_list_entry *pd_bo_list;
 	struct amdkfd_process_info *process_info = info;
 	struct amdkfd_vm *peer_vm;
 	struct kgd_mem *mem;
 	struct bo_vm_reservation_context ctx;
 	struct amdgpu_amdkfd_fence *old_fence;
-	struct amdgpu_device *adev;
-	struct amdgpu_vm_parser param;
 	int ret = 0, i;
-	struct list_head duplicate_save, pd_list;
+	struct list_head duplicate_save;
 
 	if (WARN_ON(!process_info))
 		return -EINVAL;
 
 	INIT_LIST_HEAD(&duplicate_save);
-	INIT_LIST_HEAD(&pd_list);
 	INIT_LIST_HEAD(&ctx.list);
 	INIT_LIST_HEAD(&ctx.duplicates);
 
-	pd_bo_list = kcalloc(process_info->n_vms * 2,
+	pd_bo_list = kcalloc(process_info->n_vms,
 			     sizeof(struct amdgpu_bo_list_entry),
 			     GFP_KERNEL);
 	if (pd_bo_list == NULL)
@@ -2170,12 +2201,9 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info)
 	i = 0;
 	mutex_lock(&process_info->lock);
 	list_for_each_entry(peer_vm, &process_info->vm_list_head,
-			vm_list_node) {
+			vm_list_node)
 		amdgpu_vm_get_pd_bo(&peer_vm->base, &ctx.list,
 				    &pd_bo_list[i++]);
-		amdgpu_vm_get_pd_bo(&peer_vm->base, &pd_list,
-				    &pd_bo_list[i++]);
-	}
 
 	/* Reserve all BOs and page tables/directory. Add all BOs from
 	 * kfd_bo_list to ctx.list
@@ -2200,43 +2228,20 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info)
 
 	amdgpu_sync_create(&ctx.sync);
 
-	/* Validate PDs*/
-	list_for_each_entry(entry, &pd_list, tv.head) {
-		struct amdgpu_bo *bo = entry->robj;
-
-		ret = amdgpu_amdkfd_bo_validate(bo, bo->prefered_domains,
-						false);
-		if (ret) {
-			pr_debug("Memory eviction: Validate PD failed. Try again\n");
-			goto validate_map_fail;
-		}
-	}
-
-	param.domain = AMDGPU_GEM_DOMAIN_VRAM;
-	param.wait = false;
-
-	/* Validate PTs*/
-	list_for_each_entry(peer_vm, &process_info->vm_list_head,
-			vm_list_node) {
-		adev = amdgpu_ttm_adev(peer_vm->base.root.bo->tbo.bdev);
-		ret = amdgpu_vm_validate_pt_bos(adev, &peer_vm->base,
-				amdgpu_amdkfd_validate, &param);
-		if (ret) {
-			pr_debug("Memory eviction: Validate PTs failed. Try again\n");
-			goto validate_map_fail;
-		}
-		peer_vm->base.last_eviction_counter =
-				atomic64_read(&adev->num_evictions);
-	}
+	/* Validate PDs and PTs */
+	ret = validate_pd_pt_bos(process_info);
+	if (ret)
+		goto validate_map_fail;
 
 	/* Wait for PD/PTs validate to finish */
-	list_for_each_entry(entry, &pd_list, tv.head) {
-		struct amdgpu_bo *bo = entry->robj;
+	/* FIXME: I think this isn't needed */
+	list_for_each_entry(peer_vm, &process_info->vm_list_head,
+			    vm_list_node) {
+		struct amdgpu_bo *bo = peer_vm->base.root.bo;
 
 		ttm_bo_wait(&bo->tbo, false, false);
 	}
 
-
 	/* Validate BOs and map them to GPUVM (update VM page tables). */
 	list_for_each_entry(mem, &process_info->kfd_bo_list,
 			    validate_list.head) {
@@ -2276,8 +2281,9 @@ int amdgpu_amdkfd_gpuvm_restore_process_bos(void *info)
 	}
 
 	/* Attach eviction fence to PD / PT BOs */
-	list_for_each_entry(entry, &pd_list, tv.head) {
-		struct amdgpu_bo *bo = entry->robj;
+	list_for_each_entry(peer_vm, &process_info->vm_list_head,
+			    vm_list_node) {
+		struct amdgpu_bo *bo = peer_vm->base.root.bo;
 
 		amdgpu_bo_fence(bo, &process_info->eviction_fence->base, true);
 	}
-- 
2.7.4