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
|
From a9d8447a8505a836b52d9194a5cff24ce95f301a Mon Sep 17 00:00:00 2001
From: Lan Xiao <Lan.Xiao@amd.com>
Date: Fri, 10 Jun 2016 10:17:48 -0400
Subject: [PATCH 1454/4131] drm/amdgpu: clear bo at memory allocation
Feature: SWDEV-95685
Change-Id: I46b46fcc6045d1c9ec9734d1321c2bc817700fda
Signed-off-by: Lan Xiao <Lan.Xiao@amd.com>
---
drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 59 ++++++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index a094aa4..f80206e5 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -279,6 +279,55 @@ static void unpin_pts(struct amdgpu_bo_va *bo_va, struct amdgpu_vm *vm)
}
}
+
+static int amdgpu_amdkfd_gpuvm_clear_bo(struct amdgpu_device *adev,
+ struct amdgpu_vm *vm,
+ struct amdgpu_bo *bo)
+{
+ struct amdgpu_ring *ring;
+ struct fence *fence = NULL;
+ struct amdgpu_job *job;
+ unsigned entries;
+ uint64_t addr;
+ int r;
+
+ ring = container_of(vm->entity.sched, struct amdgpu_ring, sched);
+
+ r = reservation_object_reserve_shared(bo->tbo.resv);
+ if (r)
+ return r;
+
+ r = ttm_bo_validate(&bo->tbo, &bo->placement, true, false);
+ if (r)
+ goto error;
+
+ addr = amdgpu_bo_gpu_offset(bo);
+ entries = amdgpu_bo_size(bo);
+
+ r = amdgpu_job_alloc_with_ib(adev, 64, &job);
+ if (r)
+ goto error;
+
+ amdgpu_emit_fill_buffer(adev, &job->ibs[0], 0, addr, entries);
+ amdgpu_ring_pad_ib(ring, &job->ibs[0]);
+
+ WARN_ON(job->ibs[0].length_dw > 64);
+ r = amdgpu_job_submit(job, ring, &vm->entity,
+ AMDGPU_FENCE_OWNER_VM, &fence);
+ if (r)
+ goto error_free;
+
+ amdgpu_bo_fence(bo, fence, true);
+ fence_put(fence);
+ return 0;
+
+error_free:
+ amdgpu_job_free(job);
+
+error:
+ return r;
+}
+
static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
size_t size, void *vm, struct kgd_mem **mem,
uint64_t *offset, void **kptr, struct kfd_process_device *pdd,
@@ -336,6 +385,15 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
bo->pdd = pdd;
(*mem)->data2.bo = bo;
+ if (domain == AMDGPU_GEM_DOMAIN_VRAM) {
+ ret = amdgpu_amdkfd_gpuvm_clear_bo(adev, vm, bo);
+ if (ret) {
+ pr_err("amdkfd: Failed to clear BO object on GTT. ret == %d\n",
+ ret);
+ goto err_bo_clear;
+ }
+ }
+
pr_debug("Created BO on GTT with size %zu bytes\n", size);
if (userptr) {
@@ -397,6 +455,7 @@ static int __alloc_memory_of_gpu(struct kgd_dev *kgd, uint64_t va,
if (userptr)
amdgpu_mn_unregister(bo);
allocate_mem_set_userptr_failed:
+err_bo_clear:
amdgpu_bo_unref(&bo);
err_bo_create:
kfree(*mem);
--
2.7.4
|