|
@@ -4651,6 +4651,7 @@ follow_huge_pmd(struct mm_struct *mm, unsigned long address,
|
|
|
{
|
|
|
struct page *page = NULL;
|
|
|
spinlock_t *ptl;
|
|
|
+ pte_t pte;
|
|
|
retry:
|
|
|
ptl = pmd_lockptr(mm, pmd);
|
|
|
spin_lock(ptl);
|
|
@@ -4660,12 +4661,13 @@ retry:
|
|
|
*/
|
|
|
if (!pmd_huge(*pmd))
|
|
|
goto out;
|
|
|
- if (pmd_present(*pmd)) {
|
|
|
+ pte = huge_ptep_get((pte_t *)pmd);
|
|
|
+ if (pte_present(pte)) {
|
|
|
page = pmd_page(*pmd) + ((address & ~PMD_MASK) >> PAGE_SHIFT);
|
|
|
if (flags & FOLL_GET)
|
|
|
get_page(page);
|
|
|
} else {
|
|
|
- if (is_hugetlb_entry_migration(huge_ptep_get((pte_t *)pmd))) {
|
|
|
+ if (is_hugetlb_entry_migration(pte)) {
|
|
|
spin_unlock(ptl);
|
|
|
__migration_entry_wait(mm, (pte_t *)pmd, ptl);
|
|
|
goto retry;
|