hc
2024-10-22 8ac6c7a54ed1b98d142dce24b11c6de6a1e239a5
kernel/arch/arm/lib/uaccess_with_memcpy.c
....@@ -1,12 +1,9 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * linux/arch/arm/lib/uaccess_with_memcpy.c
34 *
45 * Written by: Lennert Buytenhek and Nicolas Pitre
56 * Copyright (C) 2009 Marvell Semiconductor
6
- *
7
- * This program is free software; you can redistribute it and/or modify
8
- * it under the terms of the GNU General Public License version 2 as
9
- * published by the Free Software Foundation.
107 */
118
129 #include <linux/kernel.h>
....@@ -27,6 +24,7 @@
2724 {
2825 unsigned long addr = (unsigned long)_addr;
2926 pgd_t *pgd;
27
+ p4d_t *p4d;
3028 pmd_t *pmd;
3129 pte_t *pte;
3230 pud_t *pud;
....@@ -36,7 +34,11 @@
3634 if (unlikely(pgd_none(*pgd) || pgd_bad(*pgd)))
3735 return 0;
3836
39
- pud = pud_offset(pgd, addr);
37
+ p4d = p4d_offset(pgd, addr);
38
+ if (unlikely(p4d_none(*p4d) || p4d_bad(*p4d)))
39
+ return 0;
40
+
41
+ pud = pud_offset(p4d, addr);
4042 if (unlikely(pud_none(*pud) || pud_bad(*pud)))
4143 return 0;
4244
....@@ -99,7 +101,7 @@
99101 atomic = faulthandler_disabled();
100102
101103 if (!atomic)
102
- down_read(&current->mm->mmap_sem);
104
+ mmap_read_lock(current->mm);
103105 while (n) {
104106 pte_t *pte;
105107 spinlock_t *ptl;
....@@ -107,11 +109,11 @@
107109
108110 while (!pin_page_for_write(to, &pte, &ptl)) {
109111 if (!atomic)
110
- up_read(&current->mm->mmap_sem);
112
+ mmap_read_unlock(current->mm);
111113 if (__put_user(0, (char __user *)to))
112114 goto out;
113115 if (!atomic)
114
- down_read(&current->mm->mmap_sem);
116
+ mmap_read_lock(current->mm);
115117 }
116118
117119 tocopy = (~(unsigned long)to & ~PAGE_MASK) + 1;
....@@ -131,7 +133,7 @@
131133 spin_unlock(ptl);
132134 }
133135 if (!atomic)
134
- up_read(&current->mm->mmap_sem);
136
+ mmap_read_unlock(current->mm);
135137
136138 out:
137139 return n;
....@@ -168,17 +170,17 @@
168170 return 0;
169171 }
170172
171
- down_read(&current->mm->mmap_sem);
173
+ mmap_read_lock(current->mm);
172174 while (n) {
173175 pte_t *pte;
174176 spinlock_t *ptl;
175177 int tocopy;
176178
177179 while (!pin_page_for_write(addr, &pte, &ptl)) {
178
- up_read(&current->mm->mmap_sem);
180
+ mmap_read_unlock(current->mm);
179181 if (__put_user(0, (char __user *)addr))
180182 goto out;
181
- down_read(&current->mm->mmap_sem);
183
+ mmap_read_lock(current->mm);
182184 }
183185
184186 tocopy = (~(unsigned long)addr & ~PAGE_MASK) + 1;
....@@ -196,7 +198,7 @@
196198 else
197199 spin_unlock(ptl);
198200 }
199
- up_read(&current->mm->mmap_sem);
201
+ mmap_read_unlock(current->mm);
200202
201203 out:
202204 return n;