hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/arch/parisc/mm/hugetlbpage.c
....@@ -15,7 +15,6 @@
1515 #include <linux/sysctl.h>
1616
1717 #include <asm/mman.h>
18
-#include <asm/pgalloc.h>
1918 #include <asm/tlb.h>
2019 #include <asm/tlbflush.h>
2120 #include <asm/cacheflush.h>
....@@ -45,10 +44,11 @@
4544 }
4645
4746
48
-pte_t *huge_pte_alloc(struct mm_struct *mm,
47
+pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma,
4948 unsigned long addr, unsigned long sz)
5049 {
5150 pgd_t *pgd;
51
+ p4d_t *p4d;
5252 pud_t *pud;
5353 pmd_t *pmd;
5454 pte_t *pte = NULL;
....@@ -61,7 +61,8 @@
6161 addr &= HPAGE_MASK;
6262
6363 pgd = pgd_offset(mm, addr);
64
- pud = pud_alloc(mm, pgd, addr);
64
+ p4d = p4d_offset(pgd, addr);
65
+ pud = pud_alloc(mm, p4d, addr);
6566 if (pud) {
6667 pmd = pmd_alloc(mm, pud, addr);
6768 if (pmd)
....@@ -74,6 +75,7 @@
7475 unsigned long addr, unsigned long sz)
7576 {
7677 pgd_t *pgd;
78
+ p4d_t *p4d;
7779 pud_t *pud;
7880 pmd_t *pmd;
7981 pte_t *pte = NULL;
....@@ -82,11 +84,14 @@
8284
8385 pgd = pgd_offset(mm, addr);
8486 if (!pgd_none(*pgd)) {
85
- pud = pud_offset(pgd, addr);
86
- if (!pud_none(*pud)) {
87
- pmd = pmd_offset(pud, addr);
88
- if (!pmd_none(*pmd))
89
- pte = pte_offset_map(pmd, addr);
87
+ p4d = p4d_offset(pgd, addr);
88
+ if (!p4d_none(*p4d)) {
89
+ pud = pud_offset(p4d, addr);
90
+ if (!pud_none(*pud)) {
91
+ pmd = pmd_offset(pud, addr);
92
+ if (!pmd_none(*pmd))
93
+ pte = pte_offset_map(pmd, addr);
94
+ }
9095 }
9196 }
9297 return pte;
....@@ -137,24 +142,17 @@
137142 void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
138143 pte_t *ptep, pte_t entry)
139144 {
140
- unsigned long flags;
141
-
142
- purge_tlb_start(flags);
143145 __set_huge_pte_at(mm, addr, ptep, entry);
144
- purge_tlb_end(flags);
145146 }
146147
147148
148149 pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
149150 pte_t *ptep)
150151 {
151
- unsigned long flags;
152152 pte_t entry;
153153
154
- purge_tlb_start(flags);
155154 entry = *ptep;
156155 __set_huge_pte_at(mm, addr, ptep, __pte(0));
157
- purge_tlb_end(flags);
158156
159157 return entry;
160158 }
....@@ -163,28 +161,23 @@
163161 void huge_ptep_set_wrprotect(struct mm_struct *mm,
164162 unsigned long addr, pte_t *ptep)
165163 {
166
- unsigned long flags;
167164 pte_t old_pte;
168165
169
- purge_tlb_start(flags);
170166 old_pte = *ptep;
171167 __set_huge_pte_at(mm, addr, ptep, pte_wrprotect(old_pte));
172
- purge_tlb_end(flags);
173168 }
174169
175170 int huge_ptep_set_access_flags(struct vm_area_struct *vma,
176171 unsigned long addr, pte_t *ptep,
177172 pte_t pte, int dirty)
178173 {
179
- unsigned long flags;
180174 int changed;
175
+ struct mm_struct *mm = vma->vm_mm;
181176
182
- purge_tlb_start(flags);
183177 changed = !pte_same(*ptep, pte);
184178 if (changed) {
185
- __set_huge_pte_at(vma->vm_mm, addr, ptep, pte);
179
+ __set_huge_pte_at(mm, addr, ptep, pte);
186180 }
187
- purge_tlb_end(flags);
188181 return changed;
189182 }
190183