|
@@ -26,61 +26,41 @@
|
|
|
pte_t *huge_pte_alloc(struct mm_struct *mm, unsigned long addr)
|
|
|
{
|
|
|
pgd_t *pgd;
|
|
|
+ pud_t *pud;
|
|
|
pmd_t *pmd;
|
|
|
pte_t *pte = NULL;
|
|
|
|
|
|
pgd = pgd_offset(mm, addr);
|
|
|
if (pgd) {
|
|
|
- pmd = pmd_alloc(mm, pgd, addr);
|
|
|
- if (pmd)
|
|
|
- pte = pte_alloc_map(mm, pmd, addr);
|
|
|
+ pud = pud_alloc(mm, pgd, addr);
|
|
|
+ if (pud) {
|
|
|
+ pmd = pmd_alloc(mm, pud, addr);
|
|
|
+ if (pmd)
|
|
|
+ pte = pte_alloc_map(mm, pmd, addr);
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
return pte;
|
|
|
}
|
|
|
|
|
|
pte_t *huge_pte_offset(struct mm_struct *mm, unsigned long addr)
|
|
|
{
|
|
|
pgd_t *pgd;
|
|
|
+ pud_t *pud;
|
|
|
pmd_t *pmd;
|
|
|
pte_t *pte = NULL;
|
|
|
|
|
|
pgd = pgd_offset(mm, addr);
|
|
|
if (pgd) {
|
|
|
- pmd = pmd_offset(pgd, addr);
|
|
|
- if (pmd)
|
|
|
- pte = pte_offset_map(pmd, addr);
|
|
|
- }
|
|
|
- return pte;
|
|
|
-}
|
|
|
-
|
|
|
-void set_huge_pte_at(struct mm_struct *mm, unsigned long addr,
|
|
|
- pte_t *ptep, pte_t entry)
|
|
|
-{
|
|
|
- int i;
|
|
|
-
|
|
|
- for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
|
|
|
- set_pte_at(mm, addr, ptep, entry);
|
|
|
- ptep++;
|
|
|
- addr += PAGE_SIZE;
|
|
|
- pte_val(entry) += PAGE_SIZE;
|
|
|
+ pud = pud_offset(pgd, addr);
|
|
|
+ if (pud) {
|
|
|
+ pmd = pmd_offset(pud, addr);
|
|
|
+ if (pmd)
|
|
|
+ pte = pte_offset_map(pmd, addr);
|
|
|
+ }
|
|
|
}
|
|
|
-}
|
|
|
-
|
|
|
-pte_t huge_ptep_get_and_clear(struct mm_struct *mm, unsigned long addr,
|
|
|
- pte_t *ptep)
|
|
|
-{
|
|
|
- pte_t entry;
|
|
|
- int i;
|
|
|
-
|
|
|
- entry = *ptep;
|
|
|
|
|
|
- for (i = 0; i < (1 << HUGETLB_PAGE_ORDER); i++) {
|
|
|
- pte_clear(mm, addr, ptep);
|
|
|
- addr += PAGE_SIZE;
|
|
|
- ptep++;
|
|
|
- }
|
|
|
-
|
|
|
- return entry;
|
|
|
+ return pte;
|
|
|
}
|
|
|
|
|
|
struct page *follow_huge_addr(struct mm_struct *mm,
|