aboutsummaryrefslogtreecommitdiffstats
path: root/common/recipes-kernel/linux/linux-yocto-4.14.71/1812-drm-amdgpu-KFD-Fix-rw_semaphore-usage.patch
blob: 68264d784313a70bd5c7cdd2397be3ffe410f59e (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
From a7c6d986632f84648334937c47ad43fdcbdaa474 Mon Sep 17 00:00:00 2001
From: "Le.Ma" <Le.Ma@amd.com>
Date: Fri, 22 Sep 2017 10:56:57 +0800
Subject: [PATCH 1812/4131] drm/amdgpu: [KFD] Fix rw_semaphore usage

Avoid accessing current pointer in amdgpu_ttm_tt_get_user_pages(),
which will cause NULL pointer oops. And remove uneeded rw_semaphore.

This fix accords with kfd branch.

Change-Id: I0a602b30a20eb444968d6e846f3adca6cfff841a
Signed-off-by: Le.Ma <Le.Ma@amd.com>
Reviewed-by: Junwei Zhang <Jerry.Zhang@amd.com>
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c | 19 +++++--------------
 drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c          |  8 ++++----
 2 files changed, 9 insertions(+), 18 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
index f5d61eb..8de304b 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gpuvm.c
@@ -585,9 +585,7 @@ static int init_user_pages(struct kgd_mem *mem, struct mm_struct *mm,
 		goto unregister_out;
 	}
 
-	down_read(&mm->mmap_sem);
 	ret = amdgpu_ttm_tt_get_user_pages(bo->tbo.ttm, mem->user_pages);
-	up_read(&mm->mmap_sem);
 	if (ret) {
 		pr_err("%s: Failed to get user pages: %d\n", __func__, ret);
 		goto free_out;
@@ -1961,7 +1959,7 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
 {
 	struct kgd_mem *mem, *tmp_mem;
 	struct amdgpu_bo *bo;
-	int invalid, ret = 0;
+	int invalid, ret;
 
 	/* Move all invalidated BOs to the userptr_inval_list and
 	 * release their user pages by migration to the CPU domain
@@ -1993,7 +1991,6 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
 		return 0; /* All evicted userptr BOs were freed */
 
 	/* Go through userptr_inval_list and update any invalid user_pages */
-	down_read(&mm->mmap_sem);
 	list_for_each_entry(mem, &process_info->userptr_inval_list,
 			    validate_list.head) {
 		invalid = atomic_read(&mem->invalid);
@@ -2017,10 +2014,9 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
 					   GFP_KERNEL | __GFP_ZERO);
 #endif
 			if (!mem->user_pages) {
-				ret = -ENOMEM;
 				pr_err("%s: Failed to allocate pages array\n",
 				       __func__);
-				goto unlock_mmap_out;
+				return -ENOMEM;
 			}
 		} else if (mem->user_pages[0]) {
 			release_pages(mem->user_pages,
@@ -2034,7 +2030,6 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
 			mem->user_pages[0] = NULL;
 			pr_info("%s: Failed to get user pages: %d\n",
 				__func__, ret);
-			ret = 0;
 			/* Pretend it succeeded. It will fail later
 			 * with a VM fault if the GPU tries to access
 			 * it. Better than hanging indefinitely with
@@ -2045,14 +2040,10 @@ static int update_invalid_user_pages(struct amdkfd_process_info *process_info,
 		/* Mark the BO as valid unless it was invalidated
 		 * again concurrently
 		 */
-		if (atomic_cmpxchg(&mem->invalid, invalid, 0) != invalid) {
-			ret = -EAGAIN;
-			goto unlock_mmap_out;
-		}
+		if (atomic_cmpxchg(&mem->invalid, invalid, 0) != invalid)
+			return -EAGAIN;
 	}
-unlock_mmap_out:
-	up_read(&mm->mmap_sem);
-	return ret;
+	return 0;
 }
 
 /* Validate invalid userptr BOs
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
index 8727194..88daa5a 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ttm.c
@@ -689,7 +689,7 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages)
 	if (!(gtt->userflags & AMDGPU_GEM_USERPTR_READONLY))
 		flags |= FOLL_WRITE;
 
-	down_read(&current->mm->mmap_sem);
+	down_read(&mm->mmap_sem);
 
 	if (gtt->userflags & AMDGPU_GEM_USERPTR_ANONONLY) {
 		/* check that we only use anonymous memory
@@ -699,7 +699,7 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages)
 
 		vma = find_vma(mm, gtt->userptr);
 		if (!vma || vma->vm_file || vma->vm_end < end) {
-			up_read(&current->mm->mmap_sem);
+			up_read(&mm->mmap_sem);
 			return -EPERM;
 		}
 	}
@@ -728,12 +728,12 @@ int amdgpu_ttm_tt_get_user_pages(struct ttm_tt *ttm, struct page **pages)
 
 	} while (pinned < ttm->num_pages);
 	
-	up_read(&current->mm->mmap_sem);	
+	up_read(&mm->mmap_sem);
 	return 0;
 
 release_pages:
 	release_pages(pages, pinned, 0);
-	up_read(&current->mm->mmap_sem);
+	up_read(&mm->mmap_sem);
 	return r;
 }
 
-- 
2.7.4