hc
2023-12-06 08f87f769b595151be1afeff53e144f543faa614
kernel/arch/sparc/mm/hugetlbpage.c
....@@ -14,7 +14,6 @@
1414
1515 #include <asm/mman.h>
1616 #include <asm/pgalloc.h>
17
-#include <asm/pgtable.h>
1817 #include <asm/tlb.h>
1918 #include <asm/tlbflush.h>
2019 #include <asm/cacheflush.h>
....@@ -273,15 +272,17 @@
273272 return size;
274273 }
275274
276
-pte_t *huge_pte_alloc(struct mm_struct *mm,
275
+pte_t *huge_pte_alloc(struct mm_struct *mm, struct vm_area_struct *vma,
277276 unsigned long addr, unsigned long sz)
278277 {
279278 pgd_t *pgd;
279
+ p4d_t *p4d;
280280 pud_t *pud;
281281 pmd_t *pmd;
282282
283283 pgd = pgd_offset(mm, addr);
284
- pud = pud_alloc(mm, pgd, addr);
284
+ p4d = p4d_offset(pgd, addr);
285
+ pud = pud_alloc(mm, p4d, addr);
285286 if (!pud)
286287 return NULL;
287288 if (sz >= PUD_SIZE)
....@@ -298,13 +299,17 @@
298299 unsigned long addr, unsigned long sz)
299300 {
300301 pgd_t *pgd;
302
+ p4d_t *p4d;
301303 pud_t *pud;
302304 pmd_t *pmd;
303305
304306 pgd = pgd_offset(mm, addr);
305307 if (pgd_none(*pgd))
306308 return NULL;
307
- pud = pud_offset(pgd, addr);
309
+ p4d = p4d_offset(pgd, addr);
310
+ if (p4d_none(*p4d))
311
+ return NULL;
312
+ pud = pud_offset(p4d, addr);
308313 if (pud_none(*pud))
309314 return NULL;
310315 if (is_hugetlb_pud(*pud))
....@@ -449,7 +454,7 @@
449454 mm_dec_nr_pmds(tlb->mm);
450455 }
451456
452
-static void hugetlb_free_pud_range(struct mmu_gather *tlb, pgd_t *pgd,
457
+static void hugetlb_free_pud_range(struct mmu_gather *tlb, p4d_t *p4d,
453458 unsigned long addr, unsigned long end,
454459 unsigned long floor, unsigned long ceiling)
455460 {
....@@ -458,7 +463,7 @@
458463 unsigned long start;
459464
460465 start = addr;
461
- pud = pud_offset(pgd, addr);
466
+ pud = pud_offset(p4d, addr);
462467 do {
463468 next = pud_addr_end(addr, end);
464469 if (pud_none_or_clear_bad(pud))
....@@ -481,8 +486,8 @@
481486 if (end - 1 > ceiling - 1)
482487 return;
483488
484
- pud = pud_offset(pgd, start);
485
- pgd_clear(pgd);
489
+ pud = pud_offset(p4d, start);
490
+ p4d_clear(p4d);
486491 pud_free_tlb(tlb, pud, start);
487492 mm_dec_nr_puds(tlb->mm);
488493 }
....@@ -492,6 +497,7 @@
492497 unsigned long floor, unsigned long ceiling)
493498 {
494499 pgd_t *pgd;
500
+ p4d_t *p4d;
495501 unsigned long next;
496502
497503 addr &= PMD_MASK;
....@@ -511,10 +517,11 @@
511517 return;
512518
513519 pgd = pgd_offset(tlb->mm, addr);
520
+ p4d = p4d_offset(pgd, addr);
514521 do {
515
- next = pgd_addr_end(addr, end);
516
- if (pgd_none_or_clear_bad(pgd))
522
+ next = p4d_addr_end(addr, end);
523
+ if (p4d_none_or_clear_bad(p4d))
517524 continue;
518
- hugetlb_free_pud_range(tlb, pgd, addr, next, floor, ceiling);
519
- } while (pgd++, addr = next, addr != end);
525
+ hugetlb_free_pud_range(tlb, p4d, addr, next, floor, ceiling);
526
+ } while (p4d++, addr = next, addr != end);
520527 }