|
@@ -2423,8 +2423,6 @@ static void collapse_huge_page(struct mm_struct *mm,
|
|
|
pmd = mm_find_pmd(mm, address);
|
|
|
if (!pmd)
|
|
|
goto out;
|
|
|
- if (pmd_trans_huge(*pmd))
|
|
|
- goto out;
|
|
|
|
|
|
anon_vma_lock_write(vma->anon_vma);
|
|
|
|
|
@@ -2523,8 +2521,6 @@ static int khugepaged_scan_pmd(struct mm_struct *mm,
|
|
|
pmd = mm_find_pmd(mm, address);
|
|
|
if (!pmd)
|
|
|
goto out;
|
|
|
- if (pmd_trans_huge(*pmd))
|
|
|
- goto out;
|
|
|
|
|
|
memset(khugepaged_node_load, 0, sizeof(khugepaged_node_load));
|
|
|
pte = pte_offset_map_lock(mm, pmd, address, &ptl);
|
|
@@ -2877,12 +2873,22 @@ void split_huge_page_pmd_mm(struct mm_struct *mm, unsigned long address,
|
|
|
static void split_huge_page_address(struct mm_struct *mm,
|
|
|
unsigned long address)
|
|
|
{
|
|
|
+ pgd_t *pgd;
|
|
|
+ pud_t *pud;
|
|
|
pmd_t *pmd;
|
|
|
|
|
|
VM_BUG_ON(!(address & ~HPAGE_PMD_MASK));
|
|
|
|
|
|
- pmd = mm_find_pmd(mm, address);
|
|
|
- if (!pmd)
|
|
|
+ pgd = pgd_offset(mm, address);
|
|
|
+ if (!pgd_present(*pgd))
|
|
|
+ return;
|
|
|
+
|
|
|
+ pud = pud_offset(pgd, address);
|
|
|
+ if (!pud_present(*pud))
|
|
|
+ return;
|
|
|
+
|
|
|
+ pmd = pmd_offset(pud, address);
|
|
|
+ if (!pmd_present(*pmd))
|
|
|
return;
|
|
|
/*
|
|
|
* Caller holds the mmap_sem write mode, so a huge pmd cannot
|