• Huang Shijie's avatar
    arm64: hugetlb: remove the wrong pmd check in find_num_contig() · 2021e55d
    Huang Shijie authored
    commit 20156ce2 upstream.
    
    The find_num_contig() will return 1 when the pmd is not present.
    It will cause a kernel dead loop in the following scenaro:
    
       1.) pmd entry is not present.
    
       2.) the page fault occurs:
           ... hugetlb_fault() --> hugetlb_no_page() --> set_huge_pte_at()
    
       3.) set_huge_pte_at() will only set the first PMD entry, since the
           find_num_contig just return 1 in this case. So the PMD entries
           are all empty except the first one.
    
       4.) when kernel accesses the address mapped by the second PMD entry,
           a new page fault occurs:
           ... hugetlb_fault() --> huge_ptep_set_access_flags()
    
           The second PMD entry is still empty now.
    
       5.) When the kernel returns, the access will cause a page fault again.
           The kernel will run like the "4)" above.
           We will see a dead loop since here.
    
    The dead loop is caught in the 32M hugetlb page (2M PMD + Contiguous bit).
    
    This patch removes wrong pmd check, and fixes this dead loop.
    
    This patch also removes the redundant checks for PGD/PUD in
    the find_num_contig().
    Acked-by: default avatarSteve Capper <steve.capper@arm.com>
    Signed-off-by: default avatarHuang Shijie <shijie.huang@arm.com>
    Reviewed-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarCatalin Marinas <catalin.marinas@arm.com>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    2021e55d
hugetlbpage.c 7.66 KB