forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-01-31 f9004dbfff8a3fbbd7e2a88c8a4327c7f2f8e5b2
kernel/arch/arm/mm/pgd.c
....@@ -1,11 +1,8 @@
1
+// SPDX-License-Identifier: GPL-2.0-only
12 /*
23 * linux/arch/arm/mm/pgd.c
34 *
45 * Copyright (C) 1998-2005 Russell King
5
- *
6
- * This program is free software; you can redistribute it and/or modify
7
- * it under the terms of the GNU General Public License version 2 as
8
- * published by the Free Software Foundation.
96 */
107 #include <linux/mm.h>
118 #include <linux/gfp.h>
....@@ -33,6 +30,7 @@
3330 pgd_t *pgd_alloc(struct mm_struct *mm)
3431 {
3532 pgd_t *new_pgd, *init_pgd;
33
+ p4d_t *new_p4d, *init_p4d;
3634 pud_t *new_pud, *init_pud;
3735 pmd_t *new_pmd, *init_pmd;
3836 pte_t *new_pte, *init_pte;
....@@ -56,8 +54,12 @@
5654 /*
5755 * Allocate PMD table for modules and pkmap mappings.
5856 */
59
- new_pud = pud_alloc(mm, new_pgd + pgd_index(MODULES_VADDR),
57
+ new_p4d = p4d_alloc(mm, new_pgd + pgd_index(MODULES_VADDR),
6058 MODULES_VADDR);
59
+ if (!new_p4d)
60
+ goto no_p4d;
61
+
62
+ new_pud = pud_alloc(mm, new_p4d, MODULES_VADDR);
6163 if (!new_pud)
6264 goto no_pud;
6365
....@@ -72,7 +74,11 @@
7274 * contains the machine vectors. The vectors are always high
7375 * with LPAE.
7476 */
75
- new_pud = pud_alloc(mm, new_pgd, 0);
77
+ new_p4d = p4d_alloc(mm, new_pgd, 0);
78
+ if (!new_p4d)
79
+ goto no_p4d;
80
+
81
+ new_pud = pud_alloc(mm, new_p4d, 0);
7682 if (!new_pud)
7783 goto no_pud;
7884
....@@ -94,7 +100,8 @@
94100 pmd_val(*new_pmd) |= PMD_DOMAIN(DOMAIN_VECTORS);
95101 #endif
96102
97
- init_pud = pud_offset(init_pgd, 0);
103
+ init_p4d = p4d_offset(init_pgd, 0);
104
+ init_pud = pud_offset(init_p4d, 0);
98105 init_pmd = pmd_offset(init_pud, 0);
99106 init_pte = pte_offset_map(init_pmd, 0);
100107 set_pte_ext(new_pte + 0, init_pte[0], 0);
....@@ -111,6 +118,8 @@
111118 no_pmd:
112119 pud_free(mm, new_pud);
113120 no_pud:
121
+ p4d_free(mm, new_p4d);
122
+no_p4d:
114123 __pgd_free(new_pgd);
115124 no_pgd:
116125 return NULL;
....@@ -119,6 +128,7 @@
119128 void pgd_free(struct mm_struct *mm, pgd_t *pgd_base)
120129 {
121130 pgd_t *pgd;
131
+ p4d_t *p4d;
122132 pud_t *pud;
123133 pmd_t *pmd;
124134 pgtable_t pte;
....@@ -130,7 +140,11 @@
130140 if (pgd_none_or_clear_bad(pgd))
131141 goto no_pgd;
132142
133
- pud = pud_offset(pgd, 0);
143
+ p4d = p4d_offset(pgd, 0);
144
+ if (p4d_none_or_clear_bad(p4d))
145
+ goto no_p4d;
146
+
147
+ pud = pud_offset(p4d, 0);
134148 if (pud_none_or_clear_bad(pud))
135149 goto no_pud;
136150
....@@ -147,8 +161,11 @@
147161 pmd_free(mm, pmd);
148162 mm_dec_nr_pmds(mm);
149163 no_pud:
150
- pgd_clear(pgd);
164
+ p4d_clear(p4d);
151165 pud_free(mm, pud);
166
+no_p4d:
167
+ pgd_clear(pgd);
168
+ p4d_free(mm, p4d);
152169 no_pgd:
153170 #ifdef CONFIG_ARM_LPAE
154171 /*
....@@ -159,15 +176,21 @@
159176 continue;
160177 if (pgd_val(*pgd) & L_PGD_SWAPPER)
161178 continue;
162
- pud = pud_offset(pgd, 0);
179
+ p4d = p4d_offset(pgd, 0);
180
+ if (p4d_none_or_clear_bad(p4d))
181
+ continue;
182
+ pud = pud_offset(p4d, 0);
163183 if (pud_none_or_clear_bad(pud))
164184 continue;
165185 pmd = pmd_offset(pud, 0);
166186 pud_clear(pud);
167187 pmd_free(mm, pmd);
168188 mm_dec_nr_pmds(mm);
169
- pgd_clear(pgd);
189
+ p4d_clear(p4d);
170190 pud_free(mm, pud);
191
+ mm_dec_nr_puds(mm);
192
+ pgd_clear(pgd);
193
+ p4d_free(mm, p4d);
171194 }
172195 #endif
173196 __pgd_free(pgd_base);