diff options
Diffstat (limited to 'mm/huge_memory.c')
-rw-r--r-- | mm/huge_memory.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/mm/huge_memory.c b/mm/huge_memory.c index d36b2af4d1bf..1ebc93e179f3 100644 --- a/mm/huge_memory.c +++ b/mm/huge_memory.c | |||
@@ -1828,7 +1828,7 @@ static void __split_huge_pud_locked(struct vm_area_struct *vma, pud_t *pud, | |||
1828 | VM_BUG_ON_VMA(vma->vm_end < haddr + HPAGE_PUD_SIZE, vma); | 1828 | VM_BUG_ON_VMA(vma->vm_end < haddr + HPAGE_PUD_SIZE, vma); |
1829 | VM_BUG_ON(!pud_trans_huge(*pud) && !pud_devmap(*pud)); | 1829 | VM_BUG_ON(!pud_trans_huge(*pud) && !pud_devmap(*pud)); |
1830 | 1830 | ||
1831 | count_vm_event(THP_SPLIT_PMD); | 1831 | count_vm_event(THP_SPLIT_PUD); |
1832 | 1832 | ||
1833 | pudp_huge_clear_flush_notify(vma, haddr, pud); | 1833 | pudp_huge_clear_flush_notify(vma, haddr, pud); |
1834 | } | 1834 | } |
@@ -2048,6 +2048,7 @@ void split_huge_pmd_address(struct vm_area_struct *vma, unsigned long address, | |||
2048 | bool freeze, struct page *page) | 2048 | bool freeze, struct page *page) |
2049 | { | 2049 | { |
2050 | pgd_t *pgd; | 2050 | pgd_t *pgd; |
2051 | p4d_t *p4d; | ||
2051 | pud_t *pud; | 2052 | pud_t *pud; |
2052 | pmd_t *pmd; | 2053 | pmd_t *pmd; |
2053 | 2054 | ||
@@ -2055,7 +2056,11 @@ void split_huge_pmd_address(struct vm_area_struct *vma, unsigned long address, | |||
2055 | if (!pgd_present(*pgd)) | 2056 | if (!pgd_present(*pgd)) |
2056 | return; | 2057 | return; |
2057 | 2058 | ||
2058 | pud = pud_offset(pgd, address); | 2059 | p4d = p4d_offset(pgd, address); |
2060 | if (!p4d_present(*p4d)) | ||
2061 | return; | ||
2062 | |||
2063 | pud = pud_offset(p4d, address); | ||
2059 | if (!pud_present(*pud)) | 2064 | if (!pud_present(*pud)) |
2060 | return; | 2065 | return; |
2061 | 2066 | ||