aboutsummaryrefslogtreecommitdiffstats
path: root/meta-amd-bsp/recipes-kernel/linux/linux-yocto-4.14.71/1549-drm-amdkfd-Validate-PeerDirect-support-on-process-re.patch
blob: abdb794c83ad0c706eb7a9c72f4018006354323d (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
From 4f08f48090180567f26d73c6ce98923d64dbee6e Mon Sep 17 00:00:00 2001
From: Serguei Sagalovitch <Serguei.Sagalovitch@amd.com>
Date: Thu, 27 Oct 2016 10:56:01 -0400
Subject: [PATCH 1549/4131] drm/amdkfd: Validate PeerDirect support on process
 registration v2

v2: Call kfd_close_peer_direct() if failed to initialize
PeerDirect interface to clean-up resources if any

Network stack could be loaded later so PeerDirect interface may be
not available during amdkfd initialization. Added logic to validate
PeerDirect API presence when HSA process is created.

Change-Id: Ib39b86a0086e2102baa3f41ba2bbb2f3e9a2017f
Signed-off-by: Serguei Sagalovitch <Serguei.Sagalovitch@amd.com>
---
 drivers/gpu/drm/amd/amdkfd/kfd_module.c     |  3 +--
 drivers/gpu/drm/amd/amdkfd/kfd_peerdirect.c | 37 ++++++++++++++++++++++++-----
 drivers/gpu/drm/amd/amdkfd/kfd_priv.h       |  2 +-
 drivers/gpu/drm/amd/amdkfd/kfd_process.c    |  6 +++++
 4 files changed, 39 insertions(+), 9 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_module.c b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
index 0f6a389..dee66c6 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_module.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_module.c
@@ -137,8 +137,7 @@ static int __init kfd_module_init(void)
 
 	amdkfd_init_completed = 1;
 
-	if (!kfd_init_peer_direct())
-		pr_info("PeerDirect support was enabled\n");
+	kfd_init_peer_direct();
 
 	dev_info(kfd_device, "Initialized module\n");
 
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_peerdirect.c b/drivers/gpu/drm/amd/amdkfd/kfd_peerdirect.c
index ffbccb3..0edc652 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_peerdirect.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_peerdirect.c
@@ -49,6 +49,8 @@
 #include <linux/slab.h>
 #include <linux/scatterlist.h>
 #include <linux/module.h>
+
+#include "kfd_priv.h"
 #include "amd_rdma.h"
 
 
@@ -428,11 +430,21 @@ static struct peer_memory_client amd_mem_client = {
 	.release = amd_release,
 };
 
-
-int kfd_init_peer_direct(void)
+/** Initialize PeerDirect interface with RDMA Network stack.
+ *
+ *  Because network stack could potentially be loaded later we check
+ *  presence of PeerDirect when HSA process is created. If PeerDirect was
+ *  already initialized we do nothing otherwise try to detect and register.
+ */
+void kfd_init_peer_direct(void)
 {
 	int result;
 
+	if (pfn_ib_unregister_peer_memory_client) {
+		pr_debug("PeerDirect support was already initialized\n");
+		return;
+	}
+
 	pr_debug("Try to initialize PeerDirect support\n");
 
 	pfn_ib_register_peer_memory_client =
@@ -446,7 +458,9 @@ int kfd_init_peer_direct(void)
 	if (!pfn_ib_register_peer_memory_client ||
 		!pfn_ib_unregister_peer_memory_client) {
 		pr_warn("amdkfd: PeerDirect interface was not detected\n");
-		return -EINVAL;
+		/* Do cleanup */
+		kfd_close_peer_direct();
+		return;
 	}
 
 	result = amdkfd_query_rdma_interface(&rdma_interface);
@@ -454,7 +468,7 @@ int kfd_init_peer_direct(void)
 	if (result < 0) {
 		pr_err("amdkfd: Cannot get RDMA Interface (result = %d)\n",
 				result);
-		return result;
+		return;
 	}
 
 	strcpy(amd_mem_client.name,    AMD_PEER_BRIDGE_DRIVER_NAME);
@@ -465,13 +479,19 @@ int kfd_init_peer_direct(void)
 
 	if (!ib_reg_handle) {
 		pr_err("amdkfd: Cannot register peer memory client\n");
-		return -EINVAL;
+		/* Do cleanup */
+		kfd_close_peer_direct();
+		return;
 	}
 
 	pr_info("amdkfd: PeerDirect support was initialized successfully\n");
-	return 0;
+	return;
 }
 
+/**
+ * Close connection with PeerDirect interface with RDMA Network stack.
+ *
+ */
 void kfd_close_peer_direct(void)
 {
 	if (pfn_ib_unregister_peer_memory_client) {
@@ -484,5 +504,10 @@ void kfd_close_peer_direct(void)
 	if (pfn_ib_register_peer_memory_client)
 		symbol_put(ib_register_peer_memory_client);
 
+
+	/* Reset pointers to be safe */
+	pfn_ib_unregister_peer_memory_client = NULL;
+	pfn_ib_register_peer_memory_client   = NULL;
+	ib_reg_handle = NULL;
 }
 
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
index 92b0adf..d1b1745f 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_priv.h
@@ -966,7 +966,7 @@ int dbgdev_wave_reset_wavefronts(struct kfd_dev *dev, struct kfd_process *p);
 #define KFD_CWSR_CZ_FW_VER 625
 
 /* PeerDirect support */
-int kfd_init_peer_direct(void);
+void kfd_init_peer_direct(void);
 void kfd_close_peer_direct(void);
 
 /* Debugfs */
diff --git a/drivers/gpu/drm/amd/amdkfd/kfd_process.c b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
index b679ea7..3c068c6 100644
--- a/drivers/gpu/drm/amd/amdkfd/kfd_process.c
+++ b/drivers/gpu/drm/amd/amdkfd/kfd_process.c
@@ -566,6 +566,12 @@ static struct kfd_process *create_process(const struct task_struct *thread,
 
 	INIT_WORK(&process->eviction_work.work, kfd_evict_bo_worker);
 	INIT_DELAYED_WORK(&process->restore_work, kfd_restore_bo_worker);
+
+	/* If PeerDirect interface was not detected try to detect it again
+	* in case if network driver was loaded later.
+	*/
+	kfd_init_peer_direct();
+
 	return process;
 
 err_init_cwsr:
-- 
2.7.4